dotnetreport-ng 6.2.1 → 6.2.2-beta

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.
@@ -1,3202 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { BASE_URL_TOKEN } from './../dotnetreport-lib.di';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/platform-browser";
5
- import * as i2 from "@angular/common/http";
6
- import * as i3 from "@angular/router";
7
- export class DotnetreportComponent {
8
- sanitizer;
9
- cdref;
10
- baseUrl;
11
- http;
12
- route;
13
- baseServiceUrl;
14
- reportTemplates;
15
- queryParams;
16
- constructor(injector, sanitizer, cdref, baseUrl, http, route) {
17
- this.sanitizer = sanitizer;
18
- this.cdref = cdref;
19
- this.baseUrl = baseUrl;
20
- this.http = http;
21
- this.route = route;
22
- this.baseServiceUrl = this.baseUrl + '/api';
23
- this.reportTemplates = "";
24
- }
25
- ngOnInit() {
26
- let getUsersAndRolesUrl = this.baseServiceUrl + "/DotNetReportApi/GetUsersAndRoles";
27
- getUsersAndRolesUrl = getUsersAndRolesUrl.replace(/[?&]$/, "");
28
- this.queryParams = this.route.snapshot.queryParams;
29
- this.http.get(getUsersAndRolesUrl).subscribe((response) => {
30
- let result = response;
31
- let vm = new reportViewModel({
32
- runReportUrl: this.baseServiceUrl + '/DotNetReport/Report',
33
- reportWizard: $("#modal-reportbuilder"),
34
- execReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReport',
35
- runLinkReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportLink',
36
- getSchemaFromSql: this.baseServiceUrl + '/DotNetReportApi/GetSchemaFromSql',
37
- linkModal: $("#linkModal"),
38
- reportHeader: "report-header",
39
- fieldOptionsModal: $("#fieldOptionsModal"),
40
- lookupListUrl: this.baseServiceUrl + '/DotNetReportApi/GetLookupList',
41
- apiUrl: this.baseServiceUrl + '/DotNetReportApi/CallReportApi',
42
- runReportApiUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportApi',
43
- getUsersAndRolesUrl: this.baseServiceUrl + '/DotNetReportApi/GetUsersAndRoles',
44
- userSettings: result,
45
- dataFilters: result.dataFilters,
46
- runExportUrl: this.baseServiceUrl + '/DotNetReportApi/',
47
- getTimeZonesUrl: this.baseServiceUrl + '/DotNetReportApi/GetAllTimezones',
48
- printReportUrl: this.baseUrl + '/DotNetReport/ReportPrint',
49
- samePageOnRun: true,
50
- reportMode: this.queryParams["linkedreport"] == "true" ? "linked" : "",
51
- reportId: this.queryParams["reportId"] || 0,
52
- });
53
- vm.printReport = function () {
54
- var printWindow = window.open("");
55
- printWindow?.document.open();
56
- printWindow?.document.write('<html><head>' +
57
- '<link href="/Content/bootstrap.css" rel="stylesheet" />' +
58
- '<style type="text/css">a[href]:after {content: none !important;}</style>' +
59
- '</head><body>' + $('.report-inner').html() +
60
- '</body></html>');
61
- setTimeout(function () {
62
- printWindow?.print();
63
- printWindow?.close();
64
- }, 250);
65
- };
66
- vm.init(0, result.noAccount);
67
- this.renderKOTemplates();
68
- ko.applyBindings(vm, document.getElementById('dot-net-report'));
69
- this.bindWindowResize(vm);
70
- });
71
- }
72
- ngOnDestroy() {
73
- ko.cleanNode(document.getElementById('dot-net-report'));
74
- }
75
- init() {
76
- this.ngOnInit();
77
- }
78
- renderKOTemplates() {
79
- this.reportTemplates = this.sanitizer.bypassSecurityTrustHtml(`<!-- Dotnet Report HTML Templates -->
80
- <script type="text/html" id="report-filter">
81
- <div class="form-group" data-bind="attr: {id: 'filter-'+uiId }">
82
- <!-- ko if: !hasForeignKey-->
83
- <!-- ko if: ['DateTime','Date','Time'].indexOf(fieldType) != -1 -->
84
- <div style="display: flex; align-items: center; gap: 8px;">
85
- <!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 -->
86
- <input class="form-control" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" required />
87
- <!-- ko if: fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
88
- <input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
89
- <!-- /ko -->
90
- <!-- /ko -->
91
- </div>
92
- <!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
93
- From
94
- <div style="display: flex; align-items: center; gap: 8px;">
95
- <input required class="form-control from-date" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" />
96
- <!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
97
- <input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
98
- <!-- /ko -->
99
- </div>
100
- to
101
- <div style="display: flex; align-items: center; gap: 8px;">
102
- <input data-bind="datepicker: $parent.fmtValue2, datepickerOptions: {value: $parent.Value2, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" class="form-control to-date" required />
103
- <!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
104
- <input class="form-control" type="time" data-bind="value:$parent.Valuetime2" required>
105
- <!-- /ko -->
106
- </div>
107
- <!-- /ko -->
108
- <!-- ko if: ['range'].indexOf($parent.Operator()) != -1 -->
109
- <select data-bind="value: $parent.Value" class="form-select" required>
110
- <option value=""></option>
111
- <option>Today</option>
112
- <option>Today +</option>
113
- <option>Today -</option>
114
- <option>Yesterday</option>
115
- <option>This Week</option>
116
- <option>Last Week</option>
117
- <option>This Month</option>
118
- <option>Last Month</option>
119
- <option>This Year</option>
120
- <option>Last Year</option>
121
- <option>This Week To Date</option>
122
- <option>This Month To Date</option>
123
- <option>This Year To Date</option>
124
- <option>Last 30 Days</option>
125
- <!--<option>This Month Last Year</option>
126
- <option>Last Month Last Year</option>
127
- <option>This Quarter</option>
128
- <option>Last Quarter</option>
129
- <option>First Quarter</option>
130
- <option>Second Quarter</option>
131
- <option>Third Quarter</option>
132
- <option>Fourth Quarter</option>
133
- <option>Next 6 Months</option>
134
- <option>Last 6 Months</option>
135
- <option>2 Years ago</option>
136
- <option>3 Years ago</option>
137
- <option>4 Years ago</option>
138
- <option>5 Years ago</option>-->
139
- <optgroup label="Comparison Options">
140
- <option>>= Today</option>
141
- <option><= Today</option>
142
- <option>>= Today +</option>
143
- <option><= Today +</option>
144
- <option>>= Today -</option>
145
- <option><= Today -</option>
146
- </optgroup>
147
- </select>
148
- <div data-bind="if: $parent.Value().indexOf('Today +') >= 0 || $parent.Value().indexOf('Today -') >= 0" class="form-group pull-left" style="padding-top: 5px;">
149
- <input type="number" class="form-control input-sm pull-left" style="width: 80px;" data-bind="value: $parent.Value2" required /><span style="padding: 5px 5px;" class="pull-left"> days</span>
150
- </div>
151
- <!-- /ko -->
152
- <!-- /ko -->
153
- <!-- ko if: ['Int','Money','Float','Double'].indexOf(fieldType) != -1 -->
154
- <!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
155
- <input class="form-control" type="number" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'" required />
156
- <!-- /ko -->
157
- <!-- ko if: ['in', 'not in'].indexOf($parent.Operator()) != -1 -->
158
- <input class="form-control" type="text" data-bind="value: $parent.Value" required />
159
- <!-- /ko -->
160
- <!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
161
- From
162
- <input class="form-control" type="number" data-bind="value: $parent.Value" required />
163
- To
164
- <input class="form-control" type="number" data-bind="value: $parent.Value2" required />
165
- <!-- /ko -->
166
- <!-- /ko -->
167
- <!-- ko if: fieldType=='Boolean' && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
168
- <select required class="form-select" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'">
169
- <option value="1">Yes</option>
170
- <option value="0">No</option>
171
- </select>
172
- <!-- /ko -->
173
- <!-- ko if: ['Int','Money','Float','Double','Date','DateTime','Time','Boolean'].indexOf(fieldType) == -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
174
- <input class="form-control" type="text" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default',attr: {id: 'ctl-' + $element.closest('[data-parentprefix]').getAttribute('data-parentprefix') + '-' + uiId}" required />
175
- <!-- /ko -->
176
- <!-- /ko -->
177
- <!-- ko if: hasForeignKey && $parent.Operator() != 'all' -->
178
- <!-- ko if: hasForeignParentKey && $parent.showParentFilter() -->
179
- <select multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.ParentList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ParentIn"></select>
180
- <!-- /ko -->
181
- <!-- ko if: $parent.Operator()=='='-->
182
- <select required class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', value: $parent.Value, optionsCaption: 'Please Choose'"></select>
183
- <!-- /ko -->
184
- <!-- ko if: $parent.Operator()=='in' || $parent.Operator()=='not in'-->
185
- <select required multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ValueIn"></select>
186
- <!-- /ko -->
187
- <!-- /ko -->
188
- </div>
189
- </script>
190
-
191
- <script type="text/html" id="pager-template">
192
- <div class="pager-container d-flex align-items-center flex-wrap gap-2">
193
-
194
- <!-- Rows per page -->
195
- <div class="d-flex align-items-center gap-1 ms-1">
196
- <span class="text-muted small">Page size:</span>
197
- <select class="form-select form-select-sm w-auto"
198
- data-bind="options: pageSizeOptions, value: pageSize">
199
- </select>
200
- </div>
201
-
202
- <!-- Inner border block for page navigation controls -->
203
- <div class="d-flex align-items-center gap-1 ms-3">
204
- <a href="#" title="First" data-bind="click: first, enable: !isFirstPage()"
205
- class="btn btn-outline-secondary btn-sm pager-btn ms-1" aria-label="First Page">
206
- <i class="fa fa-angle-double-left"></i>
207
- </a>
208
-
209
- <a href="#" title="Previous" data-bind="click: previous, enable: !isFirstPage()"
210
- class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Previous Page">
211
- <i class="fa fa-angle-left"></i>
212
- </a>
213
-
214
- <div class="d-flex align-items-center gap-1">
215
- <span class="text-muted small">Page</span>
216
- <input type="number" min="1" pattern="[0-9]*"
217
- class="form-control form-control-sm text-center pager-input"
218
- style="width: 60px;"
219
- data-bind="value: currentPage, attr: { max: pages() }">
220
- <span class="text-muted small">of</span>
221
- <span class="text-muted small" data-bind="text: pages"></span>
222
- </div>
223
-
224
- <a href="#" title="Next" data-bind="click: next, enable: !isLastPage()"
225
- class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Next Page">
226
- <i class="fa fa-angle-right"></i>
227
- </a>
228
-
229
- <a href="#" title="Last" data-bind="click: last, enable: !isLastPage()"
230
- class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Last Page">
231
- <i class="fa fa-angle-double-right"></i>
232
- </a>
233
- </div>
234
- </div>
235
- </script>
236
-
237
-
238
-
239
- <script type="text/html" id="report-column-header">
240
- <!-- ko foreach: Columns -->
241
- <th data-bind="attr: { id: !IsPivotField ? fieldId : 'pivot--' + fieldName }, style: {'text-align': fieldAlign() ? fieldAlign() : (IsNumeric ? 'right' : 'left'), 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
242
-
243
- <div class="pull-left" data-bind="if: !$parent.IsDrillDown()" style="padding-right: 5px;">
244
- <div class="dropup">
245
- <a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
246
- <span class="fa fa-ellipsis-v sortable" title="Drag to reorder"></span>
247
- </a>
248
- <ul data-bind="visible: !IsPivotField" class="dropdown-menu" style="z-index: 1001;">
249
- <li class="dropdown-item small" data-bind="visible: !IsNumeric">
250
- <a href="#" data-bind="click: toggleOuterGroup">
251
- <span class="fa fa-clone"></span> Outer Group
252
- </a>
253
- </li>
254
- <li class="dropdown-item small">
255
- <a href="#" data-bind="click: setupFieldOptions">
256
- <span class="fa fa-gear"></span> Field Settings
257
- </a>
258
- </li>
259
- </ul>
260
- </div>
261
- </div>
262
- <div data-bind="style: {'width': fieldWidth}">
263
- <!-- ko if: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
264
- <span data-bind="text: fieldLabel() ? fieldLabel() : fieldName, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
265
- <!-- /ko -->
266
- <!-- ko ifnot: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
267
- <a href="" data-bind="click: function(){ if (!IsPivotField) { $parents[pagerIndex($parents)].changeSort(SqlField); } }, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}">
268
- <span data-bind="text: $parent.IsDrillDown() && fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName)"></span>
269
- <span data-bind="text: $parents[pagerIndex($parents)].pager.sortColumn() === SqlField ? ($parents[pagerIndex($parents)].pager.sortDescending() ? '&#9660;' : '&#9650;') : ''"></span>
270
- </a>
271
- <!-- /ko -->
272
- </div>
273
- </th>
274
- <!-- /ko -->
275
- </script>
276
-
277
- <script type="text/html" id="report-widget">
278
- <div style="text-align: center; width: 100%;font-size: 48px">
279
- <span data-bind="visible: Rows.length < 1" title="No data found">/</span>
280
-
281
- <div data-bind="if: Rows.length > 0">
282
- <div data-bind="with: $parent.rows[0].Items[0]">
283
- <span data-bind="html: formattedVal"></span>
284
-
285
- <!-- ko if: $parent.Rows.length > 1 ? ($parents[$parents.length-2].showPriorInKpi != undefined ? $parents[$parents.length-2].showPriorInKpi() : $parents[$parents.length-1].showPriorInKpi()) : false -->
286
- <span data-bind="style: {'color': $parent.calculateRate() > 0 ? 'green' : 'red', 'font-size': '24px'}">
287
- <span data-bind="html: $parent.calculateRate() + '%'"></span>
288
- </span>
289
-
290
- <div data-bind="style: {'font-size': '24px', 'color': 'gray'}, css: {'text-muted': true}">
291
- Prior Period: <span data-bind="html: $parent.Rows[1].Items[0].formattedVal"></span>
292
- </div>
293
- <!-- /ko -->
294
-
295
- </div>
296
- </div>
297
- </div>
298
-
299
- </script>
300
-
301
- <script type="text/html" id="report-column">
302
- <!-- ko foreach: Items -->
303
- <td data-bind="hidden: outerGroup, style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : (Column.IsNumeric ? 'right' : 'left')}">
304
- <div data-bind="style: {'width': fieldWidth }, css: { 'text-wrap': fieldWidth }">
305
- <!-- ko if: LinkTo-->
306
- <a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
307
- <!-- /ko-->
308
- <!-- ko ifnot: LinkTo-->
309
- <span data-bind="html: formattedVal"></span>
310
- <!-- /ko-->
311
- </div>
312
- </td>
313
- </script>
314
-
315
- <script type="text/html" id="report-pivot">
316
- <div class="table-responsive" data-bind="with: ReportData">
317
- <table class="table table-striped table-hover table-condensed">
318
- <thead style="position: sticky; top: -1px; z-index: 2;">
319
- <tr>
320
- <th></th>
321
- <!-- ko foreach: Rows -->
322
- <th>
323
- <span data-bind="text: Items[0].FormattedValue"></span>
324
- </th>
325
- <!-- /ko -->
326
- </tr>
327
- </thead>
328
- <tbody data-bind="foreach: Columns">
329
- <tr>
330
- <!-- ko if: $index() > 0 -->
331
- <td>
332
- <span data-bind="text: fieldLabel || ColumnName"></span>
333
- </td>
334
- <!-- ko foreach: $parent.Rows -->
335
- <td data-bind="style: {'background-color': $parent.backColor, 'color': $parent.fontColor, 'font-weight': $parent.fontBold() ? 'bold' : 'normal', 'text-align': $parent.fieldAlign ? $parent.fieldAlign : ($parent.IsNumeric ? 'right' : 'left') }">
336
- <span data-bind="text: Items[$parentContext.$index()].FormattedValue"></span>
337
- </td>
338
- <!-- /ko -->
339
- <!-- /ko -->
340
- </tr>
341
- </tbody>
342
- </table>
343
-
344
- </div>
345
-
346
- </script>
347
-
348
- <script type="text/html" id="report-table">
349
- <div class="table-responsive">
350
- <table class="table table-hover table-condensed" data-bind="attr: {class: 'table table-striped table-hover table-condensed ' + $parents[2].selectedStyle()}">
351
- <thead style="position: sticky; top: -1px; z-index: 2;" data-bind="if: !$parents[2].noHeaderRow()">
352
- <tr class="no-highlight" data-bind="sortableColumns: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight',selectedFields: $parents[2].SelectedFields }">
353
- <!-- ko if: $parentContext.$parentContext.$parent.canDrilldown() && !IsDrillDown() && !CanExpandOption() && (!$parents[2].hasPivotColumn() || ($parents[2].hasPivotColumn() && $parents[2].appSettings.useAltPivot)) -->
354
- <th style="width: 30px; border-left: 1px solid;" data-bind="style: {'background-color': Columns[0].headerBackColor}"></th>
355
- <!-- /ko -->
356
- <!-- ko template: 'report-column-header', data: $data -->
357
- <!-- /ko-->
358
- </tr>
359
- </thead>
360
- <tbody data-bind="attr: {id: 'report-table-body' + $parents[2].ReportID()}">
361
- <tr style="display: none;" data-bind="visible: Rows.length < 1">
362
- <td data-bind="attr:{colspan: Columns.length + 1}">
363
- No records found
364
- </td>
365
- </tr>
366
-
367
- <!-- ko if: !$parents[2].useRenderTable() -->
368
- <!-- ko foreach: $parent.rows -->
369
- <tr>
370
- <!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() && $parentContext.$parentContext.$parentContext.$parent.ReportType() != 'Single' -->
371
- <td style="width: 30px; vertical-align: middle;" data-bind="style: {'background-color': Items[0]._backColor ?? Items[0].backColor(), 'color': Items[0]._fontColor ?? Items[0].fontColor()}">
372
- <a href="#" data-bind="click: function(){ toggle(); }"><span class="fa" data-bind="css: {'fa-plus': !isExpanded(), 'fa-minus': isExpanded()}"></span></a>
373
- </td>
374
- <!-- /ko -->
375
- <!-- ko template: 'report-column', data: $data -->
376
- <!-- /ko-->
377
- </tr>
378
- <!-- ko if: isExpanded -->
379
- <tr>
380
- <td style="width: 30px;"></td>
381
- <td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
382
- <div data-bind="visible: !DrillDownData()">
383
- <div class="report-spinner"></div>
384
- </div>
385
- <!-- ko if: DrillDownData -->
386
- <table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData">
387
- <thead>
388
- <tr class="no-highlight">
389
- <!-- ko template: 'report-column-header', data: $data -->
390
- <!-- /ko-->
391
- </tr>
392
- </thead>
393
- <tbody>
394
- <tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
395
- <td data-bind="attr: {colspan: Columns.length}">
396
- No records found
397
- </td>
398
- </tr>
399
- <!-- ko foreach: Rows -->
400
- <tr>
401
- <!-- ko template: 'report-column', data: $data -->
402
- <!-- /ko-->
403
- </tr>
404
- <!-- /ko -->
405
- </tbody>
406
- </table>
407
- <div class="col-xs-12 col-centered" data-bind="with: pager">
408
- <div class="form-inline small text-muted">
409
- <div class="pull-left total-records" data-bind="visible: pages()">
410
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span>
411
- </div>
412
- <div class="pull-left total-records">
413
- &nbsp;
414
- <a href="#" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></a>
415
- &nbsp;
416
- <a href="#" title="View Code" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
417
- <span class="fa fa-code"></span>
418
- </a>
419
- </div>
420
- <div class="form-group pull-right" data-bind="visible: pages()">
421
- <div data-bind="template: 'pager-template', data: $data"></div>
422
- </div>
423
- </div>
424
- </div>
425
- <!-- /ko -->
426
- </td>
427
- </tr>
428
- <!-- /ko -->
429
- <!-- ko if: subReportsRan().length > 0 -->
430
- <tr>
431
- <td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
432
- <div data-bind="foreach: subReportsRan">
433
- <div class="">
434
- <div class="" style="padding-bottom: 20px;" >
435
- <h2 class="pull-left" data-bind="text: ReportName"></h2>
436
-
437
- <div class="clearfix"></div>
438
- <div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
439
- <p data-bind="html: ReportDescription, visible: ReportDescription"></p>
440
-
441
- <div data-bind="with: ReportResult" class="small">
442
- <div data-bind="visible: !ReportData()">
443
- <div class="report-spinner"></div>
444
- </div>
445
- <div data-bind="template: 'report-template', data: $data"></div>
446
- </div>
447
- </div>
448
- <div class="form-inline">
449
- <div class="small" data-bind="with: pager">
450
- <div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
451
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
452
- </div>
453
- <div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
454
- <div data-bind="template: 'pager-template', data: $data"></div>
455
- </div>
456
- </div>
457
- </div>
458
- </div>
459
-
460
- </div>
461
- </div>
462
- </td>
463
- </tr>
464
- <!-- /ko -->
465
- <!-- /ko -->
466
- <!-- /ko-->
467
- </tbody>
468
- <!-- ko if: $parentContext.$parent.SubTotals().length == 1 && $parentContext.$parentContext.$parent.OuterGroupColumns().length == 0 -->
469
- <tfoot data-bind="foreach: $parentContext.$parent.SubTotals">
470
- <tr class="sub-total">
471
- <!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() -->
472
- <td></td>
473
- <!-- /ko -->
474
- <!-- ko foreach: Items -->
475
- <!-- ko if: Value != 'NA' && Value != 'NaN' && !outerGroup() -->
476
- <td data-bind="style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : 'right'}">
477
- <div data-bind="style: {'width': fieldWidth }">
478
- <span data-bind="html: formattedVal"></span>
479
- </div>
480
- </td>
481
- <!-- /ko -->
482
- <!-- /ko -->
483
- </tr>
484
- </tfoot>
485
- <!-- /ko -->
486
- </table>
487
- </div>
488
- </script>
489
-
490
- <script type="text/html" id="report-render">
491
- <div data-bind="with: ReportData">
492
- <div data-bind="foreach: Rows">
493
- <div data-bind="html: renderedHtml, css: { 'card-view': $parents[$parents.length-1].cardView }"></div>
494
-
495
- <div data-bind="foreach: subReportsRan">
496
- <div class="">
497
- <div class="" style="padding-bottom: 20px;" >
498
- <h2 class="pull-left" data-bind="text: ReportName"></h2>
499
-
500
- <div class="clearfix"></div>
501
- <div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
502
- <p data-bind="html: ReportDescription, visible: ReportDescription"></p>
503
-
504
- <div data-bind="with: ReportResult" class="small">
505
- <div data-bind="visible: !ReportData()">
506
- <div class="report-spinner"></div>
507
- </div>
508
- <div data-bind="template: 'report-template', data: $data"></div>
509
- </div>
510
- </div>
511
- <div class="form-inline">
512
- <div class="small" data-bind="with: pager">
513
- <div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
514
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
515
- </div>
516
- <div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
517
- <div data-bind="template: 'pager-template', data: $data"></div>
518
- </div>
519
- </div>
520
- </div>
521
- </div>
522
-
523
- </div>
524
- </div>
525
- </div>
526
- </div>
527
- <div class="clearfix"></div>
528
- </script>
529
-
530
-
531
- <script type="text/html" id="report-template">
532
- <div class="report-chart" data-bind="attr: {id: 'chart_div_' + $parent.ReportID()}, visible: $parent.isChart"></div>
533
- <!-- ko if: $parent.ReportType() == 'Pivot' -->
534
- <div data-bind="template: {name: 'report-pivot', data: $data }"></div>
535
- <!-- /ko -->
536
-
537
- <!-- ko if: $parent.ReportType() == 'Html' -->
538
- <div data-bind="template: {name: 'report-render', data: $data }"></div>
539
- <!-- /ko -->
540
-
541
- <!-- ko if: $parent.ReportType() != 'Pivot' && $parent.ReportType() != 'Html' && (!$parent.isChart() || $parent.ShowDataWithGraph()) -->
542
- <div class="pull-right" data-bind="if: $parent.OuterGroupColumns().length > 0">
543
- <a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
544
- Manage Groups <span class="fa fa-ellipsis-v"></span>
545
- </a>
546
- <ul class="dropdown-menu" style="z-index: 1001;" data-bind="foreach: $parent.OuterGroupColumns">
547
- <li class="dropdown-item small">
548
- <a href="#" data-bind="click: remove" title="Remove from Group">
549
- <span class="fa fa-close"></span> <span data-bind="text: fieldName"></span>
550
- </a>
551
- </li>
552
- </ul>
553
- </div>
554
- <div class="clear-fix"></div>
555
-
556
- <div data-bind="foreach: outerGroupData">
557
- <!-- ko if: rows.length > 0 || ($parent.outerGroupData && $parent.outerGroupData().length == 1) -->
558
- <h6 data-bind="html: display"></h6>
559
- <div class="" style="padding-top: 5px;"></div>
560
-
561
- <!-- ko if: $parents[1].ReportType() != 'Single'-->
562
- <div data-bind="template: {name: 'report-table', data: $parent.ReportData }"></div>
563
- <!-- /ko -->
564
- <!-- ko if: $parents[1].ReportType() == 'Single'-->
565
- <div data-bind="template: {name: 'report-widget', data: $parent.ReportData }"></div>
566
- <!-- /ko -->
567
- <!-- /ko -->
568
- </div>
569
- <!-- /ko -->
570
- </script>
571
- <script type="text/html" id="admin-mode-template">
572
- <div class="row">
573
- <div class="d-flex justify-content-end align-items-center" style="gap: 10px;">
574
- <div data-bind="visible: adminMode">
575
- <div class="alert alert-info d-inline-block" style="font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;">
576
- <i class="fa fa-user-circle"></i> You can manage Reports/Dashboards for all users
577
- </div>
578
- </div>
579
- <div class="d-flex align-items-center">
580
- <div class="bubble-badge">
581
- Admin Mode
582
- <div class="form-check form-switch ms-2">
583
- <input class="form-check-input" type="checkbox" data-bind="checked: adminMode">
584
- </div>
585
- </div>
586
- </div>
587
- </div>
588
- </div>
589
- </script>
590
- <script type="text/html" id="manage-access-template">
591
- <h5><span class="fa fa-key"></span>Manage Access</h5>
592
- <div class="panel panel-default panel-body" style="margin-left: 20px;">
593
-
594
- <div class="form-group row">
595
- <label class="col-md-3 col-sm-3 control-label">Client Id to Restrict Access</label>
596
- <div class="col-md-3 col-sm-3">
597
- <input class="form-control text-box single-line" type="text" data-bind="value: clientId">
598
- </div>
599
- <div class="col-md-1 col-sm-1">
600
- <span data-bs-toggle="tooltip" data-placement="right" class="fa fa-question-circle helptip" title="Leave blank to give all clients access (Global Reports)"></span>
601
- </div>
602
- </div>
603
- <div class="alert alert-info">
604
- <span class="fa fa-lightbulb-o fa-2x"></span>&nbsp;User level rights override Role level rights. No selection for a rule implies report is available to all.
605
- </div>
606
-
607
- <div class="row small">
608
- <div class="col-md-6">
609
- <i class="toggle-icon fa" data-bind="click: toggleManageUsers,css: { 'fa-chevron-down': showManageUsers(), 'fa-chevron-right': !showManageUsers() }"></i> <b>Manage by User</b> (allow edit)
610
- <div class="row container-fluid" data-bind="visible: showManageUsers">
611
- <!-- ko if: groupedUsers().length > 0 -->
612
- <!-- ko foreach: groupedUsers -->
613
- <div class="col-md-12">
614
- <div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
615
- <i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
616
- <strong data-bind="text: category"></strong>
617
- </div>
618
- <div class="row container-fluid" data-bind="visible: show">
619
- <!-- ko foreach: users -->
620
- <div class="pull-left">
621
- <div class="checkbox">
622
- <label class="label label-info">
623
- <input type="checkbox" data-bind="checked: selected"> &nbsp; <span data-bind="text: text"></span>&nbsp; </label>
624
- </div>
625
- </div>
626
- <!-- /ko -->
627
- </div>
628
- </div>
629
- <!-- /ko -->
630
- <!-- /ko -->
631
- <!-- ko if: groupedUsers().length == 0 && users.length > 0 -->
632
- <!-- ko foreach: users -->
633
- <div class="pull-left">
634
- <div class="checkbox">
635
- <label class="label label-info">
636
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
637
- </label>
638
- </div>
639
- </div>
640
- <!-- /ko -->
641
- <!-- /ko -->
642
- <div data-bind="if: groupedUsers().length == 0 && users.length == 0">
643
- Users list not populated or not applicable
644
- </div>
645
- </div>
646
- <br />
647
- <i class="toggle-icon fa" data-bind="click: toggleViewUsers,css: { 'fa-chevron-down': showViewUsers(), 'fa-chevron-right': !showViewUsers() }"></i> <b>View only by User</b> (no edit/delete)
648
- <div class="row container-fluid" data-bind="visible: showViewUsers">
649
- <!-- ko if: groupedViewOnlyUsers().length > 0 -->
650
- <!-- ko foreach: groupedViewOnlyUsers -->
651
- <div class="col-md-12">
652
- <div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
653
- <i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
654
- <strong data-bind="text: category"></strong>
655
- </div>
656
- <div class="row container-fluid" data-bind="visible: show">
657
- <!-- ko foreach: viewOnlyUsers -->
658
- <div class="pull-left">
659
- <div class="checkbox">
660
- <label class="label label-info">
661
- <input type="checkbox" data-bind="checked: selected"> &nbsp; <span data-bind="text: text"></span>&nbsp; </label>
662
- </div>
663
- </div>
664
- <!-- /ko -->
665
- </div>
666
- </div>
667
- <!-- /ko -->
668
- <!-- /ko -->
669
- <!-- ko if: groupedViewOnlyUsers().length == 0 && viewOnlyUsers.length > 0 -->
670
- <!-- ko foreach: viewOnlyUsers -->
671
- <div class="pull-left">
672
- <div class="checkbox">
673
- <label class="label label-info">
674
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
675
- </label>
676
- </div>
677
- </div>
678
- <!-- /ko -->
679
- <!-- /ko -->
680
- <div data-bind="if: groupedViewOnlyUsers().length == 0 && users.length == 0">
681
- Users list not populated or not applicable
682
- </div>
683
- </div>
684
- <br />
685
- <div data-bind="ifnot: isDashboard">
686
- <i class="toggle-icon fa" data-bind="click: toggleDeleteUsers,css: { 'fa-chevron-down': showDeleteUsers(), 'fa-chevron-right': !showDeleteUsers() }"></i><b>Delete by User</b> (allow delete)
687
- <div class="row container-fluid" data-bind="visible: showDeleteUsers">
688
- <!-- ko if: groupedDeleteOnlyUsers().length > 0 -->
689
- <!-- ko foreach: groupedDeleteOnlyUsers -->
690
- <div class="col-md-12">
691
- <div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
692
- <i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
693
- <strong data-bind="text: category"></strong>
694
- </div>
695
- <div class="row container-fluid" data-bind="visible: show">
696
- <!-- ko foreach: deleteOnlyUsers -->
697
- <div class="pull-left">
698
- <div class="checkbox">
699
- <label class="label label-info">
700
- <input type="checkbox" data-bind="checked: selected"> &nbsp; <span data-bind="text: text"></span>&nbsp; </label>
701
- </div>
702
- </div>
703
- <!-- /ko -->
704
- </div>
705
- </div>
706
- <!-- /ko -->
707
- <!-- /ko -->
708
- <!-- ko if: groupedDeleteOnlyUsers().length == 0 && deleteOnlyUsers.length > 0 -->
709
- <!-- ko foreach: deleteOnlyUsers -->
710
- <div class="pull-left">
711
- <div class="checkbox">
712
- <label class="label label-info">
713
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
714
- </label>
715
- </div>
716
- </div>
717
- <!-- /ko -->
718
- <!-- /ko -->
719
- <div data-bind="if: groupedDeleteOnlyUsers().length == 0 && users.length == 0">
720
- Users list not populated or not applicable
721
- </div>
722
- </div>
723
- <br />
724
- </div>
725
- </div>
726
- <div class="col-md-6">
727
- <i class="toggle-icon fa" data-bind="click: toggleManageRoles,css: { 'fa-chevron-down': showManageRoles(), 'fa-chevron-right': !showManageRoles() }"></i><b>Manage by User Role</b> (allow edit)
728
- <div class="row container-fluid" data-bind="visible: showManageRoles">
729
- <!-- ko foreach: userRoles -->
730
- <div class="pull-left">
731
- <div class="checkbox">
732
- <label class="label label-info">
733
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
734
- </label>
735
- </div>
736
- </div>
737
- <!-- /ko -->
738
- <div data-bind="if: userRoles.length == 0">
739
- User Roles list not populated or not applicable
740
- </div>
741
- </div>
742
- <br />
743
- <i class="toggle-icon fa" data-bind="click: toggleViewRoles,css: { 'fa-chevron-down': showViewRoles(), 'fa-chevron-right': !showViewRoles() }"></i><b>View only by User Role</b> (no edit/delete)
744
- <div class="row container-fluid" data-bind="visible: showViewRoles">
745
- <!-- ko foreach: viewOnlyUserRoles -->
746
- <div class="pull-left">
747
- <div class="checkbox">
748
- <label class="label label-info">
749
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
750
- </label>
751
- </div>
752
- </div>
753
- <!-- /ko -->
754
- <div data-bind="if: userRoles.length == 0">
755
- User Roles list not populated or not applicable
756
- </div>
757
- </div>
758
- <div data-bind="ifnot: isDashboard">
759
- <i class="toggle-icon fa" data-bind="click: toggleDeleteRoles,css: { 'fa-chevron-down': showDeleteRoles(), 'fa-chevron-right': !showDeleteRoles() }"></i><b>Delete by User Role</b> (allow delete)
760
- <div class="row container-fluid" data-bind="visible: showDeleteRoles">
761
- <!-- ko foreach: deleteOnlyUserRoles -->
762
- <div class="pull-left">
763
- <div class="checkbox">
764
- <label class="label label-info">
765
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
766
- </label>
767
- </div>
768
- </div>
769
- <!-- /ko -->
770
- <div data-bind="if: userRoles.length == 0">
771
- User Roles list not populated or not applicable
772
- </div>
773
- </div>
774
- </div>
775
- </div>
776
- </div>
777
- </div>
778
- </script>
779
- <script type="text/html" id="filter-group">
780
- <div class="query-builder form-inline" data-bind="foreach: FilterGroups">
781
- <div class="rules-group-container">
782
- <div class="rules-group-header" data-bind="attr: {parentdivid: generateUniqueId()}">
783
- <div data-bind="visible: !isRoot">
784
- <div class="pull-left">
785
- <div class="btn-group btn-group-toggle btn-group-sm" data-bs-toggle="buttons" role="group">
786
- <label class="btn btn-light active" style="margin-right: 0px;">
787
- <input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="And" /> And
788
- </label>
789
- <label class="btn btn-light active">
790
- <input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="Or" /> Or
791
- </label>
792
- </div>
793
- </div>
794
- <div class="pull-right">
795
- <button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilterGroup, visible: !isRoot">Remove Group</button>&nbsp;
796
- </div>
797
- </div>
798
- <div data-bind="visible: isRoot">
799
- <div class="pull-left padded-div">
800
- <label> &nbsp;Filter Conditions</label>
801
- </div>
802
- </div>
803
- <div class="clearfix"></div>
804
- </div>
805
-
806
- <div class="rules-group-body" data-bind="template: {name: 'filter-inner'}"></div>
807
- </div>
808
- </div>
809
- </script>
810
- <script type="text/html" id="fly-filter-template">
811
- <div class="card" data-bind="visible: FlyFilters().length>0 || DontExecuteOnRun">
812
- <div class="card-header">
813
- <a data-bs-toggle="collapse" data-bind="attr: {'data-bs-target': '#filter-panel-' + ReportID() }" href="#">
814
- <i class="fa fa-filter"></i> Choose Filters
815
- </a>
816
- </div>
817
- <div data-bind="attr: {id: 'filter-panel-' + ReportID() }, css: {collpased: !DontExecuteOnRun(), collapse: !DontExecuteOnRun()}" class="card-body">
818
- <div>
819
- <!-- ko foreach: FlyFilters -->
820
- <div class="row">
821
- <div class="col-sm-5 col-xs-4">
822
- <div data-bind="with: Field" class="checkbox">
823
- <div class="checkbox">
824
- <label>
825
- <input type="checkbox" title="Apply this filter" data-bind="checked: $parent.Apply, disabled: forced" /> <span data-bind="text: selectedFilterName"></span>
826
- </label>
827
- </div>
828
- </div>
829
- </div>
830
- <div data-bind="with: Field" class="col-sm-2 col-xs-3">
831
- <div class="form-group" data-bind="if: $parent.Apply">
832
- <select class="form-select" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
833
- </div>
834
- </div>
835
- <div data-bind="with: Field" class="col-sm-5 col-xs-5">
836
- <div data-bind="if: $parent.Apply" data-parentprefix="F" >
837
- <div data-bind="template: 'report-filter', data: $data"></div>
838
- </div>
839
- </div>
840
- </div>
841
- <!-- /ko -->
842
- <button class="btn btn-primary" data-bind="click: ExecuteReport">Run</button>
843
- </div>
844
- </div>
845
- </div>
846
- </script>
847
-
848
- <script type="text/html" id="filter-inner">
849
- <div class="rules-list">
850
- <div class="rule-container" data-bind="visible: Filters().length>0">
851
- <table class="table table-striped table-hover table-borderless">
852
- <thead>
853
- <tr>
854
- <th class="row">
855
- <div class="col-md-1"></div>
856
- <div class="col-md-4">Field</div>
857
- <div class="col-md-2"></div>
858
- <div class="col-md-4">Filter</div>
859
- <div class="col-md-1"></div>
860
- </th>
861
- </tr>
862
- </thead>
863
- <tbody data-bind="foreach: Filters">
864
- <tr class="rule-container">
865
- <td class="row">
866
- <div class="col-md-1">
867
- <select data-bind="value: AndOr, visible: $index()>0" class="form-select">
868
- <option>And</option>
869
- <option>Or</option>
870
- </select>
871
- </div>
872
- <div class="col-md-3">
873
- <div class="form-group">
874
- <select class="form-select" style="width: 100%;" data-bind="
875
- options: $parents[$parents.length-2].selectedFieldsCanFilter != undefined
876
- ? $parents[$parents.length-2].selectedFieldsCanFilter
877
- : $parents[$parents.length-1].selectedFieldsCanFilter,
878
- optionsText: 'selectedFieldName',
879
- optionsCaption: 'Please Choose',
880
- value: Field,
881
- attr: {required: Field()==null?'required':false},
882
- disable: Field() && Field().forced"></select>
883
- </div>
884
- </div>
885
- <div class="col-md-2">
886
- <div data-bind="with: Field">
887
- <div class="form-group">
888
- <select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
889
- </div>
890
- </div>
891
- </div>
892
- <div class="col-md-5">
893
- <div data-bind="with: Field" data-parentprefix="M">
894
- <div data-bind="template: 'report-filter', data: $data"></div>
895
- </div>
896
- <!-- ko if: Field() && Field().fieldType == 'DateTime' && Operator() == 'range' && $index()==0 -->
897
- <!-- ko if: $parents[$parents.length-2].canAddSeries != undefined && $parents[$parents.length-2].canAddSeries() -->
898
- <button class="btn btn-sm btn-secondary" data-bind="click: $parents[$parents.length-2].AddSeries.bind($data)">Add Comparison</button>
899
- <!--/ko -->
900
- <!-- ko if: $parents[$parents.length-2].canAddSeries == undefined && $parentContext.$parent.canAddSeries != undefined && $parentContext.$parent.canAddSeries()-->
901
- <button class="btn btn-sm btn-secondary" data-bind="click: $parentContext.$parent.AddSeries.bind($data)">Add Comparison</button>
902
- <!--/ko -->
903
- <!--/ko -->
904
- <span data-bind="visible: Field() && Field().forced" class="badge bg-info">Required Filter</span>
905
- </div>
906
- <div class="col-md-1">
907
- <div style="display: flex; align-items: center;">
908
- <div class="form-group" style="flex-grow: 1;">
909
- <button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilter, hidden: Field() && Field().forced" title="Remove">
910
- <i class="fa fa-trash"></i>
911
- </button>
912
- </div>
913
- <div class="form-group" style="flex-grow: 1;" data-bind="with: Field, hidden: document.querySelector('#filter-panel.card-body.collapse')">
914
- <span class="btn btn-sm" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {'btn-success': filterOnFly()==true, 'btn-secondary': filterOnFly()==false}">
915
- <span class="fa fa-filter" aria-hidden="true" title="Filter on Report"></span>
916
- </span>
917
- </div>
918
- </div>
919
-
920
- </div>
921
- </td>
922
- </tr>
923
- <!-- ko foreach: compareTo -->
924
- <tr>
925
- <td class="row">
926
- <div class="col-md-6">&nbsp;</div>
927
- <div class="col-md-2">
928
- <span style="text-align: right"><button class="btn btn-sm" data-bind="click: $parents[2].RemoveSeries"><span class="fa fa-trash-o"></span></button></span>
929
- <span class="muted">Compare to</span>
930
- </div>
931
- <div class="col-md-4">
932
- <select class="form-select" data-bind="options: Range, value: Value" required></select>
933
- </div>
934
- </td>
935
- </tr>
936
- <!-- /ko -->
937
- </tbody>
938
- </table>
939
- </div>
940
-
941
- <div class="rule-container">
942
- <div data-bind="template: {name: 'filter-group'}"></div>
943
- <div>
944
- <button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilter">Add Filter</button>
945
- <button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilterGroup">Add Filter Group</button>
946
- </div>
947
- </div>
948
- </div>
949
-
950
- </script>
951
-
952
- <script type="text/html" id="filter-parameters">
953
- <div class="table-responsive">
954
- <span data-bind="hidden: showParameters">No filters available to choose</span>
955
- <table class="table table-striped table-hover table-borderless" data-bind="visible: showParameters">
956
- <thead>
957
- <tr>
958
- <th style="width: 30%">Filter</th>
959
- <th style="width: 20%"></th>
960
- <th style="width: 30%">Value</th>
961
- <th></th>
962
- </tr>
963
- </thead>
964
- <tbody data-bind="foreach: Parameters">
965
- <tr data-bind="ifnot: Hidden">
966
- <td data-bind="text: DisplayName">
967
- </td>
968
- <td>
969
- <div class="form-group">
970
- <select class="form-select" style="width: 100%;" data-bind="options: operators, value: Operator" required></select>
971
- </div>
972
- </td>
973
- <td data-bind="with: Field" data-parentprefix="P">
974
- <div data-bind="template: 'report-filter', data: $data"></div>
975
- </td>
976
- <td></td>
977
- </tr>
978
-
979
- </tbody>
980
- </table>
981
- </div>
982
- </script>
983
-
984
- <script type="text/html" id="report-schedule">
985
- <div data-bind="with: scheduleBuilder" id="schedule-builder-div">
986
- <div class="form-check">
987
- <input class="form-check-input" type="checkbox" data-bind="checked: hasSchedule" id="scheduleReportCheckbox">
988
- <label class="form-check-label" for="scheduleReportCheckbox">
989
- Set Schedule to send by Email
990
- </label>
991
- </div>
992
- <div data-bind="if: hasSchedule">
993
- <div class="d-flex align-items-center">
994
- <div class="me-3 d-flex align-items-center">
995
- <span data-bind="text: selectedOption() != 'once' ? 'Every ' : ''"></span>&nbsp;
996
- <select class="form-select" required data-bind="options: options, value: selectedOption" style="min-width: 80px;"></select>
997
- </div>
998
- <div data-bind="if: selectedOption() == 'once'" class="me-3 d-flex align-items-center">
999
- &nbsp;on&nbsp;<input data-bind="datepicker: selectedDate, datepickerOptions: {value: selectedDate}" class="form-control" required />
1000
- </div>
1001
- <div class="d-flex align-items-center">
1002
- <div data-bind="if: showDays" class="d-flex align-items-center">
1003
- &nbsp;on&nbsp;
1004
- <select multiple class="form-select ms-2" required data-bind="select2: { placeholder: 'Choose Days', allowClear: true }, options: days, selectedOptions: selectedDays"></select>
1005
- </div>
1006
- <div data-bind="if: showDates" class="d-flex align-items-center">
1007
- &nbsp;on&nbsp;
1008
- <select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Dates', allowClear: true }, options: dates, selectedOptions: selectedDates"></select>
1009
- </div>
1010
- <div data-bind="if: showMonths" class="d-flex align-items-center">
1011
- &nbsp;on&nbsp;
1012
- <select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Months', allowClear: true }, options: months, selectedOptions: selectedMonths"></select>
1013
- </div>
1014
- <div data-bind="if: showAtTime" class="d-flex align-items-center ms-3">
1015
- &nbsp;at&nbsp;
1016
- <select class="form-select me-2" style="min-width: 60px;" data-bind="options: hours, value: selectedHour"></select>
1017
- <select class="form-select me-2" style="min-width: 60px;" data-bind="options: minutes, value: selectedMinute"></select>
1018
- <select class="form-select" style="min-width: 80px;" data-bind="value: selectedAmPm">
1019
- <option>AM</option>
1020
- <option>PM</option>
1021
- </select>
1022
- </div>
1023
- </div>
1024
- </div>
1025
-
1026
- <div class="alert alert-info">
1027
- Report will be run and emailed <span data-bind="text: selectedOption() != 'once' ? 'every' : ''"></span> <span data-bind="text: selectedOption"></span>
1028
- <span data-bind="if: selectedOption() == 'once'">
1029
- on <span class="error" data-bind="visible: !selectedDate()">Please pick a Date</span> <span data-bind="text: selectedDate"></span>
1030
- </span>
1031
- <span data-bind="if: showDays">
1032
- on <span class="error" data-bind="visible: selectedDays().length == 0">Please pick Day(s)</span> <span data-bind="text: selectedDays"></span>
1033
- </span>
1034
- <span data-bind="if: showDates">
1035
- on <span class="error" data-bind="visible: selectedDates().length == 0">Please pick Date(s)</span>
1036
- <span data-bind="foreach: selectedDates"><span data-bind="visible: $index()>0">, </span><span data-bind="text: $data == 1 ? '1st': ($data == 2 ? '2nd' : ($data == 3 ? '3rd' : ($data == 31 ? '31st' : $data+'th')))"></span></span>
1037
- </span>
1038
- <span data-bind="if: showMonths">
1039
- of <span class="error" data-bind="visible: selectedMonths().length == 0">Please pick Month(s)</span> <span data-bind="text: selectedMonths"></span>
1040
- </span>
1041
- <span data-bind="if: showAtTime">
1042
- at <span data-bind="text: selectedHour"></span>:<span data-bind="text: selectedMinute"></span> <span data-bind="text: selectedAmPm"></span>
1043
- </span>
1044
- </div>
1045
- <div class="mb-3">
1046
- <div class="row g-3">
1047
- <label class="col-sm-3 col-form-label">Email to</label>
1048
- <div class="col-sm-6">
1049
- <input type="text" class="form-control" data-bind="value: emailTo" placeholder="Enter Email Addresses separated by comma to send the Report to" required />
1050
- </div>
1051
- <label class="col-sm-1 col-form-label">Format</label>
1052
- <div class="col-sm-2">
1053
- <select class="form-select" data-bind="value: format,event: { change: onFormatChange }">
1054
- <option value="EXCEL">Excel</option>
1055
- <option data-bind="visible: $parent.canDrilldown && $parent.canDrilldown()" value="EXCEL-SUB">Excel (Expanded)</option>
1056
- <option value="CSV">CSV</option>
1057
- <option value="PDF">PDF</option>
1058
- <option value="WORD">Word</option>
1059
- <option value="LINK">Link</option>
1060
- </select>
1061
- </div>
1062
- </div>
1063
- </div>
1064
- <div class="mb-3">
1065
- <div class="row g-3">
1066
- <label class="col-sm-3 col-form-label">Pick Time Zone</label>
1067
- <div class="col-sm-9">
1068
- <select class="form-select" data-bind="options: timezonOption,
1069
- optionsText: 'displayName',
1070
- optionsValue: 'timeZoneId',
1071
- value: selectedTimezone,
1072
- select2: {dropdownParent: $('#schedule-builder-div'), allowClear: true, placeholder: 'Set a time zone to send report'}">
1073
- </select>
1074
- </div>
1075
- </div>
1076
- </div>
1077
- <div class="mb-3">
1078
- <div class="row g-3">
1079
- <div class="col-sm-3">
1080
- <div class="form-check" title="Set a date to start sending scheduled report">
1081
- <input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleStart" id="scheduleStartCheckbox">
1082
- <label class="form-check-label" for="scheduleStartCheckbox">
1083
- Schedule Start Date
1084
- </label>
1085
- </div>
1086
- </div>
1087
- <div class="col-sm-4" data-bind="if: hasScheduleStart">
1088
- <input type="text" class="form-control" data-bind="datepicker: scheduleStart, datepickerOptions: {value: scheduleStart}" title="Scheduled Report will not be sent before this date" required />
1089
- </div>
1090
- </div>
1091
- </div>
1092
- <div class="mb-3">
1093
- <div class="row g-3">
1094
- <div class="col-sm-3">
1095
- <div class="form-check" title="Set a date to stop sending scheduled report">
1096
- <input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleEnd" id="scheduleEndCheckbox">
1097
- <label class="form-check-label" for="scheduleEndCheckbox">
1098
- Schedule End Date
1099
- </label>
1100
- </div>
1101
- </div>
1102
- <div class="col-sm-4" data-bind="if: hasScheduleEnd">
1103
- <input type="text" class="form-control" data-bind="datepicker: scheduleEnd, datepickerOptions: {value: scheduleEnd}" title="Scheduled Report will not be sent after this date" required />
1104
- </div>
1105
- </div>
1106
- </div>
1107
- </div>
1108
- </div>
1109
-
1110
-
1111
- </script>
1112
-
1113
- <script type="text/html" id="report-field-options">
1114
- <div class="modal-dialog" style="max-width: 750px;">
1115
- <div class="modal-content" data-bind="with: editFieldOptions">
1116
- <div class="modal-header">
1117
- <h5 class="modal-title"><span data-bind="text: fieldName"></span> - Setup Additional Field Options</h5>
1118
- </div>
1119
- <div class="modal-body needs-validation">
1120
- <div class="card card-body">
1121
- <b>Column Format Settings</b>
1122
- <div class="form-group row">
1123
- <label class="col-sm-5 col-md-5 control-label">Pick Data Format</label>
1124
- <div class="col-sm-7 col-md-7">
1125
- <select class="form-select" data-bind="options: ['Days', 'Hours', 'Minutes', 'Seconds'].indexOf(fieldFormat()) >= 0 ? ['Days', 'Hours', 'Minutes', 'Seconds'] : $parents[1].fieldFormatTypes, value: fieldFormat"></select>
1126
- </div>
1127
- </div>
1128
- <div class="form-group row" data-bind="visible: $parents[1].decimalFormatTypes.indexOf($data.fieldFormat())>=0">
1129
- <label class="col-sm-5 col-md-5 control-label">Pick Decimal Places</label>
1130
- <div class="col-sm-7 col-md-7">
1131
- <input type="number" class="form-control" data-bind="value: decimalPlaces" placeholder="" />
1132
- </div>
1133
- </div>
1134
- <div class="form-group row" data-bind="visible: fieldFormat()=='Currency'">
1135
- <label class="col-sm-5 col-md-5 control-label">Pick Currency Format</label>
1136
- <div class="col-sm-7 col-md-7">
1137
- <select class="form-select" required data-bind="options: $parents[1].currencyFormats, optionsText: 'display',optionsValue: 'value', value: currencyFormat"></select>
1138
- </div>
1139
- </div>
1140
- <div class="form-group row" data-bind="visible: fieldFormat()=='Date'">
1141
- <label class="col-sm-5 col-md-5 control-label">Pick Date Format</label>
1142
- <div class="col-sm-7 col-md-7">
1143
- <select class="form-select" data-bind="options: $parents[1].dateFormats, value: dateFormat"></select>
1144
- </div>
1145
- </div>
1146
- <div class="form-group row" data-bind="visible:selectedAggregate()=='Pivot' && fieldFormat()=='Date'">
1147
- <label class="col-sm-5 col-md-5 control-label">Pivot Drilldown Date Format</label>
1148
- <div class="col-sm-7 col-md-7">
1149
- <select class="form-select" data-bind="options: ['', 'Day', 'Month', 'Year', 'Month/Year'], value: drillDataFormat"></select>
1150
- </div>
1151
- </div>
1152
-
1153
- <div class="form-group row" data-bind="visible: fieldFormat()=='Date' && dateFormat()==='Custom'">
1154
- <label class="col-sm-5 col-md-5 control-label">Enter Custom Date Format</label>
1155
- <div class="col-sm-7 col-md-7">
1156
- <input type="text" class="form-control" data-bind="value: customDateFormat" placeholder="dd/mm/yyyy" />
1157
- </div>
1158
- </div>
1159
- <div class="form-group row">
1160
- <label class="col-sm-5 col-md-5 control-label">Choose Column Label</label>
1161
- <div class="col-sm-7 col-md-7">
1162
- <input type="text" class="form-control" data-bind="value: fieldLabel" />
1163
- </div>
1164
- </div>
1165
- <div class="form-group row">
1166
- <label class="col-sm-5 col-md-5 control-label">Inner Column Label</label>
1167
- <div class="col-sm-7 col-md-7">
1168
- <input type="text" class="form-control" data-bind="value: fieldLabel2" />
1169
- </div>
1170
- </div>
1171
- <div class="form-group row">
1172
- <label class="col-sm-5 col-md-5 control-label">Choose Text Alignment</label>
1173
- <div class="col-sm-7 col-md-7">
1174
- <select class="form-select" data-bind="options: $parents[1].fieldAlignments, value: fieldAlign"></select>
1175
- </div>
1176
- </div>
1177
- <div class="form-group row">
1178
- <label class="col-sm-5 col-md-5 control-label">Choose Width (leave blank for auto)</label>
1179
- <div class="col-sm-7 col-md-7">
1180
- <input type="text" class="form-control" data-bind="value: fieldWidth" />
1181
- </div>
1182
- </div>
1183
- </div>
1184
- <br />
1185
- <div class="card card-body">
1186
- <div class="form-row align-items-center">
1187
- <div class="col-auto">
1188
- <b>Header Settings</b>
1189
- </div>
1190
- </div>
1191
- <div class="row mb-3">
1192
- <div class="col">
1193
- <div class="mb-3">
1194
- <label class="form-label">Pick Text Color</label>
1195
- <div class="d-flex">
1196
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerFontColor" />
1197
- <input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerFontColor" />
1198
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderFontColor(!applyAllHeaderFontColor()); }">
1199
- <span class="fa" data-bind="css: applyAllHeaderFontColor() ? 'fa-check' : 'fa-paste'"></span>
1200
- </button>
1201
- </div>
1202
- </div>
1203
- </div>
1204
- <div class="col">
1205
- <div class="mb-3">
1206
- <label class="form-label">Pick Background Color</label>
1207
- <div class="d-flex">
1208
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerBackColor" />
1209
- <input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerBackColor" />
1210
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBackColor(!applyAllHeaderBackColor()); }">
1211
- <span class="fa" data-bind="css: applyAllHeaderBackColor() ? 'fa-check' : 'fa-paste'"></span>
1212
- </button>
1213
- </div>
1214
- </div>
1215
- </div>
1216
- <div class="col d-flex align-items-center">
1217
- <div class="form-check me-3">
1218
- <input class="form-check-input" type="checkbox" data-bind="checked: headerFontBold" id="headerFontBoldCheckbox">
1219
- <label class="form-check-label" for="headerFontBoldCheckbox">
1220
- Bold Text
1221
- </label>
1222
- </div>
1223
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBold(!applyAllHeaderBold()); }">
1224
- <span class="fa" data-bind="css: applyAllHeaderBold() ? 'fa-check' : 'fa-paste'"></span>
1225
- </button>
1226
- </div>
1227
- </div>
1228
- </div>
1229
- <br />
1230
- <div class="card card-body">
1231
- <div class="form-row align-items-center">
1232
- <div class="col-auto">
1233
- <b>Text Settings</b>
1234
- </div>
1235
- </div>
1236
- <div class="row mb-3">
1237
- <div class="col">
1238
- <div class="mb-3">
1239
- <label class="form-label">Pick Text Color</label>
1240
- <div class="d-flex">
1241
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
1242
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
1243
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllFontColor(!applyAllFontColor()); }">
1244
- <span class="fa" data-bind="css: applyAllFontColor() ? 'fa-check' : 'fa-paste'"></span>
1245
- </button>
1246
- </div>
1247
- </div>
1248
- </div>
1249
- <div class="col">
1250
- <div class="mb-3">
1251
- <label class="form-label">Pick Background Color</label>
1252
- <div class="d-flex">
1253
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
1254
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
1255
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBackColor(!applyAllBackColor()); }">
1256
- <span class="fa" data-bind="css: applyAllBackColor() ? 'fa-check' : 'fa-paste'"></span>
1257
- </button>
1258
- </div>
1259
- </div>
1260
- </div>
1261
- <div class="col d-flex align-items-center">
1262
- <div class="form-check me-3">
1263
- <input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
1264
- <label class="form-check-label" for="fontBoldCheckbox">
1265
- Bold Text
1266
- </label>
1267
- </div>
1268
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBold(!applyAllBold()); }">
1269
- <span class="fa" data-bind="css: applyAllBold() ? 'fa-check' : 'fa-paste'"></span>
1270
- </button>
1271
- </div>
1272
- </div>
1273
- </div>
1274
- <div class="padded-div">
1275
- <button class="btn btn-sm btn-primary" data-bind="click: function() {addConditionalFormatSetting(null)}">Add Conditional Formatting</button>
1276
- </div>
1277
- <div data-bind="foreach: fieldCondtionalFormats" style="padding-left: 40px;">
1278
- <div class="card card-body">
1279
- <div class="row m-2">
1280
- <div class="col d-flex justify-content-start">
1281
- <b>Conditional Format #<span data-bind="text: $index()+1"></span></b>
1282
- </div>
1283
- <div class="col d-flex justify-content-end">
1284
- <button class="btn btn-sm btn-secondary" data-bind="click: $parent.removeSetting">Remove</button>
1285
- </div>
1286
- </div>
1287
- <div class="row mb-3">
1288
- <div class="col">
1289
- <div class="mb-3">
1290
- <label class="form-label">Pick Text Color</label>
1291
- <div class="d-flex">
1292
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
1293
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
1294
- </div>
1295
- </div>
1296
- </div>
1297
- <div class="col">
1298
- <div class="mb-3">
1299
- <label class="form-label">Pick Background Color</label>
1300
- <div class="d-flex">
1301
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
1302
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
1303
- </div>
1304
- </div>
1305
- </div>
1306
- <div class="col d-flex align-items-center">
1307
- <div class="form-check me-3">
1308
- <input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
1309
- <label class="form-check-label" for="fontBoldCheckbox">
1310
- Bold Text
1311
- </label>
1312
- </div>
1313
- </div>
1314
- </div>
1315
-
1316
- <div class="row m-2" data-bind="foreach: filter.Filters">
1317
- <div class="col-md-2">
1318
- Value
1319
- </div>
1320
- <div class="col-md-4">
1321
- <div data-bind="with: Field">
1322
- <div class="form-group">
1323
- <select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
1324
- </div>
1325
- </div>
1326
- </div>
1327
- <div class="col-md-4">
1328
- <div data-bind="with: Field" data-parentprefix="C">
1329
- <div data-bind="template: 'report-filter', data: $data"></div>
1330
- </div>
1331
- </div>
1332
- </div>
1333
- </div>
1334
- </div>
1335
- <br />
1336
- <div class="form-group row" data-bind="if: $parents[1].useStoredProc()">
1337
- <div class="col-sm-12">
1338
- <div class="checkbox pull-left" style="padding-top: 5px;">
1339
- <label>
1340
- <input type="checkbox" data-bind="checked: checkOuterGroup" />
1341
- Outer Group
1342
- </label>
1343
- </div>
1344
- </div>
1345
- </div>
1346
- </div>
1347
- <div class="modal-footer">
1348
- <button type="button" class="btn btn-danger" data-bind="click: cancelFieldOptions">Cancel</button>
1349
- <button type="button" class="btn btn-primary" data-bind="click: saveFieldOptions">Save Changes</button>
1350
- </div>
1351
- </div>
1352
- </div>
1353
- </script>
1354
-
1355
- <script type="text/html" id="report-link-edit">
1356
- <div class="modal-dialog" style="max-width: 750px;">
1357
- <div class="modal-content" data-bind="with: editLinkField">
1358
- <div class="modal-header">
1359
- <h5 class="modal-title">Setup Link Field</h5>
1360
- </div>
1361
- <div class="modal-body needs-validation" data-bind="with: linkFieldItem">
1362
- <div class="form-group row">
1363
- <label class="col-sm-5 col-md-5 control-label">This field will link to</label>
1364
- <div class="col-sm-7 col-md-7">
1365
- <select class="form-select" required data-bind="options: linkTypes, value: selectedLinkType"></select>
1366
- </div>
1367
- </div>
1368
- <div data-bind="if: LinksToReport">
1369
- <div class="form-group row">
1370
- <label class="col-sm-5 col-md-5 control-label">Link to this Report</label>
1371
- <div class="col-sm-7 col-md-7">
1372
- <select class="form-select" required data-bind="options: $parentContext.$parent.SavedReports, optionsText: 'reportName', optionsValue: 'reportId', value: LinkedToReportId, optionsCaption: 'Choose the Report to link to'"></select>
1373
- </div>
1374
- </div>
1375
- <div class="checkbox" data-bind="if: LinkedToReportId">
1376
- <label>
1377
- <input type="checkbox" data-bind="checked: SendAsFilterParameter" />
1378
- Send field value as Report Filter Parameter
1379
- </label>
1380
- </div>
1381
- <div class="form-group row" data-bind="if: SendAsFilterParameter">
1382
- <label class="col-sm-5 col-md-5 control-label">Link to this Report Filter</label>
1383
- <div class="col-sm-7 col-md-7">
1384
- <select class="form-select" required data-bind="options: allFields, optionsText: 'fieldName', optionsValue: 'fieldId', value: SelectedFilterId, optionsCaption: 'Choose the Field to Filter by value'"></select>
1385
- </div>
1386
- </div>
1387
- </div>
1388
- <div data-bind="ifnot: LinksToReport">
1389
- <div class="form-group row">
1390
- <label class="col-sm-5 col-md-5 control-label">Link to this URL</label>
1391
- <div class="col-sm-7 col-md-7">
1392
- <input type="text" class="form-control" required placeholder="Enter a url to open" data-bind="value: LinkToUrl" title="Valid URL needs to start with http:// or https://">
1393
- </div>
1394
- </div>
1395
- <div class="checkbox">
1396
- <label>
1397
- <input type="checkbox" data-bind="checked: SendAsQueryParameter" />
1398
- Send field value as Query Parameter
1399
- </label>
1400
- </div>
1401
- <div class="form-group row" data-bind="if: SendAsQueryParameter">
1402
- <label class="col-sm-5 col-md-5 control-label">Parameter Name to use</label>
1403
- <div class="col-sm-7 col-md-7">
1404
- <input type="text" class="form-control" required placeholder="Enter parameter name to send value as" data-bind="value: QueryParameterName">
1405
- </div>
1406
- </div>
1407
- <br />
1408
- </div>
1409
- </div>
1410
- <div class="modal-footer">
1411
- <button type="button" class="btn btn-danger" data-bind="click: removeLinkField">Remove Link</button>
1412
- <button type="button" class="btn btn-primary" data-bind="click: saveLinkField">Save Changes</button>
1413
- </div>
1414
- </div>
1415
- </div>
1416
- </script>
1417
-
1418
- <script type="text/html" id="designer-choose-visual">
1419
- <div class="btn-group" role="group" aria-label="Visualization Options">
1420
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('List'); }, css: { active: ReportType()=='List' }">
1421
- <span class="fa fa-2x fa-list-alt"></span>
1422
- <p>List</p>
1423
- </button>
1424
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Summary'); }, css: { active: ReportType()=='Summary' }">
1425
- <span class="fa fa-2x fa-table"></span>
1426
- <p>Summary</p>
1427
- </button>
1428
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Bar'); }, css: { active: ReportType()=='Bar' }">
1429
- <span class="fa fa-2x fa-bar-chart"></span>
1430
- <p>Bar</p>
1431
- </button>
1432
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pie'); }, css: { active: ReportType()=='Pie' }">
1433
- <span class="fa fa-2x fa-pie-chart"></span>
1434
- <p>Pie</p>
1435
- </button>
1436
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Line'); }, css: { active: ReportType()=='Line' }">
1437
- <span class="fa fa-2x fa-line-chart"></span>
1438
- <p>Line</p>
1439
- </button>
1440
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Combo'); }, css: { active: ReportType()=='Combo' }">
1441
- <span class="fa fa-2x fa-signal"></span>
1442
- <p>Combo</p>
1443
- </button>
1444
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Html'); }, css: { active: ReportType()=='Html' }">
1445
- <span class="fa fa-2x fa-code"></span>
1446
- <p>Custom</p>
1447
- </button>
1448
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Map'); }, css: { active: ReportType().indexOf('Map')==0 }">
1449
- <span class="fa fa-2x fa-globe"></span>
1450
- <p>Map</p>
1451
- </button>
1452
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('HeatMap'); }, css: { active: ReportType().indexOf('HeatMap')==0 }">
1453
- <span class="fa fa-2x fa-map"></span>
1454
- <p>HeatMap</p>
1455
- </button>
1456
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Single'); }, css: { active: ReportType()=='Single' }">
1457
- <span class="fa fa-2x fa-window-maximize"></span>
1458
- <p>KPI</p>
1459
- </button>
1460
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Treemap'); }, css: { active: ReportType()=='Treemap' }">
1461
- <span class="fa fa-2x fa-window-restore"></span>
1462
- <p>Treemap</p>
1463
- </button>
1464
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pivot'); }, css: { active: ReportType()=='Pivot' }">
1465
- <span class="fa fa-2x fa-random"></span>
1466
- <p>Transpose</p>
1467
- </button>
1468
- </div>
1469
- </script>
1470
-
1471
- <script type="text/html" id="designer-choose-data">
1472
- <div>
1473
- <div class="pull-left btn-group btn-group-toggle" role="group" data-bind="if: ReportID() <= 0">
1474
- <label class="btn btn-sm btn-light active" style="margin-right: 0px;" title="You can change the Data source only when creating a new report, changing this will clear all selections">
1475
- <input type="radio" name="dataoption" id="table" checked data-bind="checked: useStoredProc, checkedValue: false"> Dynamic
1476
- </label>
1477
- <label class="btn btn-sm btn-light active">
1478
- <input type="radio" name="dataoption" id="proc" value="1" data-bind="checked: useStoredProc, checkedValue: true"> Predefined
1479
- </label>
1480
- </div>
1481
- <div class="pull-right">
1482
- <a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Formula" data-bind="hidden: isFunctionField() || useStoredProc(), click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Custom Field', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
1483
- <a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Function" data-bind="hidden: true || isFormulaField() || useStoredProc(), click: function(){designFunctionField()}, text: isFunctionField()? 'Cancel': 'Function Field', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
1484
- </div>
1485
- </div>
1486
- <div class="clearfix"></div>
1487
- <div class="row">
1488
- <div class="col-md-12" data-bind="disable: isFormulaField, hidden: useStoredProc">
1489
- <div data-bind="with: textQuery.searchFields">
1490
- <select id="search-field" class="form-control" data-bind="select2: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'), placeholder: 'Search for a Data Field...', ajax: { url: url, dataType: 'json', data: query, processResults: processResults, headers: headers }, minimumInputLength: 2, allowClear: true }, value: selectedOption"></select>
1491
- </div>
1492
- </div>
1493
-
1494
- <div class="col-md-12" data-bind="visible: useStoredProc">
1495
- <div>
1496
- <select class="form-control" data-bind="select2Value: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card')}, options: Procs, optionsCaption: 'Choose Section...', optionsText: 'DisplayName', value: SelectedProc, visible: useStoredProc"></select>
1497
- </div>
1498
- </div>
1499
- <div class="col-md-12" data-bind="hidden: useStoredProc">
1500
- <div class="d-flex justify-content-between align-items-center mb-2" style="padding-top: 15px;">
1501
- <span>
1502
- Select Data to use in Report
1503
- <i class="fa fa-info-circle text-muted" data-toggle="tooltip" title="Choose a table to show fields to select."></i>
1504
- </span>
1505
- </div>
1506
-
1507
- <div class="data-select-tree">
1508
- <!-- ko foreach: CategorizedTables -->
1509
- <div class="mb-3">
1510
- <div data-bind="click: function() { isExpanded(!isExpanded()); }, visible: categoryName" style="cursor: pointer;">
1511
- <i class="fa" data-bind="css: isExpanded() ? 'fa-chevron-down text-secondary' : 'fa-chevron-right text-secondary'"></i>
1512
- <i class="fa" data-bind="css: isExpanded() ? 'fa-folder-open' : 'fa-folder'"></i>
1513
- <span data-bind="text: categoryName" class="ml-2"></span>
1514
- </div>
1515
- <div class="report-list" data-bind="visible: isExpanded(), foreach: tables" style="padding-left: 15px;">
1516
- <div class="row border-bottom py-2 w-100">
1517
- <div class="col-md-12">
1518
- <div class="pull-left" data-bind="click: function() { selectTable($data); }, css: {'text-muted': !isEnabled()}, style: {cursor: isEnabled() ? 'pointer' : ''}, attr: {title: !isEnabled() ? 'Cannot use table as joins do not exist': ''}">
1519
- <span class="text-secondary fa" data-bind="css: isEnabled() ? ($data === $parents[1].SelectedTable() ? 'fa-chevron-down' : 'fa-chevron-right') : 'fa-ban'"></span>&nbsp;
1520
- <span class="fa fa-table"></span>&nbsp;<span data-bind="text: tableName" class=""></span>
1521
- </div>
1522
- <div class="pull-right" data-bind="visible: $data === $parents[1].SelectedTable() && !$parents[1].isFormulaField() && !$parents[1].SelectedTable().dynamicColumns">
1523
- <a href="#" class="small text-muted" data-bind="click: $parents[1].MoveAllFields">Select all</a> |
1524
- <a href="#" class="small text-muted" data-bind="click: $parents[1].RemoveSelectedFields">Remove all</a>
1525
- </div>
1526
- </div>
1527
-
1528
- <!-- Fields Expand Here -->
1529
- <div data-bind="visible: $data === $parents[1].SelectedTable()" style="padding-left: 30px;">
1530
- <!-- ko foreach: $parents[1].ChooseFields -->
1531
- <div class="row border-bottom py-2 align-items-center w-100">
1532
- <div class="checkbox">
1533
- <label>
1534
- <input type="checkbox" data-bind="checkedInArray: {array: $parents[2].isFormulaField() ? $parents[2].formulaFields : $parents[2].SelectedFields, value: $data}">
1535
- <span data-bind="text: fieldName"></span>
1536
- </label>
1537
- </div>
1538
- </div>
1539
- <!--/ko-->
1540
- </div>
1541
- </div>
1542
- </div>
1543
- </div>
1544
- <!-- /ko -->
1545
- </div>
1546
- </div>
1547
- </div>
1548
- </script>
1549
-
1550
- <script type="text/html" id="designer-selected-data">
1551
- <div data-bind="visible: SelectedFields().length == 0">
1552
- Please choose data
1553
- </div>
1554
- <div data-bind="if: SelectedFields().length > 0">
1555
- <div data-bind="visible: ReportType()=='Bar'" class="card card-body">
1556
- <div class="alert alert-info small py-1 mb-2">
1557
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Bar Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis.
1558
- </div>
1559
- <div class="form-group row small">
1560
- <div class="checkbox col-6">
1561
- <label>
1562
- <input type="checkbox" data-bind="checked: barChartHorizontal" />
1563
- Horizontal Bar Chart
1564
- </label>
1565
- </div>
1566
- <div class="checkbox col-6">
1567
- <label>
1568
- <input type="checkbox" data-bind="checked: barChartStacked" />
1569
- Stacked Bar Chart
1570
- </label>
1571
- </div>
1572
- </div>
1573
- </div>
1574
-
1575
- <div data-bind="visible: ReportType()=='Pie'" class="card card-body">
1576
- <div class="alert alert-info small py-1 mb-2">
1577
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Pie Graph, the first field below will be grouped, and the first numeric field will show as the ratio.
1578
- </div>
1579
- <div class="form-group row small">
1580
- <div class="checkbox col-6">
1581
- <label>
1582
- <input type="checkbox" data-bind="checked: pieChartDonut" />
1583
- Donut Chart
1584
- </label>
1585
- </div>
1586
- </div>
1587
- </div>
1588
-
1589
- <div data-bind="visible: ReportType()=='Treemap'" class="card card-body">
1590
- <div class="alert alert-info small py-1 mb-0">
1591
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Treemap, the data must be in a hierarchical format with 2nd column having parent and third column having a numeric value. The data must have a single root node having null as its parent as well.
1592
- </div>
1593
- </div>
1594
- <div data-bind="visible: ReportType()=='HeatMap'" class="card card-body">
1595
- <div class="alert alert-info mb-3">
1596
- <span class="fa fa-lightbulb-o fa-2x"></span>&nbsp;For HeatMap, the first two columns must be numeric values representing
1597
- <strong>Latitude</strong> and <strong>Longitude</strong>. At least one additional numeric column is required to provide the
1598
- <strong>intensity</strong> of each point.
1599
- </div>
1600
-
1601
- <div class="form-group row mb-2">
1602
- <div class="checkbox col-6">
1603
- <label>
1604
- <input type="checkbox" data-bind="checked: heatMapOptions.showMarker" />
1605
- Show Marker
1606
- </label>
1607
- </div>
1608
- </div>
1609
-
1610
- <div class="form-group row mb-3">
1611
- <label class="col-12 fw-bold">Heatmap Colors</label>
1612
-
1613
- <div class="col-4 mb-2">
1614
- <input type="color" class="color-picker"
1615
- data-bind="value: heatMapOptions.gradient1" title="Gradient 1" />
1616
- </div>
1617
- <div class="col-4 mb-2">
1618
- <input type="color" class="color-picker"
1619
- data-bind="value: heatMapOptions.gradient2" title="Gradient 2" />
1620
- </div>
1621
- <div class="col-4 mb-2">
1622
- <input type="color" class="color-picker"
1623
- data-bind="value: heatMapOptions.gradient3" title="Gradient 3" />
1624
- </div>
1625
- </div>
1626
- </div>
1627
-
1628
- <div data-bind="visible: ReportType()=='Line'" class="card card-body">
1629
- <div class="alert alert-info small py-1 mb-2">
1630
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Line Graph, the first field below will show on the x-axis. All other fields will numeric fields will show on y-axis.
1631
- </div>
1632
- <div class="form-group row small">
1633
- <div class="checkbox col-6">
1634
- <label>
1635
- <input type="checkbox" data-bind="checked: lineChartArea" />
1636
- Area Chart
1637
- </label>
1638
- </div>
1639
- </div>
1640
- </div>
1641
-
1642
- <div data-bind="visible: ReportType()=='Combo'" class="card card-body">
1643
- <div class="alert alert-info small py-1 mb-2">
1644
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Combo Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis, and you can choose display each series as line, bar or area.
1645
- </div>
1646
- <div class="form-group row small">
1647
- <div class="col-6">
1648
- <label>Default Series Type</label>
1649
- <select class="form-select form-select-sm" data-bind="options: seriesTypes, value: comboChartType"></select>
1650
- </div>
1651
- </div>
1652
- </div>
1653
-
1654
- <div data-bind="visible: ReportType()=='Pivot'" class="card card-body">
1655
- <div class="alert alert-info small py-1 mb-0">
1656
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Transpose, the first field below will be used to Pivot/Transpose the rows as columns, and it must be grouped.
1657
- </div>
1658
- </div>
1659
-
1660
- <div data-bind="visible: ReportType()=='Single'" class="card card-body">
1661
- <div class="alert alert-info small py-1 mb-0">
1662
- <span class="fa fa-lightbulb-o"></span>&nbsp;KPI is a single value report that is ideal for placing on a Dashboard. All fields except one must be hidden for Widgets.
1663
- </div>
1664
- </div>
1665
-
1666
- <div data-bind="visible: ReportType()=='Html'" class="card card-body">
1667
- <div class="form-group row small">
1668
- <div class="checkbox col-6">
1669
- <label>
1670
- <input type="checkbox" data-bind="checked: dontGroupCustom" />
1671
- List (Don't Summarize)
1672
- </label>
1673
- </div>
1674
- </div>
1675
- </div>
1676
-
1677
- <div data-bind="visible: ReportType()=='Map'" class="card card-body">
1678
- <div class="alert alert-info small py-1 mb-2">
1679
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Map Graph, the first field below has to be a Region, like a Country.
1680
- </div>
1681
- <div class="form-group row small">
1682
- <label class="col-sm-3 control-label">Map Display</label>
1683
- <div class="col-sm-5">
1684
- <select class="form-select form-select-sm" data-bind="options: mapRegions, value: mapRegion"></select>
1685
- </div>
1686
- </div>
1687
- </div>
1688
- </div>
1689
- <ul class="list-group" data-bind="sortable: { data: SelectedFields, options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }, strategyMove: true }">
1690
- <li class="list-group-item">
1691
- <div class="row">
1692
- <div class="col-5">
1693
- <span class="sortable pull-left" style="padding-right: 15px;" data-bind="ifnot: $parent.useStoredProc">
1694
- <span class="fa fa-ellipsis-v" aria-hidden="true" title="Drag to reorder"></span>
1695
- </span>
1696
- <span class="fa fa-columns"></span>
1697
- <span data-bind="text: selectedFieldName"></span>
1698
- <span data-bind="text: isFormulaField() ? '(' + fieldFormat() + ')' : ''"></span>
1699
- <span data-bind="visible: !$parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.ReportType() !='Treemap' && $parent.isChart()">
1700
- <span class="badge bg-danger" data-bind="visible: !groupInGraph()">Will not show in <span data-bind="text: $parent.ReportType"></span>Chart</span>
1701
- </span>
1702
- <span data-bind="visible: $parent.IsPivotFieldLastColumn($index(),selectedAggregate())">
1703
- <span class="badge bg-danger" >Pivot field cannot be the last column.</span>
1704
- </span>
1705
- <span data-bind="visible: $parent.IsDynamicFieldFirstColumn($index())">
1706
- <span class="badge bg-danger" >Dynamic cannot be first column.</span>
1707
- </span>
1708
- </div>
1709
- <div class="col-7">
1710
- <div class="pull-right" style="margin-top: -5px;" data-bind="if: $parent.AggregateReport() && !$parent.useStoredProc()">
1711
- <select class="form-select form-control-sm" data-bind="options: $parent.canDrilldown() && $index()>0 ? fieldAggregateWithDrilldown : fieldAggregate, value: selectedAggregate"></select>
1712
- </div>
1713
-
1714
- <div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
1715
- <span class="fa fa-trash-o" title="Cannot Delete Required Filter" data-bind="visible: forceFilterForTable"></span>
1716
- <span class="fa fa-trash" style="cursor: pointer;" aria-hidden="true" title="Delete this Field" data-bind="click: $parent.RemoveField, hidden: forceFilterForTable"></span>
1717
- </div>
1718
- <!--<div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
1719
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {active: filterOnFly()==true}">
1720
- <span class="fa fa-filter" aria-hidden="true" title="Filter by this field on the Report"></span>
1721
- </span>
1722
- </div>-->
1723
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
1724
- <span class="button-box no-padding" tabindex="0" data-bind="click: toggleDisable, css: {active: disabled()==true}">
1725
- <span class="fa fa-close" aria-hidden="true" title="Do not include in Report"></span>
1726
- </span>
1727
- </div>
1728
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot' && $parent.ReportType()!='List' && !$parent.useStoredProc()">
1729
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ hideInDetail(!hideInDetail()); }, css: {active: hideInDetail()==true}">
1730
- <span class="fa fa-eye-slash" aria-hidden="true" title="Hide in Details"></span>
1731
- </span>
1732
- </div>
1733
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
1734
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ groupInGraph(!groupInGraph()); }, css: {active: groupInGraph()==false}">
1735
- <span class="fa fa-signal" aria-hidden="true" title="Include in series"></span>
1736
- </span>
1737
- </div>
1738
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.IncludeSubTotal() && (['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldType) >= 0 || ['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldFormat()) >= 0)">
1739
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ dontSubTotal(!dontSubTotal()); }, css: {active: dontSubTotal()==true}">
1740
- <span class="fa fa-plus-circle" aria-hidden="true" title="Don't add to Total row"></span>
1741
- </span>
1742
- </div>
1743
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
1744
- <span class="button-box no-padding" tabindex="0" data-bind="click: setupLinkField, css: {active: linkField()==true}">
1745
- <span class="fa fa-link" aria-hidden="true" title="Link to another Report or Url"></span>
1746
- </span>
1747
- </div>
1748
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()=='Combo' && $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
1749
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ seriesType(seriesType() == 'line' ? 'area' : (seriesType()=='bars' ? 'line' : 'bars')); }">
1750
- <span class="fa" aria-hidden="true" data-bind="css: {'fa-line-chart': seriesType() == 'line', 'fa-bar-chart': seriesType() == 'bars', 'fa-area-chart': seriesType()=='area' }, attr: {title: seriesType}"></span>
1751
- </span>
1752
- </div>
1753
- <div class="pull-right" style="padding-right: 10px;">
1754
- <span class="button-box no-padding" tabindex="0" data-bind="click: setupFieldOptions">
1755
- <span class="fa fa-gear" aria-hidden="true" title="More Options"></span>
1756
- </span>
1757
- </div>
1758
- <div class="pull-right" style="padding-right: 10px;" data-bind="if: isFormulaField">
1759
- <span class="button-box no-padding" tabindex="0" data-bind="click: editFormulaField">
1760
- <span class="fa fa-pencil" aria-hidden="true" title="Edit Formula Field"></span>
1761
- </span>
1762
- </div>
1763
- </div>
1764
- </div>
1765
- </li>
1766
- </ul>
1767
- </script>
1768
-
1769
- <script type="text/html" id="designer-sub-report">
1770
- <p class="text-muted mb-3">
1771
- Linked reports are available to add as sub reports.
1772
- Selecting sub reports will restrict the report to <strong>one record per page</strong>.
1773
- </p>
1774
-
1775
- <div class="mb-3">
1776
- <select class="form-select"
1777
- data-bind="options: linkedReportFields,
1778
- optionsText: 'name',
1779
- value: selectedSubReport,
1780
- optionsCaption: 'Select a linked report...'">
1781
- </select>
1782
- </div>
1783
- <ul class="list-group"
1784
- data-bind="sortable: {
1785
- data: subReports,
1786
- options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }
1787
- }">
1788
- <li class="list-group-item d-flex justify-content-between align-items-center">
1789
- <span>
1790
- <i class="fa fa-bars sortable me-2" style="cursor:move;"></i>
1791
- <span data-bind="text: name"></span>
1792
- </span>
1793
- <button type="button" class="btn btn-sm btn-outline-danger"
1794
- data-bind="click: $parent.removeSubReport">
1795
- Delete
1796
- </button>
1797
- </li>
1798
- </ul>
1799
- </script>
1800
-
1801
- <script type="text/html" id="designer-html">
1802
- <div class="row align-items-center mb-1">
1803
- <div class="col-md-4">
1804
- <select class="form-select" data-bind="options: SelectedFields, value: SelectFieldToInsert, optionsCaption: 'Select a field...', optionsText: 'selectedFieldName'"></select>
1805
- </div>
1806
- <div class="col-auto dropdown">
1807
- <button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown">
1808
- <i class="fa fa-table"></i> Insert as Table
1809
- </button>
1810
- <ul class="dropdown-menu">
1811
- <li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableTransposed">Transposed</a></li>
1812
- <li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableStandard">Standard</a></li>
1813
- <li><hr class="dropdown-divider"></li>
1814
- <li><a class="dropdown-item" href="#" data-bind="click: insertHeaderBreak">Add Header Break</a></li>
1815
- <li><a class="dropdown-item" href="#" data-bind="click: insertFooterBreak">Add Footer Break</a></li>
1816
- </ul>
1817
- </div>
1818
-
1819
- <div class="col-md-auto ms-2">
1820
- <label class="form-check-label">
1821
- <input class="form-check-input me-2" type="checkbox" data-bind="checked: cardView">
1822
- Card Layout
1823
- </label>
1824
- </div>
1825
- </div>
1826
- <div class="mb-3">
1827
- <textarea data-bind="summernote: reportHtml"></textarea>
1828
- </div>
1829
- </script>
1830
-
1831
- <script type="text/html" id="designer-sort">
1832
- <div data-bind="ifnot: useStoredProc">
1833
- <div class="form-group row align-items-center flex-nowrap">
1834
- <label class="col-auto control-label">Sort By</label>
1835
- <div class="col">
1836
- <select class="form-select form-select-sm"
1837
- data-bind="options: FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: SortByField, optionsCaption: 'Select field to sort...', allowClear: true">
1838
- </select>
1839
- </div>
1840
- <div class="col-auto d-flex gap-1">
1841
- <button class="btn btn-sm btn-secondary"
1842
- data-bind="text: !SortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { SortDesc(!SortDesc()); return false; }">
1843
- </button>
1844
- <button class="btn btn-sm btn-secondary"
1845
- data-bind="click: addSortField">
1846
- Add Sort
1847
- </button>
1848
- </div>
1849
- </div>
1850
-
1851
- <div data-bind="foreach: SortFields">
1852
- <div class="form-group row align-items-center flex-nowrap">
1853
- <label class="col-auto control-label">&nbsp;&nbsp;Then Sort By</label>
1854
- <div class="col">
1855
- <select class="form-select form-select-sm" required
1856
- data-bind="options: $parent.FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: sortByFieldId">
1857
- </select>
1858
- </div>
1859
- <div class="col-auto d-flex gap-1">
1860
- <button class="btn btn-sm btn-secondary"
1861
- data-bind="click: remove">
1862
- Remove Sort
1863
- </button>
1864
- <button class="btn btn-sm btn-secondary"
1865
- data-bind="text: !sortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { sortDesc(!sortDesc()); return false; }">
1866
- </button>
1867
- <button class="btn btn-sm btn-secondary"
1868
- data-bind="click: $parent.addSortField">
1869
- Add Sort
1870
- </button>
1871
- </div>
1872
- </div>
1873
- </div>
1874
- </div>
1875
- </script>
1876
-
1877
- <script type="text/html" id="designer-options">
1878
- <div class="row">
1879
- <div class="col-md-5">
1880
- <div class="checkbox" data-bind="visible: ReportType()!='Pivot'">
1881
- <label>
1882
- <input type="checkbox" data-bind="checked: IncludeSubTotal" />
1883
- Include Total Row
1884
- </label>
1885
- </div>
1886
- <div class="checkbox" data-bind="hidden: AggregateReport">
1887
- <label>
1888
- <input type="checkbox" data-bind="checked: ShowUniqueRecords" />
1889
- Show only Unique Records
1890
- </label>
1891
- </div>
1892
- <div class="checkbox" data-bind="visible: ReportType()!='List'">
1893
- <label>
1894
- <input type="checkbox" data-bind="checked: ShowExpandOption" />
1895
- Don't Show Expand Option
1896
- </label>
1897
- </div>
1898
- <div class="checkbox" data-bind="visible: isChart">
1899
- <label>
1900
- <input type="checkbox" data-bind="checked: ShowDataWithGraph" />
1901
- Show Data along with Graph
1902
- </label>
1903
- </div>
1904
- <div class="checkbox">
1905
- <label>
1906
- <input type="checkbox" data-bind="checked: DontExecuteOnRun" />
1907
- Wait to Select Filters before Running Report
1908
- </label>
1909
- </div>
1910
- <div class="form-group row">
1911
- <div class="checkbox col-md-5">
1912
- <label>
1913
- <input type="checkbox" data-bind="checked: maxRecords" />
1914
- Max Records
1915
- </label>
1916
- </div>
1917
- <div class="col-md-5" data-bind="if: maxRecords">
1918
- <input type="number" style="width: 150px;" class="form-control" required placeholder="Only top n..." data-bind="value: OnlyTop, visible: maxRecords">
1919
- </div>
1920
- </div>
1921
- <div class="form-group row">
1922
- <div class="checkbox col-md-5">
1923
- <label>
1924
- <input type="checkbox" data-bind="checked: changePageSize, disable: subReports().length > 0" />
1925
- Change Page Size
1926
- </label>
1927
- </div>
1928
- <div class="col-md-5"
1929
- data-bind="visible: changePageSize,
1930
- css: { 'text-muted': subReports().length > 0 }">
1931
- <select style="width: 150px;" class="form-select"
1932
- data-bind="options: [1,10,30,50,100,150,200,500,1000],
1933
- value: DefaultPageSize,
1934
- disable: subReports().length > 0">
1935
- </select>
1936
- <!-- Force default to 1 if sub reports selected -->
1937
- <small class="text-danger" data-bind="visible: subReports().length > 0">
1938
- Page size is restricted to 1 when sub reports are selected.
1939
- </small>
1940
- </div>
1941
- </div>
1942
- </div>
1943
- <div class="col-md-7">
1944
- <p><span class="fa fa-paint-brush"></span> Pick Report Format</p>
1945
- <div>
1946
- <!-- ko foreach: tableStyles -->
1947
- <div class="dropdown-option" data-bind="title: $data.name, click: $parent.selectStyle, css: {'dropdown-option-selected': $parent.selectedStyle() == $data.colorscheme}">
1948
- <div class="mini-table-preview" data-bind="foreach: new Array(5)">
1949
- <div class="mini-table-row" data-bind="foreach: new Array(5)">
1950
- <div class="mini-table-cell" data-bind="style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }"></div>
1951
-
1952
- </div>
1953
- </div>
1954
- </div>
1955
- <!-- /ko -->
1956
- </div>
1957
- <div class="checkbox">
1958
- <label>
1959
- <input type="checkbox" data-bind="checked: noHeaderRow" />
1960
- No Header Row
1961
- </label>
1962
- </div>
1963
- <div class="checkbox">
1964
- <label>
1965
- <input type="checkbox" data-bind="checked: noDashboardBorders" />
1966
- Borderless on Dashboard
1967
- </label>
1968
- </div>
1969
- <div class="checkbox" data-bind="if: ReportType() == 'Single'">
1970
- <label>
1971
- <input type="checkbox" data-bind="checked: showPriorInKpi" />
1972
- Show previous comparision in KPI if applicable
1973
- </label>
1974
- </div>
1975
- </div>
1976
- </div>
1977
- </script>
1978
-
1979
- <script type="text/html" id="custom-field-designer">
1980
- <div>
1981
- <div class="row">
1982
- <div class="col-md-12" data-bind="visible: isFormulaField()">
1983
- <div class="alert alert-info">
1984
- You are now creating a Customized Field. Please select the fields you want to use in the calculation, then choose the operations you want to perform, and click "Save" to add your Custom field.
1985
- </div>
1986
- </div>
1987
- </div>
1988
- <div class="row">
1989
- <div class="col-sm-6 small">
1990
- Setup your Formula for calculating this Field
1991
- </div>
1992
- <div class="col-sm-6 right-align" data-bind="visible: formulaType()=='build'">
1993
- <a href="#" class="btn btn-secondary btn-sm" data-bind="click: addFormulaParentheses">Add ( )</a>
1994
- <a href="#" class="btn btn-secondary btn-sm" title="Add Today" data-bind="visible: formulaOnlyHasDateFields() || formulaFields().length == 0, click: addFormulaDateToday">Add Today</a>
1995
- <a href="#" class="btn btn-secondary btn-sm" title="Add a Constant Value" data-bind="click: addFormulaConstantValue">Add Value</a>
1996
- <a href="#" class="btn btn-secondary btn-sm" data-bind="click: clearFormulaField">Clear</a>
1997
- </div>
1998
- </div>
1999
- <div class="form-group-row" data-bind="if: formulaOnlyHasDateFields">
2000
- <div class="col-sm-12">
2001
- <div class="alert alert-info">
2002
- For Dates Field calculation, you can only substract date fields and display the result as days, hours, minutes or seconds.
2003
- </div>
2004
- </div>
2005
- </div>
2006
- <div class="form-group row">
2007
- <label class="col-sm-2 control-label">Field Label</label>
2008
- <div class="col-sm-10">
2009
- <input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
2010
- </div>
2011
- </div>
2012
- <div class="form-group row">
2013
- <label class="col-sm-2 control-label">Data Format</label>
2014
- <div class="col-sm-10">
2015
- <select class="form-select form-select-sm" data-bind="value: formulaDataFormat" required>
2016
- <!-- ko ifnot: formulaOnlyHasDateFields -->
2017
- <option>String</option>
2018
- <option>Integer</option>
2019
- <option>Decimal</option>
2020
- <option>Currency</option>
2021
- <!-- /ko -->
2022
- <!-- ko if: formulaOnlyHasDateFields -->
2023
- <option>Days</option>
2024
- <option>Hours</option>
2025
- <option>Minutes</option>
2026
- <option>Seconds</option>
2027
- <!-- /ko -->
2028
- </select>
2029
- </div>
2030
- </div>
2031
- <div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
2032
- <label class="col-sm-2 control-label">Round to Decimal Places</label>
2033
- <div class="col-sm-10">
2034
- <input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
2035
- </div>
2036
- </div>
2037
- <div class="form-group row" data-bind="visible: appSettings.useSqlCustomField">
2038
- <label class="col-sm-2 control-label">Field Builder Type</label>
2039
- <div class="col-sm-10">
2040
- <select class="form-select form-select-sm" data-bind="value: formulaType" required>
2041
- <option value="build">Simple Calculation</option>
2042
- <option value="sql">Advanced Expression</option>
2043
- </select>
2044
- </div>
2045
- </div>
2046
-
2047
- <div class="form-group row" data-bind="if: formulaType()=='build'">
2048
- <label class="col-sm-2 control-label">Field Formula</label>
2049
- <div class="col-sm-10">
2050
- <div class="text-muted small" data-bind="visible: formulaFields().length == 0">Pick fields to build calculation</div>
2051
- <div class="d-flex align-items-center flex-wrap" data-bind="foreach: formulaFields">
2052
- <h3 class="me-3" data-bind="visible: setupFormula.isParenthesesStart" style="margin-top: 0;">(</h3>
2053
- <div data-bind="if: !setupFormula.isParenthesesStart() && !setupFormula.isParenthesesEnd()" class="list-group me-3">
2054
- <div class="list-group-item d-flex align-items-center formula-field-item" style="margin-left: 15px; padding: 5px 15px">
2055
- <span data-bind="text: fieldName, visible: !setupFormula.isConstantValue()"></span>
2056
- <div data-bind="if: setupFormula.isConstantValue" class="d-flex align-items-center">
2057
- <input data-bind="value: setupFormula.constantValue, visible: setupFormula.constantValue()!='|Today|'" class="form-control form-control-sm me-2" required />
2058
- <span data-bind="visible: setupFormula.constantValue() == '|Today|'"><b>Today</b></span>
2059
- </div>
2060
- <button class="btn btn-danger btn-sm ms-2" data-bind="click: $parent.removeField">
2061
- <i class="fa fa-trash"></i>
2062
- </button>
2063
- </div>
2064
- </div>
2065
- <h3 class="me-3" data-bind="visible: setupFormula.isParenthesesEnd" style="margin-top: 0;">)</h3>
2066
- <div class="me-3" style="margin-left: 15px;" data-bind="visible: $parent.showFormulaOperation($index())">
2067
- <select class="form-control form-control-sm" style="max-width: 50px;" data-bind="value: setupFormula.formulaOperation">
2068
- <!-- ko if: !$parent.formulaOnlyHasDateFields() || ($parent.formulaOnlyHasDateFields() && $parent.isConstantOperation($index())) -->
2069
- <option>+</option>
2070
- <!-- /ko -->
2071
- <option>-</option>
2072
- <!-- ko if: ['Integer','Money','Float','Double','Decimal','Currency'].indexOf($parent.formulaDataFormat()) != -1 -->
2073
- <option>*</option>
2074
- <option>/</option>
2075
- <!-- /ko -->
2076
- </select>
2077
- </div>
2078
- </div>
2079
-
2080
- </div>
2081
- </div>
2082
-
2083
- <div data-bind="with: customSqlField, visible: formulaType()=='sql'">
2084
- <div class="row">
2085
- <div class="col-md-12">
2086
-
2087
- <div class="mb-3">
2088
- <label class="form-label">Select Data Operation:</label>
2089
- <select class="form-select" data-bind="select2: {
2090
- dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
2091
- placeholder: 'Select Function...',
2092
- data: availableFunctionsGrouped(),
2093
- templateResult: templateResult
2094
- }, value: selectedSqlFunction"></select>
2095
- </div>
2096
-
2097
- <div class="mb-3" data-bind="hidden: isConditionalFunction() || selectedSqlFunction() == 'Other'">
2098
- <label class="form-label">Select the Data Field to use:</label>
2099
- <select class="form-select"
2100
- data-bind="select2: {
2101
- dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
2102
- placeholder: 'Search Field...',
2103
- ajax: {
2104
- url: $parent.textQuery.searchFields.url,
2105
- dataType: 'json',
2106
- data: $parent.textQuery.searchFields.query,
2107
- processResults: $parent.textQuery.searchFields.processResults,
2108
- headers: $parent.textQuery.searchFields.headers
2109
- },
2110
- minimumInputLength: 2,
2111
- allowClear: true
2112
- }, select2Text: selectedField,select2TableId:selectedFieldTableId"></select>
2113
- <div data-bind="with: selectedField" class="small">
2114
- Selected: <span class="highlight" data-bind="text: $data"></span>
2115
- </div>
2116
- </div>
2117
-
2118
- <div class="mb-3" data-bind="if: requiresValue">
2119
- <label for="inputValue" class="form-label">Provide the relevant value to use:</label>
2120
- <input type="text" id="inputValue" class="form-control" data-bind="value: inputValue" required />
2121
- </div>
2122
-
2123
- <div class="mb-3" data-bind="visible: selectedSqlFunction() == 'Other'">
2124
- <label for="custom-sql" class="form-label">Custom SQL Expression:</label>
2125
- <p class="text-muted">
2126
- Build your custom SQL Expression below by selecting data fields, adding calculations or using SQL keywords as needed. For string values, remember to enclose them in single quotes ('')
2127
- </p>
2128
- <p id="custom-sql" class="hint-input" contenteditable="true" placeholder="Write your custom SQL"></p>
2129
- </div>
2130
- <div data-bind="visible: isConditionalFunction">
2131
- <p class="text-muted">
2132
- Build your conditional logic below by selecting data fields, adding calculations and defining conditions as needed, and provide corresponding results. For string values, remember to enclose them in single quotes ('')
2133
- </p>
2134
- <div class="input-group mb-3">
2135
- <div class="flex-grow-1">
2136
- <p class="hint-input" id="condition-field" contenteditable="true" placeholder="Field to compare" title="Field to compare"></p>
2137
- </div>
2138
-
2139
- <div class="mx-2" style="width: 120px;">
2140
- <select class="form-select form-select-sm" data-bind="options: availableOperators, value: selectedOperator"></select>
2141
- </div>
2142
-
2143
- <div class="flex-grow-1">
2144
- <p class="hint-input" id="condition-value" contenteditable="true" placeholder="Value to compare" title="Value to compare"></p>
2145
- </div>
2146
-
2147
- <span class="input-group-text" style="max-height: 32px;">THEN</span>
2148
-
2149
- <div class="flex-grow-1">
2150
- <p class="hint-input" id="condition-result" contenteditable="true" placeholder="Condition Result" title="Condition Result"></p>
2151
- </div>
2152
- </div>
2153
-
2154
- <button class="btn btn-outline-primary" data-bind="click: addCondition">Add Condition</button>
2155
- <ul class="list-group mt-3" data-bind="foreach: conditions">
2156
- <li class="list-group-item d-flex justify-content-between align-items-center">
2157
- <span data-bind="text: conditionDisplay"></span>
2158
- <button class="btn btn-sm btn-danger" data-bind="click: $parent.removeCondition">Remove</button>
2159
- </li>
2160
- </ul>
2161
-
2162
- <div class="input-group mb-3" style="padding-top: 5px;">
2163
- <span class="input-group-text" style="max-height: 32px;">ELSE</span>
2164
- <div class="flex-grow-1">
2165
- <p class="hint-input" id="condition-else" contenteditable="true" placeholder="Default Result" title="Default Result"></p>
2166
- </div>
2167
- </div>
2168
- </div>
2169
-
2170
- </div>
2171
- </div>
2172
- </div>
2173
-
2174
- <div class="col-md-12">
2175
- <hr />
2176
- <a href="#" class="btn btn-primary btn-sm" title="Save Custom Formula Field" data-bind="click: saveFormulaField, visible: isFormulaField">Save</a>
2177
- <a href="#" class="btn btn-sm" title="Custom Field using Formula" data-bind="click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Customize', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
2178
- </div>
2179
- </div>
2180
- </script>
2181
-
2182
- <script type="text/html" id="report-designer-compact">
2183
- <div class="designer-container compact-designer" id="choose-data-design" style="font-size:12px;">
2184
-
2185
- <!-- Visualization Toolbar -->
2186
- <div class="card p-1 mb-2">
2187
- <div class="card-header p-1 d-flex justify-content-between align-items-center">
2188
- <span><i class="fa fa-file"></i> Visualization</span>
2189
- <button type="button" class="btn btn-sm btn-light" data-bind="visible: ReportID(), click: function() {activeDesign(false);}" title="Close">
2190
- <i class="fa fa-times"></i> Close Designer
2191
- </button>
2192
- </div>
2193
- <div class="card-body p-1">
2194
- <div data-bind="template: 'designer-choose-visual'"></div>
2195
- </div>
2196
- </div>
2197
-
2198
- <!-- Main Grid -->
2199
- <div class="d-flex flex-row flex-wrap gap-2 compact-filters needs-validation">
2200
-
2201
- <!-- Data -->
2202
- <div class="card flex-fill expandable-panel" id="dataPanel" style="max-width: 300px"
2203
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('dataPanel')}">
2204
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('dataPanel')}">
2205
- <i class="fa fa-database"></i> Data
2206
- </div>
2207
-
2208
- <div class="card-body p-1">
2209
- <div data-bind="template: 'designer-choose-data'"></div>
2210
- </div>
2211
- </div>
2212
-
2213
- <!-- Selected -->
2214
- <div class="card flex-fill expandable-panel" id="selectedPanel" style="max-width: 400px"
2215
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('selectedPanel')}">
2216
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('selectedPanel')}">
2217
- <i class="fa fa-table"></i> Selected data for the Report
2218
- <a href="#" class="small text-muted float-end"
2219
- data-bind="visible: SelectedFields().length, click:function(){SelectedFields([]);}">Clear all</a>
2220
- </div>
2221
-
2222
- <div class="card-body designer-auto-update p-1">
2223
- <div style="max-height: 300px; overflow-y: auto;">
2224
- <div data-bind="template: 'designer-selected-data'"></div>
2225
- </div>
2226
- </div>
2227
- </div>
2228
-
2229
- <div class="card flex-fill expandable-panel" id="subReportsPanel"
2230
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('subReportsPanel')}, visible: linkedReportFields().length > 0">
2231
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('subReportsPanel')}">
2232
- <i class="fa fa-bookmark"></i> Sub Reports
2233
- </div>
2234
- <div class="card-body p-1">
2235
- <div data-bind="template: 'designer-sub-report', data: $data"></div>
2236
- </div>
2237
- </div>
2238
-
2239
- <div class="card flex-fill expandable-panel" id="htmlReportPanel"
2240
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('htmlReportPanel')}, visible: ReportType()=='Html'">
2241
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('htmlReportPanel')}">
2242
- <i class="fa fa-pencil"></i> Custom Design
2243
- </div>
2244
- <div class="card-body p-1">
2245
- <div data-bind="template: 'designer-html', data: $data"></div>
2246
- </div>
2247
- </div>
2248
-
2249
- <!-- Custom Field -->
2250
- <div class="card flex-fill expandable-panel" id="customFieldPanel" data-bind="visible: isFormulaField">
2251
- <div class="card-header p-1">
2252
- <i class="fa fa-magic"></i> Custom Field
2253
- </div>
2254
- <div class="card-body p-1 custom-field-design" style="max-height: 400px; overflow-y: auto; overflow-x: hidden;">
2255
- <div data-bind="template: 'custom-field-designer', data: $data"></div>
2256
- </div>
2257
- </div>
2258
- <!-- Field Options Panel -->
2259
- <div id="fieldOptionsPanel" class="card p-2 mt-2 collapse">
2260
- <!-- dynamic field settings load here -->
2261
- </div>
2262
- <!-- Filters -->
2263
- <div class="card flex-fill expandable-panel" id="filtersPanel"
2264
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('filtersPanel')}, hidden: isFormulaField">
2265
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('filtersPanel')}">
2266
- <i class="fa fa-filter"></i> Filters
2267
- </div>
2268
- <div class="card-body p-1 designer-auto-update" style="max-height:300px; overflow-y:auto;">
2269
- <div data-bind="if:useStoredProc"><div data-bind="template:{name:'filter-parameters'}"></div></div>
2270
- <div data-bind="ifnot:useStoredProc"><div data-bind="template:{name:'filter-group'}"></div></div>
2271
- </div>
2272
- </div>
2273
-
2274
- <!-- Sort -->
2275
- <div class="card flex-fill expandable-panel" id="sortPanel"
2276
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('sortPanel')}, hidden: useStoredProc() || isFormulaField()">
2277
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('sortPanel')}">
2278
- <i class="fa fa-sort"></i> Sort
2279
- </div>
2280
- <div class="card-body p-1 designer-auto-update row">
2281
- <div data-bind="template: 'designer-sort'"></div>
2282
- </div>
2283
- </div>
2284
-
2285
- <!-- Settings -->
2286
- <div class="card flex-fill expandable-panel" id="settingsPanel"
2287
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('settingsPanel')}, hidden: isFormulaField">
2288
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('settingsPanel')}">
2289
- <i class="fa fa-gear"></i>Options
2290
- </div>
2291
- <div class="card-body">
2292
- <div class="form-group row">
2293
- <label class="col-form-label h6">
2294
- <i class="fa fa-file"></i> Report Name
2295
- </label>
2296
- <div>
2297
- <input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
2298
- </div>
2299
- </div>
2300
- <div class="form-group row">
2301
- <label class="control-label h6">
2302
- <i class="fa fa-info-circle"></i> Report Description
2303
- </label>
2304
- <div>
2305
- <textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
2306
- </div>
2307
- </div>
2308
- <div class="checkbox" data-bind="visible: CanSaveReports()">
2309
- <label>
2310
- <input type="checkbox" data-bind="checked: SaveReport">
2311
- Save Report
2312
- </label>
2313
- </div>
2314
- <div class="form-group row" data-bind="visible: SaveReport">
2315
- <label class="control-label h6">
2316
- <i class="fa fa-folder-open"></i> Choose Folder
2317
- </label>
2318
- <div>
2319
- <select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
2320
- </div>
2321
- </div>
2322
- <hr />
2323
- <div data-bind="template: 'designer-options'"></div>
2324
- </div>
2325
- </div>
2326
-
2327
- <!-- Schedule -->
2328
- <div class="card flex-fill expandable-panel" id="schedulePanel"
2329
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('schedulePanel')}">
2330
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('schedulePanel')}">
2331
- <i class="fa fa-hourglass"></i> Schedule
2332
- </div>
2333
- <div class="card-body p-1 designer-auto-update row">
2334
- <div data-bind="template: {name: 'report-schedule'}"></div>
2335
- </div>
2336
- </div>
2337
-
2338
- <!-- Access -->
2339
- <div class="card flex-fill expandable-panel" id="accessPanel"
2340
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('accessPanel')}, visible: adminMode() && !isFormulaField()">
2341
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('accessPanel')}">
2342
- <i class="fa fa-key"></i>Security
2343
- </div>
2344
-
2345
- <div data-bind="" class="card card-body">
2346
- <div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
2347
- </div>
2348
- </div>
2349
-
2350
- </div>
2351
- </div>
2352
- <hr />
2353
- </script>
2354
-
2355
- <script type="text/html" id="report-designer">
2356
- <div class="modal-dialog modal-dialog-scrollable" style="height: 100vh;" id="report-designer-modal">
2357
- <div class="modal-content" style="display: flex; flex-direction: column; height: 100%;">
2358
- <div class="modal-header">
2359
- <h5 class="modal-title" id="myModalLabel">
2360
- <a title="Need help setting up a report?" target="_blank" href="https://dotnetreport.com/blogs/docs/designing-reports"><span class="fa fa-question-circle"></span></a> Design your Report
2361
- </h5>
2362
- <button type="button" class="btn-close" data-bs-dismiss="modal" data-bind="click: onModalCloseClicked" aria-label="Close"></button>
2363
- </div>
2364
- <div class="modal-body needs-validation" style="overflow-y: auto; flex-grow: 1;">
2365
- <div class="row">
2366
- <div class="col-md-4">
2367
- <div class="card card-body" id="choose-data-card" style="min-height: calc(100vh - 200px);">
2368
- <div class="form-group row align-items-center">
2369
- <label class="col-sm-4 col-form-label h6">
2370
- <i class="fa fa-file"></i> Report Name
2371
- </label>
2372
- <div class="col-sm-8">
2373
- <input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
2374
- </div>
2375
- </div>
2376
- <hr />
2377
- <h5><span class="fa fa-database"></span>&nbsp;Choose Data for Report</h5>
2378
- <div data-bind="template: 'designer-choose-data'"></div>
2379
- </div>
2380
- <br />
2381
-
2382
- <div class="card card-body">
2383
-
2384
- <div class="form-group row">
2385
- <label class="control-label h6">
2386
- <i class="fa fa-info-circle"></i> Report Description
2387
- </label>
2388
- <div>
2389
- <textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
2390
- </div>
2391
- </div>
2392
- <div class="checkbox" data-bind="visible: CanSaveReports()">
2393
- <label>
2394
- <input type="checkbox" data-bind="checked: SaveReport">
2395
- Save Report
2396
- </label>
2397
- </div>
2398
- <div class="form-group row" data-bind="visible: SaveReport">
2399
- <label class="control-label h6">
2400
- <i class="fa fa-folder-open"></i> Choose Folder
2401
- </label>
2402
- <div>
2403
- <select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
2404
- </div>
2405
- </div>
2406
- </div>
2407
- </div>
2408
- <div class="col-md-8">
2409
- <div class="card card-body">
2410
- <h5><span class="fa fa-file"></span>&nbsp;Choose Visualization</h5>
2411
- <div style="overflow-x: auto; white-space: nowrap;">
2412
- <div data-bind="template: 'designer-choose-visual'"></div>
2413
- </div>
2414
- </div>
2415
- <div>
2416
- <div data-bind="if: isFunctionField" class="custom-field-design">
2417
- <br />
2418
- <br />
2419
- <div class="card">
2420
- <div class="card-body">
2421
- <div class="row">
2422
- <div class="col-md-12 pull-right">
2423
- <a href="#" class="btn btn-primary btn-sm" title="Save Custom Function Field" data-bind="click: saveFunctionField, visible: isFunctionField">Save</a>
2424
- <a href="#" class="btn btn-sm" title="Custom Field using Function" data-bind="click: function(){isFunctionField(!isFunctionField())}, text: isFunctionField()? 'Cancel': 'Function', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
2425
- </div>
2426
- <div class="col-md-12 padded-div" data-bind="visible: isFunctionField()">
2427
- <div class="alert alert-info">
2428
- You are now creating a Customized Field using Functions available.
2429
- </div>
2430
- </div>
2431
- </div>
2432
-
2433
- <div class="form-group row">
2434
- <label class="col-sm-2 control-label">Field Label</label>
2435
- <div class="col-sm-10">
2436
- <input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
2437
- </div>
2438
- </div>
2439
- <div class="form-group row">
2440
- <label class="col-sm-2 control-label">Data Format</label>
2441
- <div class="col-sm-10">
2442
- <select class="form-select form-control-sm" data-bind="value: formulaDataFormat" required>
2443
- <option>String</option>
2444
- <option>Integer</option>
2445
- <option>Decimal</option>
2446
- <option>Currency</option>
2447
- <option>Date</option>
2448
- <option value="DateTime">Date and Time</option>
2449
- </select>
2450
- </div>
2451
- </div>
2452
- <div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
2453
- <label class="col-sm-2 control-label">Round to Decimal Places</label>
2454
- <div class="col-sm-10">
2455
- <input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
2456
- </div>
2457
- </div>
2458
-
2459
- <div>
2460
- Define your Function:
2461
- <textarea id="function-code"></textarea>
2462
- </div>
2463
- </div>
2464
- </div>
2465
- <div class="clearfix"></div>
2466
- </div>
2467
-
2468
- <div data-bind="if: lastPickedField() && lastPickedField().fieldType == 'Json'">
2469
- <br />
2470
- <div class="card">
2471
- <div class="card-header">
2472
- <h6>Select Data Fields from <span data-bind="text: lastPickedField().fieldName"></span></h6>
2473
- </div>
2474
- <div class="card-body">
2475
- <div class="row container-fluid" data-bind="foreach: jsonFields">
2476
- <div class="col-md-3 col-sm-4 col-xs-6 list-group">
2477
- <div class="list-group-item">
2478
- <div class="checkbox">
2479
- <label>
2480
- <input type="checkbox" data-bind="checkedInArray: {array: $parent.SelectedFields, value: $data}">
2481
- <span data-bind="text: jsonColumnName"></span>
2482
- </label>
2483
- </div>
2484
- </div>
2485
- </div>
2486
- </div>
2487
- </div>
2488
- </div>
2489
- </div>
2490
-
2491
- <div id="customFieldSection" data-bind="if: isFormulaField" class="custom-field-design">
2492
- <br />
2493
- <br />
2494
- <div class="card">
2495
- <div class="card-header">
2496
- <b>Build Custom Field</b>
2497
- </div>
2498
- <div class="card-body" data-bind="template: 'custom-field-designer'">
2499
-
2500
- </div>
2501
- </div>
2502
- <div class="clearfix"></div>
2503
- </div>
2504
- </div>
2505
- <br />
2506
- <div class="card card-body">
2507
- <div class="row">
2508
- <h5 class="col-8 pull-left"><span class="fa fa-table"></span>&nbsp;Selected data for the Report</h5>
2509
- <div class="col-4 pull-right right-align">
2510
- <a href="#" class="small text-muted" data-bind="visible: SelectedFields().length, click: function() {SelectedFields([]);}">Clear all</a>
2511
- </div>
2512
- </div>
2513
-
2514
- <div data-bind="template: 'designer-selected-data'"></div>
2515
- </div>
2516
- <div data-bind="if: linkedReportFields().length > 0">
2517
- <br />
2518
- <div class="card mb-4">
2519
- <div class="card-header bg-light">
2520
- <h5 class="mb-0">
2521
- <i class="fa fa-bookmark"></i> Include Sub Reports
2522
- </h5>
2523
- </div>
2524
- <div class="card-body">
2525
- <div data-bind="template: 'designer-sub-report'"></div>
2526
- </div>
2527
- </div>
2528
- </div>
2529
- <div data-bind="visible: ReportType()=='Html'">
2530
- <br />
2531
- <div class="card mb-4">
2532
- <div class="card-header bg-light">
2533
- <h5 class="mb-0">
2534
- <i class="fa fa-pencil"></i> Design your Report
2535
- </h5>
2536
- </div>
2537
- <div class="card-body">
2538
- <div data-bind="template: 'designer-html'"></div>
2539
- </div>
2540
- </div>
2541
- </div>
2542
- <br />
2543
- <div class="card card-body">
2544
- <h5><span class="fa fa-filter"></span>&nbsp;Choose Filters</h5>
2545
-
2546
- <div class="row" style="padding: 10px 10px; overflow-x: auto;">
2547
- <div data-bind="if: useStoredProc" class="col-md-12">
2548
- <div data-bind="template: {name: 'filter-parameters'}"></div>
2549
- </div>
2550
- <div data-bind="ifnot: useStoredProc" class="col-md-12">
2551
- <div data-bind="template: {name: 'filter-group'}"></div>
2552
- </div>
2553
-
2554
- <div class="checkbox col-12">
2555
- <label>
2556
- <input type="checkbox" data-bind="checked: EditFiltersOnReport" />
2557
- Allow setting up and saving filters on Report
2558
- </label>
2559
- </div>
2560
- <br />
2561
- </div>
2562
- </div>
2563
- <br />
2564
- <div data-bind="hidden: useStoredProc" class="card card-body">
2565
- <h5><span class="fa fa-sort"></span>&nbsp;Choose Sorting</h5>
2566
- <div data-bind="template: 'designer-sort'"></div>
2567
- </div>
2568
- <br />
2569
- <div data-bind="visible: SaveReport" class="card card-body">
2570
- <h5><span class="fa fa-hourglass"></span>&nbsp;Choose Schedule</h5>
2571
-
2572
- <div style="padding: 10px 10px" data-bind="if: SaveReport">
2573
- <div data-bind="template: {name: 'report-schedule'}"></div>
2574
- </div>
2575
- </div>
2576
- <br />
2577
- <div data-bind="ifnot: useStoredProc">
2578
- <div class="card card-body">
2579
- <div data-bind="template: 'designer-options'"></div>
2580
- </div>
2581
- </div>
2582
- <br />
2583
- <div data-bind="visible: adminMode" class="card card-body">
2584
- <div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
2585
- </div>
2586
-
2587
- </div>
2588
- </div>
2589
- </div>
2590
- <div class="modal-footer">
2591
- <button class="btn btn-primary" data-bind="visible: adminMode, click: RunReportSqlPreview">
2592
- <i class="fa fa-code"></i> Preview Report Code
2593
- </button>
2594
- <a href="#" class="btn btn-danger" data-bind="click: cancelCreateReport">Cancel editing Report</a>
2595
- <button class="btn btn-primary" type="button" data-bind="visible: SaveReport() && CanSaveReports(), click: SaveWithoutRun" style="padding-right: 10px;">Save Report</button>
2596
- <button class="btn btn-primary" type="button" data-bind="text: SaveReport() && CanSaveReports()? 'Save & Run Report': 'Run Report', click: RunReport">Run Report</button>
2597
- </div>
2598
-
2599
- </div>
2600
- </div>
2601
- </script>
2602
-
2603
- <script type="text/html" id="chart-settings">
2604
- <div class="chart-container pull-right">
2605
- <button class="btn btn-light btn-sm d-flex align-items-center mt-2 chart-settings-btn"
2606
- data-bind="click: toggleChartSettings" title="Report settings">
2607
- <i class="fa fa-cog"></i>
2608
- </button>
2609
-
2610
- <div class="chart-settings-panel border p-2 shadow-sm bg-light" data-bind="visible: showSettings">
2611
- <div class="d-flex justify-content-between align-items-center mb-2">
2612
- <button class="btn btn-sm btn-close" data-bind="click: toggleChartSettings"></button>
2613
- <h6 class="mb-0">Report Settings</h6>
2614
- </div>
2615
- <ul class="nav nav-tabs nav-sm mb-2 small" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
2616
- <li class="nav-item">
2617
- <a class="nav-link"
2618
- data-bs-toggle="tab"
2619
- data-bind="attr: { href: '#chartTab-' + ReportID() }, css: { active: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
2620
- Chart
2621
- </a>
2622
- </li>
2623
- <li class="nav-item">
2624
- <a class="nav-link"
2625
- data-bs-toggle="tab"
2626
- data-bind="attr: { href: '#tableTab-' + ReportID() }, css: { active: !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
2627
- Table
2628
- </a>
2629
- </li>
2630
- </ul>
2631
- <div class="tab-content small">
2632
- <div class="tab-pane fade"
2633
- data-bind="attr: { id: 'chartTab-' + ReportID() }, css: { 'show active': ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
2634
- <div class="mb-2">
2635
- <div class="btn-group" role="group" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
2636
- <button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Bar Chart"
2637
- data-bind="css: { 'active': ReportType() === 'Bar' }, click: function() { ReportType('Bar'); }">
2638
- <span class="fa fa-bar-chart"></span>
2639
- </button>
2640
- <button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Pie Chart"
2641
- data-bind="css: { 'active': ReportType() === 'Pie' }, click: function() { ReportType('Pie'); }">
2642
- <span class="fa fa-pie-chart"></span>
2643
- </button>
2644
- <button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Line Chart"
2645
- data-bind="css: { 'active': ReportType() === 'Line' }, click: function() { ReportType('Line'); }">
2646
- <span class="fa fa-line-chart"></span>
2647
- </button>
2648
- </div>
2649
- </div>
2650
- <div data-bind="visible: ReportType()=='Bar'">
2651
- <div class="form-group row">
2652
- <div class="checkbox col-6">
2653
- <label><input type="checkbox" data-bind="checked: barChartHorizontal" /> Horizontal</label>
2654
- </div>
2655
- <div class="checkbox col-6">
2656
- <label><input type="checkbox" data-bind="checked: barChartStacked" /> Stacked</label>
2657
- </div>
2658
- </div>
2659
- </div>
2660
- <div data-bind="visible: ReportType()=='Pie'">
2661
- <div class="form-group row">
2662
- <div class="checkbox col-6">
2663
- <label><input type="checkbox" data-bind="checked: pieChartDonut" /> Donut</label>
2664
- </div>
2665
- </div>
2666
- </div>
2667
- <div data-bind="visible: ReportType()=='Line'">
2668
- <div class="form-group row">
2669
- <div class="checkbox col-6">
2670
- <label><input type="checkbox" data-bind="checked: lineChartArea" /> Area</label>
2671
- </div>
2672
- </div>
2673
- </div>
2674
- <div class="mb-2">
2675
- <label class="form-label small">Background Color</label>
2676
- <div class="d-flex align-items-center flex-wrap">
2677
- <input type="color" class="color-picker" data-bind="value: chartOptions().backgroundColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
2678
- </div>
2679
- </div>
2680
- <div class="mb-2">
2681
- <label class="form-label small">Font Color</label>
2682
- <div class="d-flex align-items-center flex-wrap">
2683
- <input type="color" class="color-picker" data-bind="value: chartOptions().fontColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
2684
- </div>
2685
- </div>
2686
- <div class="mb-2">
2687
- <label class="form-label small">Series Colors</label>
2688
- <div class="d-flex flex-wrap" data-bind="foreach: chartOptions().seriesColors">
2689
- <div class="color-box me-2">
2690
- <input type="color" class="color-picker"
2691
- data-bind="value: $data, event: { input: function(data, event) { $parent.updateSeriesColor($index(), event.target.value); } }">
2692
- <button class="btn btn-sm btn-danger remove-color" data-bind="click: $parent.removeSeriesColor">&times;</button>
2693
- </div>
2694
- </div>
2695
- <button class="color-box btn btn-sm btn-secondary" data-bind="click: addSeriesColor" title="Add Series Color" style="margin-top: -7px;">
2696
- <i class="fa fa-plus"></i>
2697
- </button>
2698
- </div>
2699
- <div class="d-flex justify-content-between mb-1">
2700
- <div>
2701
- <label class="form-label small">Legend Position</label>
2702
- <select class="form-select form-select-sm" data-bind="value: chartOptions().legendPosition, event: { change: updateChart }">
2703
- <option value="right">Right</option>
2704
- <option value="top">Top</option>
2705
- <option value="bottom">Bottom</option>
2706
- <option value="none">None</option>
2707
- </select>
2708
- </div>
2709
- <div>
2710
- <label class="form-label small">Font Size</label>
2711
- <input type="number" class="form-control form-control-sm font-size-input" data-bind="value: chartOptions().fontSize, event: { change: updateChart }">
2712
- </div>
2713
- </div>
2714
- <div data-bind="visible: ReportType()!='Pie'">
2715
- <div class="form-check form-switch small mb-1">
2716
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showXAxisLabel, event: { change: updateChart }">
2717
- <label class="form-check-label">X-Axis Label</label>
2718
- </div>
2719
- <div class="form-check form-switch small mb-1">
2720
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showYAxisLabel, event: { change: updateChart }">
2721
- <label class="form-check-label">Y-Axis Label</label>
2722
- </div>
2723
- <div class="form-check form-switch small mb-1" data-bind="visible: ReportType() !== 'Pie'">
2724
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showGridlines, event: { change: updateChart }">
2725
- <label class="form-check-label">Gridlines</label>
2726
- </div>
2727
- <div class="form-check form-switch small mb-1">
2728
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showSmallValuesOnLabel, event: { change: updateChart }">
2729
- <label class="form-check-label">Show Small Values On Label</label>
2730
- </div>
2731
- <div class="form-group small mb-1">
2732
- <label class="form-label">Y-Axis Format</label>
2733
- <input type="text" class="form-control form-control-sm" placeholder="#,##0.00" data-bind="value: chartOptions().yAxisFormat, event: { change: updateChart }" />
2734
- </div>
2735
- <div class="form-group small mb-1 d-flex gap-2">
2736
- <div class="w-50">
2737
- <label class="form-label">Y-Axis Min</label>
2738
- <input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMin, event: { change: updateChart }" />
2739
- </div>
2740
- <div class="w-50">
2741
- <label class="form-label">Y-Axis Max</label>
2742
- <input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMax, event: { change: updateChart }" />
2743
- </div>
2744
- </div>
2745
- </div>
2746
- </div>
2747
-
2748
- <div class="tab-pane fade"
2749
- data-bind="attr: { id: 'tableTab-' + ReportID() }, css: { 'show active': !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
2750
- <div class="form-group row">
2751
- <div class="mb-2 col-6">
2752
- <label class="form-label small">Header Back Color</label><br />
2753
- <input type="color" class="color-picker"
2754
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} , value: tableSettings().headerBackColor, event: { change: updateTable }"/>
2755
- </div>
2756
- <div class="mb-2 col-6">
2757
- <label class="form-label small">Header Font Color</label><br />
2758
- <input type="color" class="color-picker"
2759
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().headerFontColor, event: { change: updateTable }"/>
2760
- </div>
2761
- </div>
2762
- <div class="form-group row">
2763
- <div class="mb-2 col-6">
2764
- <label class="form-label small">Row Back Color</label><br />
2765
- <input type="color" class="color-picker"
2766
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowBackColor, event: { change: updateTable }"/>
2767
- </div>
2768
- <div class="mb-2 col-6">
2769
- <label class="form-label small">Row Font Color</label><br />
2770
- <input type="color" class="color-picker"
2771
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowFontColor, event: { change: updateTable }"/>
2772
- </div>
2773
- </div>
2774
- <div class="form-group row" style="display: none;">
2775
- <div class="mb-2 col-6">
2776
- <label class="form-label small">Alt Row Back Color</label><br />
2777
- <input type="color" class="color-picker"
2778
- data-bind="value: tableSettings().altRowBackColor, event: { change: updateTable }"/>
2779
- </div>
2780
- <div class="mb-2 col-6">
2781
- <label class="form-label small">Alt Row Font Color</label>
2782
- <input type="color" class="color-picker"
2783
- data-bind="value: tableSettings().altRowFontColor, event: { change: updateTable }"/>
2784
- </div>
2785
- </div>
2786
- <div class="form-group mb-2" style="display: none;">
2787
- <label class="form-label small">Borders</label>
2788
- <div class="btn-group d-flex flex-wrap">
2789
- <button type="button" class="btn btn-light btn-sm flex-fill"
2790
- data-bind="click: function(){ tableSettings().border('none'); updateTable(); }, css: { active: tableSettings().border === 'none' }">None</button>
2791
- <button type="button" class="btn btn-light btn-sm flex-fill"
2792
- data-bind="click: function(){ tableSettings().border('all'); updateTable(); }, css: { active: tableSettings().border === 'all' }">All</button>
2793
- <button type="button" class="btn btn-light btn-sm flex-fill"
2794
- data-bind="click: function(){ tableSettings().border('outer'); updateTable(); }, css: { active: tableSettings().border === 'outer' }">Outside</button>
2795
- <button type="button" class="btn btn-light btn-sm flex-fill"
2796
- data-bind="click: function(){ tableSettings().border('inner'); updateTable(); }, css: { active: tableSettings().border === 'inner' }">Inside</button>
2797
- </div>
2798
- </div>
2799
- <div class="form-group row">
2800
- <div class="mb-2 col-6" style="display: none;">
2801
- <label class="form-label small">Border Color</label>
2802
- <input type="color" class="color-picker"
2803
- data-bind="value: tableSettings().borderColor, event: { change: updateTable }"/>
2804
- </div>
2805
- <div class="mb-2 col-6 d-flex align-items-end">
2806
- <button class="btn btn-sm small btn-outline-secondary" data-bind="click: clearTableSettings">
2807
- Clear
2808
- </button>
2809
- </div>
2810
- </div>
2811
- </div>
2812
- </div>
2813
- </div>
2814
- </div>
2815
- </script>
2816
-
2817
- <div class="modal" id="drilldownModal" tabindex="-1" role="dialog" aria-hidden="true">
2818
- <div class="modal-dialog modal-lg">
2819
- <div class="modal-content" data-bind="with: ChartDrillDownData">
2820
- <div class="modal-header">
2821
- <h4 class="modal-title">Drilldown Data</h4>
2822
- <button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
2823
- </div>
2824
- <!-- ko if: DrillDownData -->
2825
- <div class="modal-body">
2826
- <div style="overflow-x: auto; max-height: 500px; overflow-y: auto;">
2827
- <table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData, attr: {class: 'table table-striped table-hover table-condensed ' + $parent.selectedStyle()}">
2828
- <thead style="position: sticky; top: -1px; z-index: 2;">
2829
- <tr class="no-highlight">
2830
- <!-- ko foreach: Columns -->
2831
- <th data-bind="attr: { id: fieldId }, css: {'right-align': IsNumeric}, style: {'width': fieldWidth, 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
2832
- <span data-bind="text: fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName), style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
2833
- </th>
2834
- <!-- /ko -->
2835
- </tr>
2836
- </thead>
2837
- <tbody>
2838
- <tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
2839
- <td data-bind="attr:{colspan: Columns.length}">
2840
- No records found
2841
- </td>
2842
- </tr>
2843
- <!-- ko foreach: Rows -->
2844
- <tr>
2845
- <!-- ko foreach: Items -->
2846
- <td data-bind="hidden: outerGroup, style: {'background-color': backColor, 'color': fontColor, 'font-weight': fontBold() ? 'bold' : 'normal' }">
2847
- <div data-bind="style: {'width': fieldWidth }">
2848
- <!-- ko if: LinkTo-->
2849
- <a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
2850
- <!-- /ko-->
2851
- <!-- ko ifnot: LinkTo-->
2852
- <span data-bind="html: formattedVal"></span>
2853
- <!-- /ko-->
2854
- </div>
2855
- </td>
2856
- <!-- /ko-->
2857
- </tr>
2858
- <!-- /ko -->
2859
- </tbody>
2860
- </table>
2861
- </div>
2862
- </div>
2863
- <div class="modal-footer">
2864
- <div class="col-xs-12 col-centered" data-bind="with: pager">
2865
- <div class="form-inline small text-muted">
2866
- <div class="pull-left total-records" data-bind="visible: pages()">
2867
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span>
2868
- </div>
2869
- <div class="pull-left">
2870
- <button class="btn btn-xs" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></button>
2871
- <button class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
2872
- <span class="fa fa-code"></span> View Code
2873
- </button>
2874
- </div>
2875
- <div class="form-group pull-right" data-bind="visible: pages()">
2876
- <div data-bind="template: 'pager-template', data: $data"></div>
2877
- </div>
2878
- </div>
2879
- </div>
2880
- </div>
2881
- <!-- /ko -->
2882
- </div>
2883
- </div>
2884
- </div>
2885
-
2886
- <div class="modal" id="sqlModal" tabindex="-1" role="dialog" aria-hidden="true">
2887
- <div class="modal-dialog modal-lg">
2888
- <div class="modal-content">
2889
- <div class="modal-header d-flex justify-content-between align-items-center">
2890
- <h4 class="modal-title">Report Code</h4>
2891
- <button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
2892
- data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
2893
- <i class="fa fa-clipboard"></i>&nbsp;Copy
2894
- </button>
2895
- <button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
2896
- </div>
2897
- <div class="modal-body" data-bind="with: ReportResult">
2898
- <div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
2899
- <pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
2900
- </div>
2901
- </div>
2902
- </div>
2903
- </div>
2904
- </div>
2905
-
2906
- <div class="modal" id="sqlDrillDownModal" tabindex="-1" role="dialog" aria-hidden="true">
2907
- <div class="modal-dialog modal-lg">
2908
- <div class="modal-content" data-bind="with:ChartDrillDownData">
2909
- <div class="modal-header d-flex justify-content-between align-items-center">
2910
- <h4 class="modal-title">Drill Down Report Code</h4>
2911
- <button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
2912
- data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
2913
- <i class="fa fa-clipboard"></i>&nbsp;Copy
2914
- </button>
2915
- <button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
2916
- </div>
2917
- <div class="modal-body" data-bind="with:DrillDownData">
2918
- <div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
2919
- <pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
2920
- </div>
2921
- </div>
2922
- </div>
2923
- </div>
2924
- </div>
2925
- <div class="modal" id="noaccountModal" tabindex="-1" role="dialog" aria-hidden="true">
2926
- <div class="modal-dialog">
2927
- <div class="modal-content">
2928
- <div class="modal-header">
2929
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
2930
- <h4 class="modal-title">Account not Setup</h4>
2931
- </div>
2932
- <div class="modal-body">
2933
- <p class="alert alert-danger">dotnet Report Account Configuration missing!</p>
2934
- <p>You do not have the neccessary initial configuration completed to use dotnet Report.</p>
2935
- <p>Please view the <a href="https://dotnetreport.com/blogs/getting-started-with-dotnet-report/" target="_blank">Getting Started Guide</a> to correctly configure dotnet Report.</p>
2936
- </div>
2937
- <div class="modal-footer">
2938
- <button type="button" class="btn btn-default" data-bs-dismiss="modal">Close</button>
2939
- </div>
2940
- </div>
2941
- </div>
2942
- </div>
2943
- <script type="text/html" id="pdf-options-schedule-template">
2944
- <div class="modal-dialog modal-dialog-centered">
2945
- <div class="modal-content" data-bind="with: PdfPage">
2946
- <div class="modal-header">
2947
- <h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
2948
- <i class="fa fa-file-pdf-o me-2"></i> Set PDF Page Size
2949
- </h5>
2950
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
2951
- </div>
2952
- <div class="modal-body row g-0">
2953
- <div class="col-md-5 d-flex justify-content-center align-items-center">
2954
- <div id="pagePreviewBox" class="text-center">
2955
- <div data-bind="style: {
2956
- width: selectedWidth(),
2957
- height: selectedHeight(),
2958
- backgroundColor: selectedBackgroundStyle(),
2959
- transition: 'all 0.3s ease'
2960
- }"
2961
- class="shadow rounded mx-auto mb-2 border position-relative">
2962
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
2963
- </div>
2964
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
2965
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
2966
- </div>
2967
- </div>
2968
- <div class="col-md-7">
2969
- <div class="mb-3">
2970
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
2971
- <select class="form-select" id="pageSizeSelect"
2972
- data-bind="options: availablePageSizes,
2973
- optionsText: 'label',
2974
- optionsValue: 'value',
2975
- value: selectedPageSize">
2976
- </select>
2977
- </div>
2978
- <div class="mb-3">
2979
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
2980
- <select class="form-select" id="pageOrientationSelect"
2981
- data-bind="options: availablePageOrientation,
2982
- optionsText: 'label',
2983
- optionsValue: 'value',
2984
- value: selectedPageOrientation">
2985
- </select>
2986
- </div>
2987
- <div class="alert alert-info p-2 small mt-2">
2988
- This PDF will be exported using the selected page size. Ensure your content fits well.
2989
- If the content width exceeds the selected size, it will default to Letter.
2990
- </div>
2991
- </div>
2992
- </div>
2993
- <div class="modal-footer">
2994
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
2995
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
2996
- Save
2997
- </button>
2998
- </div>
2999
- </div>
3000
- </div>
3001
- </script>
3002
- <script type="text/html" id="word-options-schedule-template">
3003
- <div class="modal-dialog modal-dialog-centered">
3004
- <div class="modal-content" data-bind="with: WordPage">
3005
- <div class="modal-header">
3006
- <h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
3007
- <i class="fa fa-file-pdf-o me-2"></i> Set WORD Page Size
3008
- </h5>
3009
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
3010
- </div>
3011
- <div class="modal-body row g-0">
3012
- <div class="col-md-5 d-flex justify-content-center align-items-center">
3013
- <div id="pagePreviewBox" class="text-center">
3014
- <div data-bind="style: {
3015
- width: selectedWidth(),
3016
- height: selectedHeight(),
3017
- backgroundColor: selectedBackgroundStyle(),
3018
- transition: 'all 0.3s ease'
3019
- }"
3020
- class="shadow rounded mx-auto mb-2 border position-relative">
3021
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
3022
- </div>
3023
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
3024
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
3025
- </div>
3026
- </div>
3027
- <div class="col-md-7">
3028
- <div class="mb-3">
3029
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
3030
- <select class="form-select" id="pageSizeSelect"
3031
- data-bind="options: availablePageSizes,
3032
- optionsText: 'label',
3033
- optionsValue: 'value',
3034
- value: selectedPageSize">
3035
- </select>
3036
- </div>
3037
- <div class="mb-3">
3038
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
3039
- <select class="form-select" id="pageOrientationSelect"
3040
- data-bind="options: availablePageOrientation,
3041
- optionsText: 'label',
3042
- optionsValue: 'value',
3043
- value: selectedPageOrientation">
3044
- </select>
3045
- </div>
3046
- <div class="alert alert-info p-2 small mt-2">
3047
- This WORD will be exported using the selected page size. Ensure your content fits well.
3048
- If the content width exceeds the selected size, it will default to Letter.
3049
- </div>
3050
- </div>
3051
- </div>
3052
- <div class="modal-footer">
3053
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3054
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
3055
- Save
3056
- </button>
3057
- </div>
3058
- </div>
3059
- </div>
3060
- </script>
3061
- <script type="text/html" id="word-options-template">
3062
- <div class="modal-dialog modal-dialog-centered">
3063
- <div class="modal-content" data-bind="with: WordPage">
3064
- <div class="modal-header">
3065
- <h5 class="modal-title" id="wordOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to WORD</h5>
3066
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
3067
- </div>
3068
- <div class="modal-body row g-0">
3069
- <!-- Left Side: Page Preview SVG -->
3070
- <div class="col-md-5 d-flex justify-content-center align-items-center">
3071
- <div id="pagePreviewBox" class="text-center">
3072
- <div data-bind="style: {
3073
- width: selectedWidth(),
3074
- height: selectedHeight(),
3075
- backgroundColor: selectedBackgroundStyle(),
3076
- transition: 'all 0.3s ease'
3077
- }"
3078
- class="shadow rounded mx-auto mb-2 border position-relative">
3079
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
3080
- </div>
3081
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
3082
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
3083
- </div>
3084
- </div>
3085
-
3086
- <!-- Right Side: Form Options -->
3087
- <div class="col-md-7">
3088
- <div class="mb-3">
3089
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
3090
- <select class="form-select" id="pageSizeSelect"
3091
- data-bind="options: availablePageSizes,
3092
- optionsText: 'label',
3093
- optionsValue: 'value',
3094
- value: selectedPageSize">
3095
- </select>
3096
- </div>
3097
- <div class="mb-3">
3098
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
3099
- <select class="form-select" id="pageOrientationSelect"
3100
- data-bind="options: availablePageOrientation,
3101
- optionsText: 'label',
3102
- optionsValue: 'value',
3103
- value: selectedPageOrientation">
3104
- </select>
3105
- </div>
3106
- <div class="alert alert-info p-2 small mt-2">
3107
- This Word will be exported using the selected page size. Ensure your content fits well.
3108
- If the content width exceeds the selected size, it will default to Letter.
3109
- </div>
3110
- </div>
3111
- </div>
3112
- <div class="modal-footer">
3113
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3114
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
3115
- <i class="fa fa-download me-1"></i> Download WORD
3116
- </button>
3117
- </div>
3118
- </div>
3119
- </div>
3120
- </script>
3121
- <script type="text/html" id="pdf-options-template">
3122
- <div class="modal-dialog modal-dialog-centered">
3123
- <div class="modal-content" data-bind="with: PdfPage">
3124
- <div class="modal-header">
3125
- <h5 class="modal-title" id="pdfOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to PDF</h5>
3126
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
3127
- </div>
3128
- <div class="modal-body row g-0">
3129
- <!-- Left Side: Page Preview SVG -->
3130
- <div class="col-md-5 d-flex justify-content-center align-items-center">
3131
- <div id="pagePreviewBox" class="text-center">
3132
- <div data-bind="style: {
3133
- width: selectedWidth(),
3134
- height: selectedHeight(),
3135
- backgroundColor: selectedBackgroundStyle(),
3136
- transition: 'all 0.3s ease'
3137
- }"
3138
- class="shadow rounded mx-auto mb-2 border position-relative">
3139
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
3140
- </div>
3141
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
3142
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
3143
- </div>
3144
- </div>
3145
-
3146
- <!-- Right Side: Form Options -->
3147
- <div class="col-md-7">
3148
- <div class="mb-3">
3149
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
3150
- <select class="form-select" id="pageSizeSelect"
3151
- data-bind="options: availablePageSizes,
3152
- optionsText: 'label',
3153
- optionsValue: 'value',
3154
- value: selectedPageSize">
3155
- </select>
3156
- </div>
3157
- <div class="mb-3">
3158
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
3159
- <select class="form-select" id="pageOrientationSelect"
3160
- data-bind="options: availablePageOrientation,
3161
- optionsText: 'label',
3162
- optionsValue: 'value',
3163
- value: selectedPageOrientation">
3164
- </select>
3165
- </div>
3166
- <div class="alert alert-info p-2 small mt-2">
3167
- This PDF will be exported using the selected page size. Ensure your content fits well.
3168
- If the content width exceeds the selected size, it will default to Letter.
3169
- </div>
3170
- </div>
3171
- </div>
3172
- <div class="modal-footer">
3173
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3174
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
3175
- <i class="fa fa-download me-1"></i> Download PDF
3176
- </button>
3177
- </div>
3178
- </div>
3179
- </div>
3180
- </script>
3181
- `);
3182
- this.cdref.detectChanges();
3183
- }
3184
- bindWindowResize(vm) {
3185
- $(window).resize(function () {
3186
- if (vm.reportMode == "execute") {
3187
- vm.DrawChart();
3188
- }
3189
- ;
3190
- });
3191
- }
3192
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetreportComponent, deps: [{ token: i0.Injector }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: BASE_URL_TOKEN }, { token: i2.HttpClient }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
3193
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DotnetreportComponent, selector: "app-dotnetreport", ngImport: i0, template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n<div class=\"container-fluid\">\r\n <div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n <!--\r\n The markup code below is related to presentation. You don't have to change it, unless you\r\n intentionally want to change something in the Report Builder's behavior in your Application.\r\n It's Recommended you use it as is. You will be responsible for managing and maintaining any changes.\r\n -->\r\n <!-- Folders/Report List -->\r\n <div id=\"report-start\" data-bind=\"if: ReportMode() == 'start' || ReportMode() == 'generate'\">\r\n <div class=\"card folder-panel\" data-bind=\"visible: true\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\" data-bind=\"click: function() {SelectedFolder(null); designingHeader(false); searchReports(''); $('#search-report').val([]).trigger('change'); }\">Manage Reports</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav mr-auto\">\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanSaveReports() && appSettings.usePromptBuilder()) || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\"><i class=\"fa fa-sliders\"></i> Use Standard Designer</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReportAi\"><i class=\"fa fa-bolt\"></i> Use Smarter Designer</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: (SelectedFolder() ? SelectedFolder().canEdit : (CanSaveReports() || adminMode())) && !appSettings.usePromptBuilder()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n </li>\r\n <li class=\"nav-item\" data-bind=\"visible: CanManageFolders() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: ManageFolder.newFolder\">\r\n <span class=\"fa fa-folder-o\"></span> Add Folder\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanManageFolders() || adminMode()) && SelectedFolder()!=null && (SelectedFolder().canEdit || SelectedFolder().canDelete || adminMode())\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-folder\"></span> Folder Options\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.editFolder, visible: SelectedFolder() && (SelectedFolder().canEdit || adminMode())\">Edit Selected Folder</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.deleteFolder, visible: SelectedFolder() && (SelectedFolder().canDelete || adminMode())\">Delete Selected Folder</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: adminMode() && SelectedFolder() ==null\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: function(){ initHeaderDesigner(false); }\">\r\n <span class=\"fa fa-arrow-up\"></span> Report Header\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: appSettings.showImportExport() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-exchange\"></span> Import / Export\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function(){ selectMode(!selectMode()); }\">\r\n <span data-bind=\"css: selectMode() ? 'fa fa-check-square text-primary' : 'fa fa-square-o'\"></span>\r\n <span data-bind=\"text: selectMode() ? 'Cancel Select Mode' : 'Select Mode'\"></span>\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#uploadFileModal\" data-bind=\"visible: !selectMode()\" title=\"Import Report from JSON file\">\r\n <span class=\"fa fa-upload\"></span> Import Reports\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: selectMode, click: exportSelectedReportJson\">\r\n <span class=\"fa fa-download\"></span> Export Selected Reports\r\n </a>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"form-inline my-2 my-lg-0 ms-auto w-50\">\r\n <div class=\"input-group w-100\">\r\n <p id=\"search-input\" class=\"form-control search-input\" data-placeholder=\"Search Report by Name, Description or Data Field...\"></p>\r\n <span data-bind=\"click: searchForReports\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Search\"><i class=\"fa fa-search\"></i></span>\r\n <span data-bind=\"click: function() {resetQuery(true, true);}\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Clear Search\"><i class=\"fa fa-close\"></i></span>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"visible: designingHeader, with: headerDesigner\" style=\"display: none;\" class=\"overflow-auto\">\r\n <div class=\"checkbox\">\r\n <label>\r\n <input type=\"checkbox\" data-bind=\"checked: UseReportHeader\"> Use Report Header\r\n </label>\r\n </div>\r\n <div data-bind=\"visible: UseReportHeader\">\r\n <p class=\"alert alert-info\">\r\n You can design the common report header below that will be applied to all reports where report headers are turned on.\r\n </p>\r\n <div class=\"form-group row m-1\" data-bind=\"visible: clientListIds().length > 0\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Headers for other Clients saved</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <select class=\"form-control\"\r\n data-bind=\"options: clientListIds,\r\n value: selectedHeaderClientId,\r\n optionsCaption: 'No Client Id (Global)',\r\n event: { change: function () { loadHtmlHeader(true); } }\">\r\n </select>\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" class=\"fa fa-question-circle helptip\"\r\n title=\"Choose a client to design its report header\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group row m-1\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Specify Client Id to Restrict Access</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <input class=\"form-control text-box single-line\" type=\"text\" data-bind=\"value: headerClientId\">\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" data-placement=\"right\" class=\"fa fa-question-circle helptip\" title=\"Leave blank to give all clients access (Global Report Header)\"></span>\r\n </div>\r\n </div>\r\n <textarea id=\"report-header-editor\"></textarea>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n <div data-bind=\"visible: !UseReportHeader()\">\r\n <p class=\"alert alert-info\">\r\n If you turn off the <b>Use Report Header</b> option,\r\n the <b>Report Header</b> will not be applied in reports.\r\n </p>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: designingHeader\">\r\n <div class=\"btn-group pull-right\" role=\"group\">\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"List View\"\r\n data-bind=\"css: { 'active': layout() === 'list' }, click: toggleLayout\">\r\n <span class=\"fa fa-list\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"Icon View\"\r\n data-bind=\"css: { 'active': layout() === 'icons' }, click: toggleLayout\">\r\n <span class=\"fa fa-th-large\"></span>\r\n </button>\r\n </div>\r\n\r\n <div data-bind=\"if: layout()=='icons'\">\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <p>Please choose Folders below to view Reports</p>\r\n <ul class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <li data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-3x fa-folder text-secondary\"></span>\r\n <span class=\"desc\" data-bind=\"text: FolderName\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"clearfix\">\r\n <p class=\"pull-left\">Please choose a Report from this Folder</p>\r\n <div class=\"pull-right\">\r\n <a href=\"#\" class=\"btn btn-light\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); $('#search-report').val([]).trigger('change');}\">\r\n ..back to Folders\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"list-group list-overflow\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n This folder is empty.\r\n </div>\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n No Reports found matching your Search\r\n </div>\r\n <div class=\"list-group\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"list-group-item\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-7\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"pull-left me-2\" />\r\n <div class=\"fa fa-2x pull-left\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType.indexOf('Map')==0, 'fa-window-maximize': reportType=='Single', 'fa-random': reportType=='Pivot', 'fa-window-restore': reportType=='Treemap', 'fa-signal': reportType == 'Combo', 'fa-code': reportType == 'Html', 'fa-map': reportType == 'HeatMap'}\"></div>\r\n <div class=\"pull-left\">\r\n <h4>\r\n <a data-bind=\"click: runReport\" style=\"cursor: pointer\">\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </a>\r\n </h4>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n <p data-bind=\"text: reportDescription\"></p>\r\n <p data-bind=\"if: $parent.searchReports()\">\r\n <span class=\"fa fa-folder\"></span> <span data-bind=\"text: folderName\"></span>\r\n <span>\r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </span>\r\n </p>\r\n <div data-bind=\"if: $parent.adminMode\">\r\n <div class=\"small\">\r\n <b>Report Access</b><br />\r\n Manage by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></span>\r\n <br />\r\n View only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: (viewOnlyUserId ? viewOnlyUserId : (userId ? userId : 'Any User'))\"></span>\r\n <br />\r\n <div data-bind=\"if: deleteOnlyUserId\">\r\n Delete only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserId\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: userRole\">\r\n Manage by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: viewOnlyUserRole\">\r\n View only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: viewOnlyUserRole ? viewOnlyUserRole : 'Any Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: deleteOnlyUserRole\">\r\n Delete only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserRole ? deleteOnlyUserRole : 'Same as Manage'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: clientId\">\r\n For Client <span class=\"label label-info\" data-bind=\"text: clientId ? clientId : 'Any'\"></span>\r\n <br />\r\n </div>\r\n <div>\r\n Direct Link to Run Report: <a data-bind=\"attr: {href: '/DotNetReport/?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n &nbsp;<a href=\"#\" data-bind=\"click: navigator.clipboard.writeText(window.location.href + '?linkedreport=true&noparent=true&reportId=' + reportId )\"><span class=\"fa fa-copy\" title=\"Click to Copy Link\"></span></a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-5 right-align\">\r\n <div class=\"d-none d-md-block\">\r\n <br />\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode() \">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span> Edit\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: copyReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span> Copy\r\n </button>\r\n </span>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span> Run\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </div>\r\n </div>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span> Delete\r\n </button>\r\n <br />\r\n </div>\r\n\r\n <div class=\"d-block d-md-none\">\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode()\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Edit Report\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button class=\"btn btn-sm btn-light\" data-bind=\"click: copyReport, visible: canEdit\" title=\"Copy Report\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span>\r\n </button>\r\n </span>\r\n\r\n <div class=\"btn-group\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\" title=\"Run Report\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel with inner rows\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Delete Report\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: layout()=='list'\">\r\n <div class=\"file-explorer-container\">\r\n <nav class=\"breadcrumb\">\r\n <a href=\"#\" class=\"breadcrumb-item\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); }\">\r\n All Folders\r\n </a>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: SelectedFolder && !searchReports(), text: SelectedFolder()?.FolderName\"></span>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: searchReports\">\r\n Search Results\r\n </span>\r\n </nav>\r\n\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-6\">Name</div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: adminMode\">Access Control</div>\r\n </div>\r\n <div class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <div class=\"row clickable py-2 border-bottom align-items-center w-100\" data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <div class=\"col-md-6 d-flex align-items-center\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-folder text-secondary me-2\"></span>\r\n <span data-bind=\"text: FolderName\"></span>\r\n </div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: $parent.adminMode\">\r\n <!--<div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>-->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n <p class=\"text-muted\">This folder is empty.</p>\r\n </div>\r\n\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n <p class=\"text-center text-muted\">No reports found matching your search.</p>\r\n </div>\r\n <div data-bind=\"if: reportsInFolder().length > 0 || reportsInSearch().length > 0\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-4\">Name</div>\r\n <div class=\"col-md-1\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: searchReports()\">Folder</div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: adminMode\">Access</div>\r\n <div class=\"col-md-1\" data-bind=\"visible: adminMode\">Direct Link</div>\r\n </div>\r\n\r\n <div class=\"report-list\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"row border-bottom py-2 align-items-center w-100\">\r\n <div class=\"col-md-4 d-flex align-items-center\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"me-2\" />\r\n <span class=\"fa\" data-bind=\"css: {\r\n 'fa-file': reportType=='List',\r\n 'fa-th-list': reportType=='Summary',\r\n 'fa-bar-chart': reportType=='Bar',\r\n 'fa-pie-chart': reportType=='Pie',\r\n 'fa-line-chart': reportType=='Line',\r\n 'fa-signal': reportType=='Combo',\r\n 'fa-globe': reportType.indexOf('Map')==0,\r\n 'fa-window-maximize': reportType=='Single',\r\n 'fa-random': reportType=='Pivot',\r\n 'fa-window-restore': reportType=='Treemap',\r\n 'fa-code': reportType == 'Html',\r\n 'fa-map': reportType == 'HeatMap'\r\n }\"></span>\r\n <a class=\"ms-2\" data-bind=\"click: runReport, highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\" style=\"cursor: pointer\"></a>&nbsp;\r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </div>\r\n\r\n <div class=\"col-md-1\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-sm\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-h\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: openReport, visible: canEdit\">\r\n <span class=\"fa fa-edit\"></span> Edit\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: copyReport, visible: canEdit\">\r\n <span class=\"fa fa-copy\"></span> Copy\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item text-danger\" href=\"#\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\"></span> Delete\r\n </a>\r\n </li>\r\n <li><hr class=\"dropdown-divider\"></li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\"></span> Run Report\r\n </a>\r\n </li>\r\n <li class=\"dropdown-submenu\">\r\n <a class=\"dropdown-item dropdown-toggle\" href=\"#\">Export</a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible:$parent.adminMode, click: function() {exportReport('json');}\">\r\n <span class=\"fa fa-file\"></span> Export JSON\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-2\" data-bind=\"text: folderName, visible: $parent.searchReports()\"></div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: $parent.adminMode\">\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>\r\n </div>\r\n <div class=\"col-md-1\" data-bind=\"visible: $parent.adminMode\">\r\n <a data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n &nbsp;\r\n <a href=\"#\" data-bind=\"click: function() { navigator && navigator.clipboard && navigator.clipboard.writeText('/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId) }\">\r\n <span class=\"fa fa-copy\" title=\"Copy Link\"></span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div data-bind=\"visible: ReportMode() == 'execute' || ReportMode() == 'linked' || ReportMode() == 'design'\">\r\n <div class=\"card\" data-bind=\"visible: true;\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\">Viewing Report</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav me-auto\"></ul>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: function() {$root.ReportMode('start'); $root.textQuery.setupSearch();}\">\r\n <i class=\"fa fa-arrow-left\"></i>\r\n <span>Back to Reports</span>\r\n </button>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: ReportMode()=='linked'\">\r\n <i class=\"fa fa-arrow-circle-left\"></i>\r\n <span>Back to Parent Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"visible: $root.CanEdit() && ReportID()\">\r\n <button class=\"dropdown-toggle btn btn-light btn-sm\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"fa fa-edit\"></i> Edit Report\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: function(){ SaveReport(true); }\"\r\n data-bs-toggle=\"modal\"\r\n data-bs-target=\"#modal-reportbuilder\">\r\n <i class=\"fa fa-sliders\"></i> Edit with Standard Designer\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: editReportAi\">\r\n <i class=\"fa fa-bolt\"></i> Edit with Smarter Designer\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: RefreshReport, visible: false\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button> \r\n <span data-bind=\"visible: isDirty\" title=\"You have unsaved changes\">\r\n <i class=\"text-warning fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: $root.CanEdit(), click: SaveWithoutRun\">\r\n <i class=\"fa fa-save\"></i> \r\n <span>Save Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"hidden: (DontExecuteOnRun() && !reportRan()) || !ReportID()\">\r\n <button type=\"button\" class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-end\"> \r\n <li data-bind=\"hidden: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = false; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(false); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: adminMode() && !appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = true; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(true); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf (Debug)\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdfAlt(); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontWordExport\">\r\n <a class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#wordOptionsModal').modal('show'); }\r\n : function() { downloadWord(); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadCsv\">\r\n <i class=\"fa fa-file-excel-o\"></i> Csv\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontXmlExport\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadXml\">\r\n <i class=\"fa fa-file-code-o\"></i> Xml\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: printReportPage\">\r\n <i class=\"fa fa-print\"></i> Print\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"if: ReportID() <= 0\">\r\n <ul class=\"nav nav-tabs\" id=\"designTabs\" role=\"tablist\"> \r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link active\" id=\"designer-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#designer\" type=\"button\" role=\"tab\">\r\n Report Designer\r\n </button>\r\n </li>\r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link\" id=\"nl-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nl\" type=\"button\" role=\"tab\">\r\n Use Prompt<span title=\"This feature is still in Beta release. You can turn it off from settings\" style=\"font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;\">\r\n <i class=\"fa fa-info-circle\"></i>\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"tab-content mt-3\">\r\n <div class=\"tab-pane fade show active\" id=\"designer\" role=\"tabpanel\" aria-labelledby=\"designer-tab\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n <div class=\"tab-pane fade\" id=\"nl\" role=\"tabpanel\" aria-labelledby=\"nl-tab\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <p>\r\n What would you like to know? Type a <b>natural language prompt</b> below to ask questions about your data.<br>\r\n Use <b>Auto Complete</b> suggestions to guide your query \u2014 the AI will convert your prompt into a Dotnet Report that you can then preview, design, save and reuse.\r\n </p>\r\n\r\n <p id=\"query-input\" class=\"query-input\">\r\n Show me&nbsp;\r\n </p>\r\n\r\n <p>\r\n <button data-bind=\"click: function() {runQuery(false);}\" class=\"btn btn-primary btn-sm\">\r\n <span class=\"fa fa-magic\"></span> Process with AI\r\n </button>\r\n\r\n <button data-bind=\"click: function() {resetQuery(true, false);}\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-undo\"></span> Start Over\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: adminMode\">\r\n <span class=\"fa fa-code\"></span> View Code\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: CanSaveReports(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save Report\r\n </button>\r\n\r\n <button data-bind=\"click: openDesigner\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-pencil\"></span> Design/Save Report\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: ReportID() > 0\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-view\">\r\n <div data-bind=\"ifnot: HasError\">\r\n <div data-bind=\"with: $root\">\r\n <div>\r\n <div data-bind=\"if: EditFiltersOnReport\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n <a data-bs-toggle=\"collapse\" data-bs-target=\"#filter-panel\" href=\"#\">\r\n <i class=\"fa fa-filter\"></i>Choose Filters\r\n </a>\r\n </div>\r\n <div id=\"filter-panel\" class=\"card-body collapse\">\r\n <div data-bind=\"if: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-parameters'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-group'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <br />\r\n <button class=\"btn btn-primary\" data-bind=\"click: SaveFilterAndRunReport\">Update Filters</button>\r\n </div>\r\n </div>\r\n <br />\r\n </div>\r\n <div data-bind=\"ifnot: EditFiltersOnReport\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n </div>\r\n <div class=\"report-render\" data-bind=\"css: { 'report-expanded': isExpanded }\">\r\n <div class=\"report-menubar bg-light\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"col-xs-12 col-centered\" data-bind=\"with: pager\">\r\n <div class=\"form-inline pull-left\" data-bind=\"visible: pages()\">\r\n <div class=\"form-group pull-left total-records\">\r\n <span data-bind=\"text: ' Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"pull-left\">\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: !$root.isChart() || $root.ShowDataWithGraph(), click: $root.downloadExcel\" title=\"Export to Excel\">\r\n <span class=\"fa fa-file-excel-o\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"click: $parent.toggleExpand\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-expand': !$parent.isExpanded(), 'fa-compress': $parent.isExpanded() }\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.ExpandAll\" title=\"Expand all rows\">\r\n <span class=\"fa fa-plus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.CollapseAll\" title=\"Collapse all rows\">\r\n <span class=\"fa fa-minus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" title=\"Re-run Report\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> \r\n </button>\r\n <div data-bind=\"with: $parent\" class=\"pull-left\">\r\n <div class=\"dropdown-selected\" data-bind=\"click: toggleDropdown\">\r\n <div data-bind=\"with: selectedTableStyle\" class=\"btn btn-sm btn-secondary\" title=\"Format Table\">\r\n <span class=\"fa fa- fa-paint-brush\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-content\" style=\"position: absolute;\" data-bind=\"visible: dropdownOpen\">\r\n <!-- ko foreach: tableStyles -->\r\n <div class=\"dropdown-option\" data-bind=\"title: $data.name, click: $parent.selectStyle\">\r\n <div class=\"mini-table-preview\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-row\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-cell\" data-bind=\"style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }\"></div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- /ko -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline pull-right\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm pull-right\" role=\"group\"> \r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomOut\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.resetZoom\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomIn\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"report-canvas\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"report-container bg-light\">\r\n <div class=\"report-inner bg-white\">\r\n <div data-bind=\"if: $root.CanEdit() && ReportType()!='Html' && ReportType()!='Single'\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <div data-bind=\"visible: headerDesigner.UseReportHeader\">\r\n <div id=\"report-header\" width=\"900\" height=\"120\" data-bind=\"html: headerDesigner.headerHtml\"></div>\r\n </div>\r\n <h2 data-bind=\"text: ReportName\"></h2>\r\n <p data-bind=\"html: ReportDescription\">\r\n </p>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-expanded-scroll\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <br />\r\n <span>Report ran on: <span data-bind=\"text: new Date().toLocaleDateString() + ' ' + new Date().toLocaleTimeString()\"></span></span>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: HasError\">\r\n <h2 data-bind=\"text: $root.ReportName\"></h2>\r\n <p data-bind=\"text: $root.ReportDescription\"></p>\r\n\r\n <h3>An unexpected error occured while running the Report</h3>\r\n <hr />\r\n <b>Error Details</b>\r\n <div data-bind=\"text: Exception\"></div>\r\n <br />\r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> Re-run Report\r\n </button>\r\n <hr />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Folder Edit Modal -->\r\n<div class=\"modal\" id=\"folderModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" data-bind=\"css: {'modal-lg': adminMode}\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageFolder\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title fs-5\">Manage Folder</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-4 col-md-4 control-label\">Folder Name</label>\r\n <div class=\"col-sm-8 col-md-8\">\r\n <input type=\"text\" class=\"form-control\" id=\"folderName\" required placeholder=\"Folder Name\" data-bind=\"value: FolderName\">\r\n </div>\r\n </div>\r\n <br />\r\n <div data-bind=\"visible: $root.adminMode\" class=\"card card-body\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: $root.manageFolderAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: saveFolder\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Import Json File Modal -->\r\n<div class=\"modal\" id=\"uploadFileModal\" tabindex=\"-1\" aria-labelledby=\"uploadFileModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageJsonFile\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"uploadFileModalLabel\">Import previously Exported Reports</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n <div class=\"alert alert-info small\">\r\n <strong>Instructions:</strong><br />\r\n \u2022 Select a <code>.json</code> file previously exported from Dotnet Report.<br />\r\n \u2022 The file may include multiple reports and their folders.<br />\r\n \u2022 Any missing folders will be created automatically.<br />\r\n \u2022 If a report with the same name already exists, you will be prompted to:\r\n <em>Skip</em>, <em>Overwrite</em>, or <em>Make a Copy</em>.<br />\r\n \u2022 Once uploaded, all imported reports will be available immediately.\r\n </div>\r\n\r\n <div id=\"dropzone\" class=\"dropzone\"\r\n data-bind=\"event: {click: triggerFileInput }\"\r\n style=\"border: 2px dashed #007bff; border-radius: 5px; padding: 30px; text-align: center; color: #007bff; cursor: pointer;\">\r\n Click here to select a JSON file\r\n </div>\r\n\r\n <input type=\"file\" id=\"fileInputJson\" accept=\".json\" style=\"display: none;\"\r\n data-bind=\"event: { change: handleFileSelect }\">\r\n\r\n <div class=\"mt-3\" data-bind=\"visible: fileName\">\r\n <p><strong>Selected File:</strong> <span data-bind=\"text: fileName\"></span></p>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: uploadFile\">Upload</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->", styles: [""] });
3194
- }
3195
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetreportComponent, decorators: [{
3196
- type: Component,
3197
- args: [{ selector: 'app-dotnetreport', template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n<div class=\"container-fluid\">\r\n <div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n <!--\r\n The markup code below is related to presentation. You don't have to change it, unless you\r\n intentionally want to change something in the Report Builder's behavior in your Application.\r\n It's Recommended you use it as is. You will be responsible for managing and maintaining any changes.\r\n -->\r\n <!-- Folders/Report List -->\r\n <div id=\"report-start\" data-bind=\"if: ReportMode() == 'start' || ReportMode() == 'generate'\">\r\n <div class=\"card folder-panel\" data-bind=\"visible: true\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\" data-bind=\"click: function() {SelectedFolder(null); designingHeader(false); searchReports(''); $('#search-report').val([]).trigger('change'); }\">Manage Reports</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav mr-auto\">\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanSaveReports() && appSettings.usePromptBuilder()) || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\"><i class=\"fa fa-sliders\"></i> Use Standard Designer</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: createNewReportAi\"><i class=\"fa fa-bolt\"></i> Use Smarter Designer</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: (SelectedFolder() ? SelectedFolder().canEdit : (CanSaveReports() || adminMode())) && !appSettings.usePromptBuilder()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: createNewReport\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-plus\"></span> New Report\r\n </a>\r\n </li>\r\n <li class=\"nav-item\" data-bind=\"visible: CanManageFolders() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: ManageFolder.newFolder\">\r\n <span class=\"fa fa-folder-o\"></span> Add Folder\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: (CanManageFolders() || adminMode()) && SelectedFolder()!=null && (SelectedFolder().canEdit || SelectedFolder().canDelete || adminMode())\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-folder\"></span> Folder Options\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.editFolder, visible: SelectedFolder() && (SelectedFolder().canEdit || adminMode())\">Edit Selected Folder</a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ManageFolder.deleteFolder, visible: SelectedFolder() && (SelectedFolder().canDelete || adminMode())\">Delete Selected Folder</a>\r\n </div>\r\n </li>\r\n <li class=\"nav-item active\" data-bind=\"visible: adminMode() && SelectedFolder() ==null\">\r\n <a href=\"#\" class=\"nav-link\" data-bind=\"click: function(){ initHeaderDesigner(false); }\">\r\n <span class=\"fa fa-arrow-up\"></span> Report Header\r\n </a>\r\n </li>\r\n <li class=\"nav-item dropdown\" data-bind=\"visible: appSettings.showImportExport() || adminMode()\">\r\n <a href=\"#\" class=\"nav-link dropdown-toggle\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <span class=\"fa fa-exchange\"></span> Import / Export\r\n </a>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function(){ selectMode(!selectMode()); }\">\r\n <span data-bind=\"css: selectMode() ? 'fa fa-check-square text-primary' : 'fa fa-square-o'\"></span>\r\n <span data-bind=\"text: selectMode() ? 'Cancel Select Mode' : 'Select Mode'\"></span>\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#uploadFileModal\" data-bind=\"visible: !selectMode()\" title=\"Import Report from JSON file\">\r\n <span class=\"fa fa-upload\"></span> Import Reports\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: selectMode, click: exportSelectedReportJson\">\r\n <span class=\"fa fa-download\"></span> Export Selected Reports\r\n </a>\r\n </div>\r\n </li>\r\n </ul>\r\n <div class=\"form-inline my-2 my-lg-0 ms-auto w-50\">\r\n <div class=\"input-group w-100\">\r\n <p id=\"search-input\" class=\"form-control search-input\" data-placeholder=\"Search Report by Name, Description or Data Field...\"></p>\r\n <span data-bind=\"click: searchForReports\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Search\"><i class=\"fa fa-search\"></i></span>\r\n <span data-bind=\"click: function() {resetQuery(true, true);}\" class=\"input-group-text\" style=\"height: 38px; cursor: pointer;\" title=\"Clear Search\"><i class=\"fa fa-close\"></i></span>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"visible: designingHeader, with: headerDesigner\" style=\"display: none;\" class=\"overflow-auto\">\r\n <div class=\"checkbox\">\r\n <label>\r\n <input type=\"checkbox\" data-bind=\"checked: UseReportHeader\"> Use Report Header\r\n </label>\r\n </div>\r\n <div data-bind=\"visible: UseReportHeader\">\r\n <p class=\"alert alert-info\">\r\n You can design the common report header below that will be applied to all reports where report headers are turned on.\r\n </p>\r\n <div class=\"form-group row m-1\" data-bind=\"visible: clientListIds().length > 0\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Headers for other Clients saved</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <select class=\"form-control\"\r\n data-bind=\"options: clientListIds,\r\n value: selectedHeaderClientId,\r\n optionsCaption: 'No Client Id (Global)',\r\n event: { change: function () { loadHtmlHeader(true); } }\">\r\n </select>\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" class=\"fa fa-question-circle helptip\"\r\n title=\"Choose a client to design its report header\"></span>\r\n </div>\r\n </div>\r\n <div class=\"form-group row m-1\">\r\n <div class=\"col-md-3 col-sm-3\">\r\n <label class=\"control-label\">Specify Client Id to Restrict Access</label>\r\n </div>\r\n <div class=\"col-md-3 col-sm-3\">\r\n <input class=\"form-control text-box single-line\" type=\"text\" data-bind=\"value: headerClientId\">\r\n </div>\r\n <div class=\"col-md-1 col-sm-1\">\r\n <span data-bs-toggle=\"tooltip\" data-placement=\"right\" class=\"fa fa-question-circle helptip\" title=\"Leave blank to give all clients access (Global Report Header)\"></span>\r\n </div>\r\n </div>\r\n <textarea id=\"report-header-editor\"></textarea>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n <div data-bind=\"visible: !UseReportHeader()\">\r\n <p class=\"alert alert-info\">\r\n If you turn off the <b>Use Report Header</b> option,\r\n the <b>Report Header</b> will not be applied in reports.\r\n </p>\r\n <button class=\"btn btn-primary btn-sm mt-2\" data-bind=\"click: saveHtmlHeader\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: designingHeader\">\r\n <div class=\"btn-group pull-right\" role=\"group\">\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"List View\"\r\n data-bind=\"css: { 'active': layout() === 'list' }, click: toggleLayout\">\r\n <span class=\"fa fa-list\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-light\" data-bs-toggle=\"tooltip\" title=\"Icon View\"\r\n data-bind=\"css: { 'active': layout() === 'icons' }, click: toggleLayout\">\r\n <span class=\"fa fa-th-large\"></span>\r\n </button>\r\n </div>\r\n\r\n <div data-bind=\"if: layout()=='icons'\">\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <p>Please choose Folders below to view Reports</p>\r\n <ul class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <li data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-3x fa-folder text-secondary\"></span>\r\n <span class=\"desc\" data-bind=\"text: FolderName\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"clearfix\">\r\n <p class=\"pull-left\">Please choose a Report from this Folder</p>\r\n <div class=\"pull-right\">\r\n <a href=\"#\" class=\"btn btn-light\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); $('#search-report').val([]).trigger('change');}\">\r\n ..back to Folders\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"list-group list-overflow\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n This folder is empty.\r\n </div>\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n No Reports found matching your Search\r\n </div>\r\n <div class=\"list-group\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"list-group-item\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-7\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"pull-left me-2\" />\r\n <div class=\"fa fa-2x pull-left\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType.indexOf('Map')==0, 'fa-window-maximize': reportType=='Single', 'fa-random': reportType=='Pivot', 'fa-window-restore': reportType=='Treemap', 'fa-signal': reportType == 'Combo', 'fa-code': reportType == 'Html', 'fa-map': reportType == 'HeatMap'}\"></div>\r\n <div class=\"pull-left\">\r\n <h4>\r\n <a data-bind=\"click: runReport\" style=\"cursor: pointer\">\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </a>\r\n </h4>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n <p data-bind=\"text: reportDescription\"></p>\r\n <p data-bind=\"if: $parent.searchReports()\">\r\n <span class=\"fa fa-folder\"></span> <span data-bind=\"text: folderName\"></span>\r\n <span>\r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </span>\r\n </p>\r\n <div data-bind=\"if: $parent.adminMode\">\r\n <div class=\"small\">\r\n <b>Report Access</b><br />\r\n Manage by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></span>\r\n <br />\r\n View only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: (viewOnlyUserId ? viewOnlyUserId : (userId ? userId : 'Any User'))\"></span>\r\n <br />\r\n <div data-bind=\"if: deleteOnlyUserId\">\r\n Delete only by User <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserId\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: userRole\">\r\n Manage by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: viewOnlyUserRole\">\r\n View only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: viewOnlyUserRole ? viewOnlyUserRole : 'Any Role'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: deleteOnlyUserRole\">\r\n Delete only by Role <span class=\"badge text-bg-info text-white\" data-bind=\"text: deleteOnlyUserRole ? deleteOnlyUserRole : 'Same as Manage'\"></span>\r\n <br />\r\n </div>\r\n <div data-bind=\"if: clientId\">\r\n For Client <span class=\"label label-info\" data-bind=\"text: clientId ? clientId : 'Any'\"></span>\r\n <br />\r\n </div>\r\n <div>\r\n Direct Link to Run Report: <a data-bind=\"attr: {href: '/DotNetReport/?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n &nbsp;<a href=\"#\" data-bind=\"click: navigator.clipboard.writeText(window.location.href + '?linkedreport=true&noparent=true&reportId=' + reportId )\"><span class=\"fa fa-copy\" title=\"Click to Copy Link\"></span></a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-5 right-align\">\r\n <div class=\"d-none d-md-block\">\r\n <br />\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode() \">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span> Edit\r\n </button>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: copyReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span> Copy\r\n </button>\r\n </span>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span> Run\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </div>\r\n </div>\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span> Delete\r\n </button>\r\n <br />\r\n </div>\r\n\r\n <div class=\"d-block d-md-none\">\r\n <span data-bind=\"if: $root.CanSaveReports() || $root.adminMode()\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Edit Report\" data-bind=\"click: openReport, visible: canEdit\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-edit\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button class=\"btn btn-sm btn-light\" data-bind=\"click: copyReport, visible: canEdit\" title=\"Copy Report\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\">\r\n <span class=\"fa fa-copy\" aria-hidden=\"true\"></span>\r\n </button>\r\n </span>\r\n\r\n <div class=\"btn-group\">\r\n <button class=\"btn btn-sm btn-outline-secondary\" data-bind=\"click: runReport\" title=\"Run Report\">\r\n <span class=\"fa fa-gears\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" style=\"margin-left: -4px;\">\r\n <span class=\"sr-only\"></span>\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel with inner rows\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-sm btn-outline-secondary\" title=\"Delete Report\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: layout()=='list'\">\r\n <div class=\"file-explorer-container\">\r\n <nav class=\"breadcrumb\">\r\n <a href=\"#\" class=\"breadcrumb-item\" data-bind=\"click: function(){ SelectedFolder(null); searchReports(''); }\">\r\n All Folders\r\n </a>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: SelectedFolder && !searchReports(), text: SelectedFolder()?.FolderName\"></span>\r\n <span class=\"breadcrumb-item active\" data-bind=\"visible: searchReports\">\r\n Search Results\r\n </span>\r\n </nav>\r\n\r\n <div data-bind=\"visible: !SelectedFolder() && !searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-6\">Name</div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: adminMode\">Access Control</div>\r\n </div>\r\n <div class=\"folder-list\" data-bind=\"foreach: Folders\">\r\n <div class=\"row clickable py-2 border-bottom align-items-center w-100\" data-bind=\"click: function(){ $parent.SelectedFolder($data); }\">\r\n <div class=\"col-md-6 d-flex align-items-center\">\r\n <span data-bind=\"visible: $root.selectMode, click: function(d,e){ isSelected(!isSelected()); e.stopPropagation(); },\r\n css: isSelected() ? 'fa fa-check-square text-primary me-2' : 'fa fa-square-o me-2'\"></span>\r\n <span class=\"fa fa-folder text-secondary me-2\"></span>\r\n <span data-bind=\"text: FolderName\"></span>\r\n </div>\r\n <div class=\"col-md-6 text-end\" data-bind=\"visible: $parent.adminMode\">\r\n <!--<div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>-->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"visible: SelectedFolder() || searchReports()\">\r\n <div class=\"container-fluid\">\r\n <div data-bind=\"if: SelectedFolder()!=null && reportsInFolder().length==0\">\r\n <p class=\"text-muted\">This folder is empty.</p>\r\n </div>\r\n\r\n <div data-bind=\"if: searchReports() && reportsInSearch().length==0\">\r\n <p class=\"text-center text-muted\">No reports found matching your search.</p>\r\n </div>\r\n <div data-bind=\"if: reportsInFolder().length > 0 || reportsInSearch().length > 0\">\r\n <div class=\"row fw-bold border-bottom py-2 w-100\">\r\n <div class=\"col-md-4\">Name</div>\r\n <div class=\"col-md-1\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: searchReports()\">Folder</div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: adminMode\">Access</div>\r\n <div class=\"col-md-1\" data-bind=\"visible: adminMode\">Direct Link</div>\r\n </div>\r\n\r\n <div class=\"report-list\" data-bind=\"foreach: searchReports() ? reportsInSearch() : reportsInFolder()\">\r\n <div class=\"row border-bottom py-2 align-items-center w-100\">\r\n <div class=\"col-md-4 d-flex align-items-center\">\r\n <input type=\"checkbox\" data-bind=\"visible: $root.selectMode, checked: isSelected\" class=\"me-2\" />\r\n <span class=\"fa\" data-bind=\"css: {\r\n 'fa-file': reportType=='List',\r\n 'fa-th-list': reportType=='Summary',\r\n 'fa-bar-chart': reportType=='Bar',\r\n 'fa-pie-chart': reportType=='Pie',\r\n 'fa-line-chart': reportType=='Line',\r\n 'fa-signal': reportType=='Combo',\r\n 'fa-globe': reportType.indexOf('Map')==0,\r\n 'fa-window-maximize': reportType=='Single',\r\n 'fa-random': reportType=='Pivot',\r\n 'fa-window-restore': reportType=='Treemap',\r\n 'fa-code': reportType == 'Html',\r\n 'fa-map': reportType == 'HeatMap'\r\n }\"></span>\r\n <a class=\"ms-2\" data-bind=\"click: runReport, highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\" style=\"cursor: pointer\"></a>&nbsp;\r\n <span data-bind=\"text: message\" class=\"highlight small\"></span>\r\n </div>\r\n\r\n <div class=\"col-md-1\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-sm\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-h\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: openReport, visible: canEdit\">\r\n <span class=\"fa fa-edit\"></span> Edit\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bs-toggle=\"modal\" data-bs-target=\"#modal-reportbuilder\" data-bind=\"click: copyReport, visible: canEdit\">\r\n <span class=\"fa fa-copy\"></span> Copy\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item text-danger\" href=\"#\" data-bind=\"click: deleteReport, visible: canDelete\">\r\n <span class=\"fa fa-trash\"></span> Delete\r\n </a>\r\n </li>\r\n <li><hr class=\"dropdown-divider\"></li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: runReport\">\r\n <span class=\"fa fa-gears\"></span> Run Report\r\n </a>\r\n </li>\r\n <li class=\"dropdown-submenu\">\r\n <a class=\"dropdown-item dropdown-toggle\" href=\"#\">Export</a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('pdf');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() {exportReport('excel');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible: hasDrilldown, click: function() {exportReport('excel-sub');}\">\r\n <span class=\"fa fa-file-excel-o\"></span> Download Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"visible:$parent.adminMode, click: function() {exportReport('json');}\">\r\n <span class=\"fa fa-file\"></span> Export JSON\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-2\" data-bind=\"text: folderName, visible: $parent.searchReports()\"></div>\r\n <div class=\"col-md-2\"></div>\r\n <div class=\"col-md-2\" data-bind=\"visible: $parent.adminMode\">\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userId ? userId : 'Any User'\"></div>\r\n <div class=\"badge bg-info text-white\" data-bind=\"text: userRole ? userRole : 'No Role'\"></div>\r\n </div>\r\n <div class=\"col-md-1\" data-bind=\"visible: $parent.adminMode\">\r\n <a data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId }\" target=\"_blank\"><span class=\"fa fa-link\"></span></a>\r\n &nbsp;\r\n <a href=\"#\" data-bind=\"click: function() { navigator && navigator.clipboard && navigator.clipboard.writeText('/DotNetReport?linkedreport=true&noparent=true&reportId=' + reportId) }\">\r\n <span class=\"fa fa-copy\" title=\"Copy Link\"></span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div data-bind=\"visible: ReportMode() == 'execute' || ReportMode() == 'linked' || ReportMode() == 'design'\">\r\n <div class=\"card\" data-bind=\"visible: true;\" style=\"display: none;\">\r\n <div class=\"card-header\">\r\n <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\r\n <a class=\"navbar-brand\" href=\"#\">Viewing Report</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\r\n <ul class=\"navbar-nav me-auto\"></ul>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: function() {$root.ReportMode('start'); $root.textQuery.setupSearch();}\">\r\n <i class=\"fa fa-arrow-left\"></i>\r\n <span>Back to Reports</span>\r\n </button>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: ReportMode()=='linked'\">\r\n <i class=\"fa fa-arrow-circle-left\"></i>\r\n <span>Back to Parent Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"visible: $root.CanEdit() && ReportID()\">\r\n <button class=\"dropdown-toggle btn btn-light btn-sm\" role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"fa fa-edit\"></i> Edit Report\r\n </button>\r\n <div class=\"dropdown-menu\">\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: function(){ SaveReport(true); }\"\r\n data-bs-toggle=\"modal\"\r\n data-bs-target=\"#modal-reportbuilder\">\r\n <i class=\"fa fa-sliders\"></i> Edit with Standard Designer\r\n </a>\r\n <a class=\"dropdown-item\" href=\"#\"\r\n data-bind=\"click: editReportAi\">\r\n <i class=\"fa fa-bolt\"></i> Edit with Smarter Designer\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"click: RefreshReport, visible: false\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button> \r\n <span data-bind=\"visible: isDirty\" title=\"You have unsaved changes\">\r\n <i class=\"text-warning fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <button class=\"btn btn-light btn-sm\" data-bind=\"visible: $root.CanEdit(), click: SaveWithoutRun\">\r\n <i class=\"fa fa-save\"></i> \r\n <span>Save Report</span>\r\n </button>\r\n <div class=\"dropdown\" data-bind=\"hidden: (DontExecuteOnRun() && !reportRan()) || !ReportID()\">\r\n <button type=\"button\" class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-end\"> \r\n <li data-bind=\"hidden: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = false; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(false); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: adminMode() && !appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { PdfPage.isDebug = true; $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdf(true); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf (Debug)\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: appSettings.useAltPdf\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#pdfOptionsModal').modal('show'); }\r\n : function() { downloadPdfAlt(); }\">\r\n <i class=\"fa fa-file-pdf-o\"></i> Pdf\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontWordExport\">\r\n <a class=\"dropdown-item\" data-bind=\"click: appSettings.showPageSize\r\n ? function() { $('#wordOptionsModal').modal('show'); }\r\n : function() { downloadWord(); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadCsv\">\r\n <i class=\"fa fa-file-excel-o\"></i> Csv\r\n </a>\r\n </li>\r\n <li data-bind=\"hidden: appSettings.dontXmlExport\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadXml\">\r\n <i class=\"fa fa-file-code-o\"></i> Xml\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: printReportPage\">\r\n <i class=\"fa fa-print\"></i> Print\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </nav>\r\n </div>\r\n <div class=\"card-body\">\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"if: ReportID() <= 0\">\r\n <ul class=\"nav nav-tabs\" id=\"designTabs\" role=\"tablist\"> \r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link active\" id=\"designer-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#designer\" type=\"button\" role=\"tab\">\r\n Report Designer\r\n </button>\r\n </li>\r\n <li class=\"nav-item\" role=\"presentation\">\r\n <button class=\"nav-link\" id=\"nl-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nl\" type=\"button\" role=\"tab\">\r\n Use Prompt<span title=\"This feature is still in Beta release. You can turn it off from settings\" style=\"font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;\">\r\n <i class=\"fa fa-info-circle\"></i>\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"tab-content mt-3\">\r\n <div class=\"tab-pane fade show active\" id=\"designer\" role=\"tabpanel\" aria-labelledby=\"designer-tab\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n <div class=\"tab-pane fade\" id=\"nl\" role=\"tabpanel\" aria-labelledby=\"nl-tab\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <p>\r\n What would you like to know? Type a <b>natural language prompt</b> below to ask questions about your data.<br>\r\n Use <b>Auto Complete</b> suggestions to guide your query \u2014 the AI will convert your prompt into a Dotnet Report that you can then preview, design, save and reuse.\r\n </p>\r\n\r\n <p id=\"query-input\" class=\"query-input\">\r\n Show me&nbsp;\r\n </p>\r\n\r\n <p>\r\n <button data-bind=\"click: function() {runQuery(false);}\" class=\"btn btn-primary btn-sm\">\r\n <span class=\"fa fa-magic\"></span> Process with AI\r\n </button>\r\n\r\n <button data-bind=\"click: function() {resetQuery(true, false);}\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-undo\"></span> Start Over\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: adminMode\">\r\n <span class=\"fa fa-code\"></span> View Code\r\n </button>\r\n\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: CanSaveReports(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save Report\r\n </button>\r\n\r\n <button data-bind=\"click: openDesigner\" class=\"btn btn-secondary btn-sm\">\r\n <span class=\"fa fa-pencil\"></span> Design/Save Report\r\n </button>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: ReportID() > 0\">\r\n <div data-bind=\"template: 'report-designer-compact', data: $root\"></div>\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-view\">\r\n <div data-bind=\"ifnot: HasError\">\r\n <div data-bind=\"with: $root\">\r\n <div>\r\n <div data-bind=\"if: EditFiltersOnReport\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n <a data-bs-toggle=\"collapse\" data-bs-target=\"#filter-panel\" href=\"#\">\r\n <i class=\"fa fa-filter\"></i>Choose Filters\r\n </a>\r\n </div>\r\n <div id=\"filter-panel\" class=\"card-body collapse\">\r\n <div data-bind=\"if: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-parameters'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <div data-bind=\"ifnot: useStoredProc\">\r\n <div class=\"row\">\r\n <div data-bind=\"template: {name: 'filter-group'}\" class=\"col-md-12\"></div>\r\n </div>\r\n </div>\r\n <br />\r\n <button class=\"btn btn-primary\" data-bind=\"click: SaveFilterAndRunReport\">Update Filters</button>\r\n </div>\r\n </div>\r\n <br />\r\n </div>\r\n <div data-bind=\"ifnot: EditFiltersOnReport\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n </div>\r\n <div class=\"report-render\" data-bind=\"css: { 'report-expanded': isExpanded }\">\r\n <div class=\"report-menubar bg-light\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"col-xs-12 col-centered\" data-bind=\"with: pager\">\r\n <div class=\"form-inline pull-left\" data-bind=\"visible: pages()\">\r\n <div class=\"form-group pull-left total-records\">\r\n <span data-bind=\"text: ' Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"pull-left\">\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: !$root.isChart() || $root.ShowDataWithGraph(), click: $root.downloadExcel\" title=\"Export to Excel\">\r\n <span class=\"fa fa-file-excel-o\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"click: $parent.toggleExpand\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-expand': !$parent.isExpanded(), 'fa-compress': $parent.isExpanded() }\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.ExpandAll\" title=\"Expand all rows\">\r\n <span class=\"fa fa-plus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" data-bind=\"visible: $parent.canDrilldown, click: $parent.CollapseAll\" title=\"Collapse all rows\">\r\n <span class=\"fa fa-minus\"></span>\r\n </button>\r\n <button class=\"btn btn-secondary btn-sm\" title=\"Re-run Report\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> \r\n </button>\r\n <div data-bind=\"with: $parent\" class=\"pull-left\">\r\n <div class=\"dropdown-selected\" data-bind=\"click: toggleDropdown\">\r\n <div data-bind=\"with: selectedTableStyle\" class=\"btn btn-sm btn-secondary\" title=\"Format Table\">\r\n <span class=\"fa fa- fa-paint-brush\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-content\" style=\"position: absolute;\" data-bind=\"visible: dropdownOpen\">\r\n <!-- ko foreach: tableStyles -->\r\n <div class=\"dropdown-option\" data-bind=\"title: $data.name, click: $parent.selectStyle\">\r\n <div class=\"mini-table-preview\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-row\" data-bind=\"foreach: new Array(5)\">\r\n <div class=\"mini-table-cell\" data-bind=\"style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }\"></div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- /ko -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline pull-right\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm pull-right\" role=\"group\"> \r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomOut\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.resetZoom\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: $parent.zoomIn\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"report-canvas\" data-bind=\"hidden: DontExecuteOnRun() && !reportRan()\">\r\n <div class=\"report-container bg-light\">\r\n <div class=\"report-inner bg-white\">\r\n <div data-bind=\"if: $root.CanEdit() && ReportType()!='Html' && ReportType()!='Single'\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <div data-bind=\"visible: headerDesigner.UseReportHeader\">\r\n <div id=\"report-header\" width=\"900\" height=\"120\" data-bind=\"html: headerDesigner.headerHtml\"></div>\r\n </div>\r\n <h2 data-bind=\"text: ReportName\"></h2>\r\n <p data-bind=\"html: ReportDescription\">\r\n </p>\r\n\r\n <div data-bind=\"with: ReportResult\" class=\"report-expanded-scroll\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <br />\r\n <span>Report ran on: <span data-bind=\"text: new Date().toLocaleDateString() + ' ' + new Date().toLocaleTimeString()\"></span></span>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: HasError\">\r\n <h2 data-bind=\"text: $root.ReportName\"></h2>\r\n <p data-bind=\"text: $root.ReportDescription\"></p>\r\n\r\n <h3>An unexpected error occured while running the Report</h3>\r\n <hr />\r\n <b>Error Details</b>\r\n <div data-bind=\"text: Exception\"></div>\r\n <br />\r\n <button class=\"btn btn-light\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode\">\r\n <i class=\"fa fa-code\"></i> View Report Code\r\n </button>\r\n <button class=\"btn btn-light\" data-bind=\"click: function() { $root.RunReport(false, true);}\">\r\n <i class=\"fa fa-play\"></i> Re-run Report\r\n </button>\r\n <hr />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Folder Edit Modal -->\r\n<div class=\"modal\" id=\"folderModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" data-bind=\"css: {'modal-lg': adminMode}\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageFolder\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title fs-5\">Manage Folder</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-4 col-md-4 control-label\">Folder Name</label>\r\n <div class=\"col-sm-8 col-md-8\">\r\n <input type=\"text\" class=\"form-control\" id=\"folderName\" required placeholder=\"Folder Name\" data-bind=\"value: FolderName\">\r\n </div>\r\n </div>\r\n <br />\r\n <div data-bind=\"visible: $root.adminMode\" class=\"card card-body\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: $root.manageFolderAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: saveFolder\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Import Json File Modal -->\r\n<div class=\"modal\" id=\"uploadFileModal\" tabindex=\"-1\" aria-labelledby=\"uploadFileModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\" data-bind=\"with: ManageJsonFile\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\" id=\"uploadFileModalLabel\">Import previously Exported Reports</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n\r\n <div class=\"alert alert-info small\">\r\n <strong>Instructions:</strong><br />\r\n \u2022 Select a <code>.json</code> file previously exported from Dotnet Report.<br />\r\n \u2022 The file may include multiple reports and their folders.<br />\r\n \u2022 Any missing folders will be created automatically.<br />\r\n \u2022 If a report with the same name already exists, you will be prompted to:\r\n <em>Skip</em>, <em>Overwrite</em>, or <em>Make a Copy</em>.<br />\r\n \u2022 Once uploaded, all imported reports will be available immediately.\r\n </div>\r\n\r\n <div id=\"dropzone\" class=\"dropzone\"\r\n data-bind=\"event: {click: triggerFileInput }\"\r\n style=\"border: 2px dashed #007bff; border-radius: 5px; padding: 30px; text-align: center; color: #007bff; cursor: pointer;\">\r\n Click here to select a JSON file\r\n </div>\r\n\r\n <input type=\"file\" id=\"fileInputJson\" accept=\".json\" style=\"display: none;\"\r\n data-bind=\"event: { change: handleFileSelect }\">\r\n\r\n <div class=\"mt-3\" data-bind=\"visible: fileName\">\r\n <p><strong>Selected File:</strong> <span data-bind=\"text: fileName\"></span></p>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: uploadFile\">Upload</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->" }]
3198
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
3199
- type: Inject,
3200
- args: [BASE_URL_TOKEN]
3201
- }] }, { type: i2.HttpClient }, { type: i3.ActivatedRoute }] });
3202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0cmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRyZXBvcnQvZG90bmV0cmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRyZXBvcnQvZG90bmV0cmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWMxRCxNQUFNLE9BQU8scUJBQXFCO0lBTXBCO0lBQ0E7SUFDd0I7SUFDeEI7SUFDQTtJQVRGLGNBQWMsQ0FBUztJQUN4QixlQUFlLENBQVc7SUFDekIsV0FBVyxDQUE0QjtJQUUvQyxZQUFZLFFBQWtCLEVBQ3BCLFNBQXVCLEVBQ3ZCLEtBQXdCLEVBQ0EsT0FBZSxFQUN2QyxJQUFnQixFQUNoQixLQUFxQjtRQUpyQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ0EsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUN2QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBRTNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVILFFBQVE7UUFDTixJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsbUNBQW1DLENBQUM7UUFDcEYsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUduRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBRTNELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN0QixJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsQ0FBQztnQkFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsc0JBQXNCO2dCQUMxRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO2dCQUN2QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyw0QkFBNEI7Z0JBQ2pFLGdCQUFnQixFQUFDLElBQUksQ0FBQyxjQUFjLEdBQUUsZ0NBQWdDO2dCQUN0RSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLG1DQUFtQztnQkFDM0UsU0FBUyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQzFCLFlBQVksRUFBRSxlQUFlO2dCQUM3QixpQkFBaUIsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUM7Z0JBQzFDLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGdDQUFnQztnQkFDckUsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0NBQWdDO2dCQUM5RCxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRywrQkFBK0I7Z0JBQ3RFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsbUNBQW1DO2dCQUM5RSxZQUFZLEVBQUUsTUFBTTtnQkFDcEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUI7Z0JBQ3ZELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGtDQUFrQztnQkFDekUsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsMkJBQTJCO2dCQUMxRCxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7YUFDOUMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLFdBQVcsR0FBRztnQkFDYixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3QixXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjO29CQUN0Qyx5REFBeUQ7b0JBQ3pELDBFQUEwRTtvQkFDMUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzNDLGdCQUFnQixDQUFDLENBQUM7Z0JBRXRCLFVBQVUsQ0FBQztvQkFDUCxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQ3JCLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFBO1lBRUQsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBRWhFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1AsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8saUJBQWlCO1FBRXZCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBOGhHakUsQ0FBQyxDQUFDO1FBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsRUFBTztRQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2IsSUFBSSxFQUFFLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDbEIsQ0FBQztZQUFBLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBem5HVSxxQkFBcUIsdUdBUXBCLGNBQWM7NEZBUmYscUJBQXFCLHdEQ2pCbEMsMGh4RUE0M0JrQjs7NEZEMzJCTCxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0Usa0JBQWtCOzswQkFjdkIsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBCQVNFX1VSTF9UT0tFTiB9IGZyb20gJy4vLi4vZG90bmV0cmVwb3J0LWxpYi5kaSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmRlY2xhcmUgdmFyIGtvOiBhbnk7XHJcbmRlY2xhcmUgdmFyIHJlcG9ydFZpZXdNb2RlbDogYW55O1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1kb3RuZXRyZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3RuZXRyZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RvdG5ldHJlcG9ydC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuIFxyXG5cclxuZXhwb3J0IGNsYXNzIERvdG5ldHJlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgYmFzZVNlcnZpY2VVcmw6IHN0cmluZztcclxuICAgIHB1YmxpYyByZXBvcnRUZW1wbGF0ZXM6IFNhZmVIdG1sO1xyXG4gICAgcHJpdmF0ZSBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBcclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgcHJpdmF0ZSBjZHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgIEBJbmplY3QoQkFTRV9VUkxfVE9LRU4pIHByaXZhdGUgYmFzZVVybDogc3RyaW5nLFxyXG4gICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7IFxyXG4gIFxyXG4gICAgICAgIHRoaXMuYmFzZVNlcnZpY2VVcmwgPSB0aGlzLmJhc2VVcmwgKyAnL2FwaSc7ICAgXHJcbiAgICAgICAgdGhpcy5yZXBvcnRUZW1wbGF0ZXMgPSBcIlwiO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgbGV0IGdldFVzZXJzQW5kUm9sZXNVcmwgPSB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgXCIvRG90TmV0UmVwb3J0QXBpL0dldFVzZXJzQW5kUm9sZXNcIjtcclxuICAgICAgZ2V0VXNlcnNBbmRSb2xlc1VybCA9IGdldFVzZXJzQW5kUm9sZXNVcmwucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICAgICAgXHJcbiAgXHJcbiAgICAgIHRoaXMuaHR0cC5nZXQoZ2V0VXNlcnNBbmRSb2xlc1VybCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgXHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICBsZXQgdm0gPSBuZXcgcmVwb3J0Vmlld01vZGVsKHtcclxuICAgICAgICAgICAgICBydW5SZXBvcnRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydC9SZXBvcnQnLFxyXG4gICAgICAgICAgICAgIHJlcG9ydFdpemFyZDogJChcIiNtb2RhbC1yZXBvcnRidWlsZGVyXCIpLFxyXG4gICAgICAgICAgICAgIGV4ZWNSZXBvcnRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9SdW5SZXBvcnQnLFxyXG4gICAgICAgICAgICAgIHJ1bkxpbmtSZXBvcnRVcmw6dGhpcy5iYXNlU2VydmljZVVybCArJy9Eb3ROZXRSZXBvcnRBcGkvUnVuUmVwb3J0TGluaycsXHJcbiAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJvbVNxbDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpL0dldFNjaGVtYUZyb21TcWwnLFxyXG4gICAgICAgICAgICAgIGxpbmtNb2RhbDogJChcIiNsaW5rTW9kYWxcIiksXHJcbiAgICAgICAgICAgICAgcmVwb3J0SGVhZGVyOiBcInJlcG9ydC1oZWFkZXJcIixcclxuICAgICAgICAgICAgICBmaWVsZE9wdGlvbnNNb2RhbDogJChcIiNmaWVsZE9wdGlvbnNNb2RhbFwiKSwgIFxyXG4gICAgICAgICAgICAgIGxvb2t1cExpc3RVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9HZXRMb29rdXBMaXN0JyxcclxuICAgICAgICAgICAgICBhcGlVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9DYWxsUmVwb3J0QXBpJyxcclxuICAgICAgICAgICAgICBydW5SZXBvcnRBcGlVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9SdW5SZXBvcnRBcGknLFxyXG4gICAgICAgICAgICAgIGdldFVzZXJzQW5kUm9sZXNVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9HZXRVc2Vyc0FuZFJvbGVzJyxcclxuICAgICAgICAgICAgICB1c2VyU2V0dGluZ3M6IHJlc3VsdCxcclxuICAgICAgICAgICAgICBkYXRhRmlsdGVyczogcmVzdWx0LmRhdGFGaWx0ZXJzLFxyXG4gICAgICAgICAgICAgIHJ1bkV4cG9ydFVybDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpLycsXHJcbiAgICAgICAgICAgICAgZ2V0VGltZVpvbmVzVXJsOiB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgJy9Eb3ROZXRSZXBvcnRBcGkvR2V0QWxsVGltZXpvbmVzJyxcclxuICAgICAgICAgICAgICBwcmludFJlcG9ydFVybDogdGhpcy5iYXNlVXJsICsgJy9Eb3ROZXRSZXBvcnQvUmVwb3J0UHJpbnQnLFxyXG4gICAgICAgICAgICAgIHNhbWVQYWdlT25SdW46IHRydWUsXHJcbiAgICAgICAgICAgICAgcmVwb3J0TW9kZTogdGhpcy5xdWVyeVBhcmFtc1tcImxpbmtlZHJlcG9ydFwiXSA9PSBcInRydWVcIiA/IFwibGlua2VkXCIgOiBcIlwiLFxyXG4gICAgICAgICAgICAgIHJlcG9ydElkOiB0aGlzLnF1ZXJ5UGFyYW1zW1wicmVwb3J0SWRcIl0gfHwgMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdm0ucHJpbnRSZXBvcnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgdmFyIHByaW50V2luZG93ID0gd2luZG93Lm9wZW4oXCJcIik7XHJcbiAgICAgICAgICAgICAgcHJpbnRXaW5kb3c/LmRvY3VtZW50Lm9wZW4oKTtcclxuICAgICAgICAgICAgICBwcmludFdpbmRvdz8uZG9jdW1lbnQud3JpdGUoJzxodG1sPjxoZWFkPicgK1xyXG4gICAgICAgICAgICAgICAgICAnPGxpbmsgaHJlZj1cIi9Db250ZW50L2Jvb3RzdHJhcC5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgLz4nK1xyXG4gICAgICAgICAgICAgICAgICAnPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPmFbaHJlZl06YWZ0ZXIge2NvbnRlbnQ6IG5vbmUgIWltcG9ydGFudDt9PC9zdHlsZT4nICtcclxuICAgICAgICAgICAgICAgICAgJzwvaGVhZD48Ym9keT4nICsgJCgnLnJlcG9ydC1pbm5lcicpLmh0bWwoKSArXHJcbiAgICAgICAgICAgICAgICAgICc8L2JvZHk+PC9odG1sPicpO1xyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgIHByaW50V2luZG93Py5wcmludCgpO1xyXG4gICAgICAgICAgICAgICAgICBwcmludFdpbmRvdz8uY2xvc2UoKTtcclxuICAgICAgICAgICAgICB9LCAyNTApO1xyXG4gICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgICAgdm0uaW5pdCgwLCByZXN1bHQubm9BY2NvdW50KTtcclxuICBcclxuICAgICAgICAgIHRoaXMucmVuZGVyS09UZW1wbGF0ZXMoKTtcclxuICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3Modm0sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3QtbmV0LXJlcG9ydCcpKTtcclxuICBcclxuICAgICAgICAgIHRoaXMuYmluZFdpbmRvd1Jlc2l6ZSh2bSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAga28uY2xlYW5Ob2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3QtbmV0LXJlcG9ydCcpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCkge1xyXG4gICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gIH1cclxuICBcclxuICBwcml2YXRlIHJlbmRlcktPVGVtcGxhdGVzKCkge1xyXG4gIFxyXG4gICAgdGhpcy5yZXBvcnRUZW1wbGF0ZXMgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChgPCEtLSBEb3RuZXQgUmVwb3J0IEhUTUwgVGVtcGxhdGVzIC0tPlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1maWx0ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAnZmlsdGVyLScrdWlJZCB9XCI+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogIWhhc0ZvcmVpZ25LZXktLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ0RhdGVUaW1lJywnRGF0ZScsJ1RpbWUnXS5pbmRleE9mKGZpZWxkVHlwZSkgIT0gLTEgLS0+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBbJz0nLCc+JywnPCcsJz49JywnPD0nLCAnbm90IGVxdWFsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiAkcGFyZW50LmZtdFZhbHVlLCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiAkcGFyZW50LlZhbHVlLCBkYXRlRm9ybWF0OiBkYXRlRm9ybWF0KCkgPT09ICdDdXN0b20nID8gY3VzdG9tRGF0ZUZvcm1hdCgpLnJlcGxhY2UoL3l5eXkvZywgJ3l5JykgOiAkcm9vdC5kYXRlRm9ybWF0TWFwcGluZ3NbZGF0ZUZvcm1hdCgpXX1cIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBmaWVsZFR5cGU9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nVGltZScgfHwgZmllbGRGb3JtYXQoKT09J0RhdGUgYW5kIFRpbWUnLS0+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0aW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6JHBhcmVudC5WYWx1ZXRpbWVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0ga28gaWY6IFsnYmV0d2VlbiddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICBGcm9tXHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZnJvbS1kYXRlXCIgZGF0YS1iaW5kPVwiZGF0ZXBpY2tlcjogJHBhcmVudC5mbXRWYWx1ZSwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogJHBhcmVudC5WYWx1ZSwgZGF0ZUZvcm1hdDogZGF0ZUZvcm1hdCgpID09PSAnQ3VzdG9tJyA/IGN1c3RvbURhdGVGb3JtYXQoKS5yZXBsYWNlKC95eXl5L2csICd5eScpIDogJHJvb3QuZGF0ZUZvcm1hdE1hcHBpbmdzW2RhdGVGb3JtYXQoKV19XCIgLz5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjpmaWVsZFR5cGU9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nVGltZScgfHwgZmllbGRGb3JtYXQoKT09J0RhdGUgYW5kIFRpbWUnLS0+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0aW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6JHBhcmVudC5WYWx1ZXRpbWVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgdG9cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiAkcGFyZW50LmZtdFZhbHVlMiwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogJHBhcmVudC5WYWx1ZTIsIGRhdGVGb3JtYXQ6IGRhdGVGb3JtYXQoKSA9PT0gJ0N1c3RvbScgPyBjdXN0b21EYXRlRm9ybWF0KCkucmVwbGFjZSgveXl5eS9nLCAneXknKSA6ICRyb290LmRhdGVGb3JtYXRNYXBwaW5nc1tkYXRlRm9ybWF0KCldfVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHRvLWRhdGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOmZpZWxkVHlwZT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nRGF0ZSBhbmQgVGltZSctLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRpbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTokcGFyZW50LlZhbHVldGltZTJcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogWydyYW5nZSddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICA8c2VsZWN0IGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VG9kYXk8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5Ub2RheSArPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VG9kYXkgLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlllc3RlcmRheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgV2Vlazwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgV2Vlazwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgTW9udGg8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5MYXN0IE1vbnRoPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBXZWVrIFRvIERhdGU8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIE1vbnRoIFRvIERhdGU8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFllYXIgVG8gRGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgMzAgRGF5czwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8IS0tPG9wdGlvbj5UaGlzIE1vbnRoIExhc3QgWWVhcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgTW9udGggTGFzdCBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+Rmlyc3QgUXVhcnRlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlNlY29uZCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcmQgUXVhcnRlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkZvdXJ0aCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TmV4dCA2IE1vbnRoczwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgNiBNb250aHM8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj4yIFllYXJzIGFnbzwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPjMgWWVhcnMgYWdvPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+NCBZZWFycyBhZ288L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj41IFllYXJzIGFnbzwvb3B0aW9uPi0tPlxyXG4gICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJDb21wYXJpc29uIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gVG9kYXk8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+PD0gVG9kYXk8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gVG9kYXkgKzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj48PSBUb2RheSArPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uPj49IFRvZGF5IC08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+PD0gVG9kYXkgLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L29wdGdyb3VwPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuVmFsdWUoKS5pbmRleE9mKCdUb2RheSArJykgPj0gMCB8fCAkcGFyZW50LlZhbHVlKCkuaW5kZXhPZignVG9kYXkgLScpID49IDBcIiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1sZWZ0XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LXNtIHB1bGwtbGVmdFwiIHN0eWxlPVwid2lkdGg6IDgwcHg7XCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUyXCIgcmVxdWlyZWQgLz48c3BhbiBzdHlsZT1cInBhZGRpbmc6IDVweCA1cHg7XCIgY2xhc3M9XCJwdWxsLWxlZnRcIj4gZGF5czwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ0ludCcsJ01vbmV5JywnRmxvYXQnLCdEb3VibGUnXS5pbmRleE9mKGZpZWxkVHlwZSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnPScsJz4nLCc8JywnPj0nLCc8PScsICdub3QgZXF1YWwnXS5pbmRleE9mKCRwYXJlbnQuT3BlcmF0b3IoKSkgIT0gLTEgJiYgWydpcyBibGFuaycsICdpcyBub3QgYmxhbmsnLCAnaXMgbnVsbCcsICdpcyBub3QgbnVsbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSA9PSAtMSAtLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlLCBkaXNhYmxlOiAkcGFyZW50Lk9wZXJhdG9yKCkgPT0gJ2lzIGRlZmF1bHQnXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICA8IS0tIGtvIGlmOiBbJ2luJywgJ25vdCBpbiddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJHBhcmVudC5WYWx1ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBbJ2JldHdlZW4nXS5pbmRleE9mKCRwYXJlbnQuT3BlcmF0b3IoKSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgIEZyb21cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgVG9cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cIm51bWJlclwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlMlwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogZmllbGRUeXBlPT0nQm9vbGVhbicgJiYgWydpcyBibGFuaycsICdpcyBub3QgYmxhbmsnLCAnaXMgbnVsbCcsICdpcyBub3QgbnVsbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSA9PSAtMSAtLT5cclxuICAgICAgICA8c2VsZWN0IHJlcXVpcmVkIGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJHBhcmVudC5WYWx1ZSwgZGlzYWJsZTogJHBhcmVudC5PcGVyYXRvcigpID09ICdpcyBkZWZhdWx0J1wiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMVwiPlllczwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMFwiPk5vPC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogWydJbnQnLCdNb25leScsJ0Zsb2F0JywnRG91YmxlJywnRGF0ZScsJ0RhdGVUaW1lJywnVGltZScsJ0Jvb2xlYW4nXS5pbmRleE9mKGZpZWxkVHlwZSkgPT0gLTEgJiYgWydpcyBibGFuaycsICdpcyBub3QgYmxhbmsnLCAnaXMgbnVsbCcsICdpcyBub3QgbnVsbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSA9PSAtMSAtLT5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlLCBkaXNhYmxlOiAkcGFyZW50Lk9wZXJhdG9yKCkgPT0gJ2lzIGRlZmF1bHQnLGF0dHI6IHtpZDogJ2N0bC0nICsgJGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtcGFyZW50cHJlZml4XScpLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnRwcmVmaXgnKSArICctJyArIHVpSWR9XCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBoYXNGb3JlaWduS2V5ICYmICRwYXJlbnQuT3BlcmF0b3IoKSAhPSAnYWxsJyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBoYXNGb3JlaWduUGFyZW50S2V5ICYmICRwYXJlbnQuc2hvd1BhcmVudEZpbHRlcigpIC0tPlxyXG4gICAgICAgIDxzZWxlY3QgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IGRyb3Bkb3duUGFyZW50OiAnI2ZpbHRlci0nK3VpSWQsIHBsYWNlaG9sZGVyOiAnUGxlYXNlIENob29zZScsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogJHBhcmVudC5QYXJlbnRMaXN0LCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICRwYXJlbnQuSXNDb25kaXRpb25hbEZpbHRlciA/ICd0ZXh0JzogJ2lkJywgc2VsZWN0ZWRPcHRpb25zOiAkcGFyZW50LlBhcmVudEluXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudC5PcGVyYXRvcigpPT0nPSctLT5cclxuICAgICAgICA8c2VsZWN0IHJlcXVpcmVkIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwic2VsZWN0MjogeyBkcm9wZG93blBhcmVudDogJyNmaWx0ZXItJyt1aUlkLCBwbGFjZWhvbGRlcjogJ1BsZWFzZSBDaG9vc2UnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6ICRwYXJlbnQuTG9va3VwTGlzdCwgb3B0aW9uc1RleHQ6ICd0ZXh0Jywgb3B0aW9uc1ZhbHVlOiAgICRwYXJlbnQuSXNDb25kaXRpb25hbEZpbHRlciA/ICd0ZXh0JzogJ2lkJywgdmFsdWU6ICRwYXJlbnQuVmFsdWUsIG9wdGlvbnNDYXB0aW9uOiAnUGxlYXNlIENob29zZSdcIj48L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Lk9wZXJhdG9yKCk9PSdpbicgfHwgJHBhcmVudC5PcGVyYXRvcigpPT0nbm90IGluJy0tPlxyXG4gICAgICAgIDxzZWxlY3QgcmVxdWlyZWQgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IGRyb3Bkb3duUGFyZW50OiAnI2ZpbHRlci0nK3VpSWQsIHBsYWNlaG9sZGVyOiAnUGxlYXNlIENob29zZScsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogJHBhcmVudC5Mb29rdXBMaXN0LCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICRwYXJlbnQuSXNDb25kaXRpb25hbEZpbHRlciA/ICd0ZXh0JzogJ2lkJywgc2VsZWN0ZWRPcHRpb25zOiAkcGFyZW50LlZhbHVlSW5cIj48L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicGFnZXItdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYWdlci1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTJcIj5cclxuXHJcbiAgICAgICAgPCEtLSBSb3dzIHBlciBwYWdlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIG1zLTFcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+UGFnZSBzaXplOjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtIHctYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogcGFnZVNpemVPcHRpb25zLCB2YWx1ZTogcGFnZVNpemVcIj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gSW5uZXIgYm9yZGVyIGJsb2NrIGZvciBwYWdlIG5hdmlnYXRpb24gY29udHJvbHMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgbXMtM1wiPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiRmlyc3RcIiBkYXRhLWJpbmQ9XCJjbGljazogZmlyc3QsIGVuYWJsZTogIWlzRmlyc3RQYWdlKClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIHBhZ2VyLWJ0biBtcy0xXCIgYXJpYS1sYWJlbD1cIkZpcnN0IFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG91YmxlLWxlZnRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJQcmV2aW91c1wiIGRhdGEtYmluZD1cImNsaWNrOiBwcmV2aW91cywgZW5hYmxlOiAhaXNGaXJzdFBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gcGFnZXItYnRuXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtbGVmdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlBhZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBwYXR0ZXJuPVwiWzAtOV0qXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gdGV4dC1jZW50ZXIgcGFnZXItaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDYwcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogY3VycmVudFBhZ2UsIGF0dHI6IHsgbWF4OiBwYWdlcygpIH1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPm9mPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgZGF0YS1iaW5kPVwidGV4dDogcGFnZXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIk5leHRcIiBkYXRhLWJpbmQ9XCJjbGljazogbmV4dCwgZW5hYmxlOiAhaXNMYXN0UGFnZSgpXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBwYWdlci1idG5cIiBhcmlhLWxhYmVsPVwiTmV4dCBQYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFuZ2xlLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiTGFzdFwiIGRhdGEtYmluZD1cImNsaWNrOiBsYXN0LCBlbmFibGU6ICFpc0xhc3RQYWdlKClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIHBhZ2VyLWJ0blwiIGFyaWEtbGFiZWw9XCJMYXN0IFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG91YmxlLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWNvbHVtbi1oZWFkZXJcIj5cclxuICAgIDwhLS0ga28gZm9yZWFjaDogQ29sdW1ucyAtLT5cclxuICAgIDx0aCBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAhSXNQaXZvdEZpZWxkID8gZmllbGRJZCA6ICdwaXZvdC0tJyArIGZpZWxkTmFtZSB9LCBzdHlsZTogeyd0ZXh0LWFsaWduJzogZmllbGRBbGlnbigpID8gZmllbGRBbGlnbigpIDogKElzTnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCcpLCAnYmFja2dyb3VuZC1jb2xvcic6IGhlYWRlckJhY2tDb2xvciB9LCBoaWRkZW46IG91dGVyR3JvdXBcIiBzdHlsZT1cImJvcmRlci1yaWdodDogMXB4IHNvbGlkO1wiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCIgZGF0YS1iaW5kPVwiaWY6ICEkcGFyZW50LklzRHJpbGxEb3duKClcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDVweDtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3B1cFwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cImZhbHNlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12IHNvcnRhYmxlXCIgdGl0bGU9XCJEcmFnIHRvIHJlb3JkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8dWwgZGF0YS1iaW5kPVwidmlzaWJsZTogIUlzUGl2b3RGaWVsZFwiIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNtYWxsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogIUlzTnVtZXJpY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVPdXRlckdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNsb25lXCI+PC9zcGFuPiBPdXRlciBHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNldHVwRmllbGRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWdlYXJcIj48L3NwYW4+IEZpZWxkIFNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGh9XCI+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MgPyAkcGFyZW50c1szXS51c2VTdG9yZWRQcm9jKCkgOiAoJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzVdLnVzZVN0b3JlZFByb2MoKSA6IGZhbHNlKSAtLT5cclxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGRMYWJlbCgpID8gZmllbGRMYWJlbCgpIDogZmllbGROYW1lLCBzdHlsZTogeydjb2xvcic6IGhlYWRlckZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogaGVhZGVyRm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MgPyAkcGFyZW50c1szXS51c2VTdG9yZWRQcm9jKCkgOiAoJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzVdLnVzZVN0b3JlZFByb2MoKSA6IGZhbHNlKSAgLS0+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCJcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgaWYgKCFJc1Bpdm90RmllbGQpIHsgJHBhcmVudHNbcGFnZXJJbmRleCgkcGFyZW50cyldLmNoYW5nZVNvcnQoU3FsRmllbGQpOyB9IH0sIHN0eWxlOiB7J2NvbG9yJzogaGVhZGVyRm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBoZWFkZXJGb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAkcGFyZW50LklzRHJpbGxEb3duKCkgJiYgZmllbGRMYWJlbDIoKSA/IGZpZWxkTGFiZWwyKCkgOiAoZmllbGRMYWJlbCgpID8gZmllbGRMYWJlbCgpIDogZmllbGROYW1lKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRwYXJlbnRzW3BhZ2VySW5kZXgoJHBhcmVudHMpXS5wYWdlci5zb3J0Q29sdW1uKCkgPT09IFNxbEZpZWxkID8gKCRwYXJlbnRzW3BhZ2VySW5kZXgoJHBhcmVudHMpXS5wYWdlci5zb3J0RGVzY2VuZGluZygpID8gJyYjOTY2MDsnIDogJyYjOTY1MDsnKSA6ICcnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC90aD5cclxuICAgIDwhLS0gL2tvIC0tPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXdpZGdldFwiPlxyXG4gICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7Zm9udC1zaXplOiA0OHB4XCI+XHJcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogUm93cy5sZW5ndGggPCAxXCIgdGl0bGU9XCJObyBkYXRhIGZvdW5kXCI+Lzwvc3Bhbj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogUm93cy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogJHBhcmVudC5yb3dzWzBdLkl0ZW1zWzBdXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudC5Sb3dzLmxlbmd0aCA+IDEgPyAoJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLnNob3dQcmlvckluS3BpICE9IHVuZGVmaW5lZCA/ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5zaG93UHJpb3JJbktwaSgpIDogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTFdLnNob3dQcmlvckluS3BpKCkpIDogZmFsc2UgLS0+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJzdHlsZTogeydjb2xvcic6ICRwYXJlbnQuY2FsY3VsYXRlUmF0ZSgpID4gMCA/ICdncmVlbicgOiAncmVkJywgJ2ZvbnQtc2l6ZSc6ICcyNHB4J31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiAkcGFyZW50LmNhbGN1bGF0ZVJhdGUoKSArICclJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J2ZvbnQtc2l6ZSc6ICcyNHB4JywgJ2NvbG9yJzogJ2dyYXknfSwgY3NzOiB7J3RleHQtbXV0ZWQnOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFByaW9yIFBlcmlvZDogPHNwYW4gZGF0YS1iaW5kPVwiaHRtbDogJHBhcmVudC5Sb3dzWzFdLkl0ZW1zWzBdLmZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1jb2x1bW5cIj5cclxuICAgIDwhLS0ga28gZm9yZWFjaDogSXRlbXMgLS0+XHJcbiAgICA8dGQgZGF0YS1iaW5kPVwiaGlkZGVuOiBvdXRlckdyb3VwLCBzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogX2JhY2tDb2xvciA/PyBiYWNrQ29sb3IoKSwgJ2NvbG9yJzogX2ZvbnRDb2xvciA/PyBmb250Q29sb3IoKSwgJ2ZvbnQtd2VpZ2h0JzogZm9udEJvbGQoKSB8fCBfZm9udEJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJywgJ3RleHQtYWxpZ24nOiBmaWVsZEFsaWduKCkgPyBmaWVsZEFsaWduKCkgOiAoQ29sdW1uLklzTnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCcpfVwiPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHsnd2lkdGgnOiBmaWVsZFdpZHRoIH0sIGNzczogeyAndGV4dC13cmFwJzogZmllbGRXaWR0aCB9XCI+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IExpbmtUby0tPlxyXG4gICAgICAgICAgICA8YSBkYXRhLWJpbmQ9XCJhdHRyOiB7aHJlZjogTGlua1RvfVwiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6IExpbmtUby0tPlxyXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RkPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXBpdm90XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydERhdGFcIj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZFwiPlxyXG4gICAgICAgICAgICA8dGhlYWQgc3R5bGU9XCJwb3NpdGlvbjogc3RpY2t5OyB0b3A6IC0xcHg7IHotaW5kZXg6IDI7XCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBSb3dzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogSXRlbXNbMF0uRm9ybWF0dGVkVmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keSBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGRMYWJlbCB8fCBDb2x1bW5OYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiAkcGFyZW50LlJvd3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cInN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiAkcGFyZW50LmJhY2tDb2xvciwgJ2NvbG9yJzogJHBhcmVudC5mb250Q29sb3IsICdmb250LXdlaWdodCc6ICRwYXJlbnQuZm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnLCAndGV4dC1hbGlnbic6ICRwYXJlbnQuZmllbGRBbGlnbiA/ICRwYXJlbnQuZmllbGRBbGlnbiA6ICgkcGFyZW50LklzTnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCcpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogSXRlbXNbJHBhcmVudENvbnRleHQuJGluZGV4KCldLkZvcm1hdHRlZFZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXRhYmxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZFwiIGRhdGEtYmluZD1cImF0dHI6IHtjbGFzczogJ3RhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkICcgKyAkcGFyZW50c1syXS5zZWxlY3RlZFN0eWxlKCl9XCI+XHJcbiAgICAgICAgICAgIDx0aGVhZCBzdHlsZT1cInBvc2l0aW9uOiBzdGlja3k7IHRvcDogLTFweDsgei1pbmRleDogMjtcIiBkYXRhLWJpbmQ9XCJpZjogISRwYXJlbnRzWzJdLm5vSGVhZGVyUm93KClcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm5vLWhpZ2hsaWdodFwiIGRhdGEtYmluZD1cInNvcnRhYmxlQ29sdW1uczogeyBoYW5kbGU6ICcuc29ydGFibGUnLCBjdXJzb3I6ICdtb3ZlJywgcGxhY2Vob2xkZXI6ICdkcm9wLWhpZ2hsaWdodCcsc2VsZWN0ZWRGaWVsZHM6ICRwYXJlbnRzWzJdLlNlbGVjdGVkRmllbGRzIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50LmNhbkRyaWxsZG93bigpICYmICFJc0RyaWxsRG93bigpICYmICFDYW5FeHBhbmRPcHRpb24oKSAmJiAoISRwYXJlbnRzWzJdLmhhc1Bpdm90Q29sdW1uKCkgfHwgKCRwYXJlbnRzWzJdLmhhc1Bpdm90Q29sdW1uKCkgJiYgJHBhcmVudHNbMl0uYXBwU2V0dGluZ3MudXNlQWx0UGl2b3QpKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzBweDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogQ29sdW1uc1swXS5oZWFkZXJCYWNrQ29sb3J9XCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAncmVwb3J0LWNvbHVtbi1oZWFkZXInLCBkYXRhOiAkZGF0YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImF0dHI6IHtpZDogJ3JlcG9ydC10YWJsZS1ib2R5JyArICRwYXJlbnRzWzJdLlJlcG9ydElEKCl9XCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGRhdGEtYmluZD1cInZpc2libGU6IFJvd3MubGVuZ3RoIDwgMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJhdHRyOntjb2xzcGFuOiBDb2x1bW5zLmxlbmd0aCArIDF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlY29yZHMgZm91bmRcclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAhJHBhcmVudHNbMl0udXNlUmVuZGVyVGFibGUoKSAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogJHBhcmVudC5yb3dzICAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50LmNhbkRyaWxsZG93bigpICYmICEkcGFyZW50LklzRHJpbGxEb3duKCkgJiYgISRwYXJlbnQuQ2FuRXhwYW5kT3B0aW9uKCkgJiYgJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZScgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwcHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCIgZGF0YS1iaW5kPVwic3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6IEl0ZW1zWzBdLl9iYWNrQ29sb3IgPz8gSXRlbXNbMF0uYmFja0NvbG9yKCksICdjb2xvcic6IEl0ZW1zWzBdLl9mb250Q29sb3IgPz8gSXRlbXNbMF0uZm9udENvbG9yKCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHRvZ2dsZSgpOyB9XCI+PHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1wbHVzJzogIWlzRXhwYW5kZWQoKSwgJ2ZhLW1pbnVzJzogaXNFeHBhbmRlZCgpfVwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAncmVwb3J0LWNvbHVtbicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNFeHBhbmRlZCAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzBweDtcIj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJhdHRyOntjb2xzcGFuOiAkcGFyZW50LkNvbHVtbnMubGVuZ3RoIH1cIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFEcmlsbERvd25EYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogRHJpbGxEb3duRGF0YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBEcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibm8taGlnaGxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uLWhlYWRlcicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUm93cyAmJiBSb3dzLmxlbmd0aCA8IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6IHtjb2xzcGFuOiBDb2x1bW5zLmxlbmd0aH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHJlY29yZHMgZm91bmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogUm93cyAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAncmVwb3J0LWNvbHVtbicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1jZW50ZXJlZFwiIGRhdGEtYmluZD1cIndpdGg6IHBhZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmUgc21hbGwgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJ1RvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0IHRvdGFsLXJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmV4cG9ydEV4Y2VsXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIlZpZXcgQ29kZVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxEcmlsbERvd25Nb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb2RlXCI+PC9zcGFuPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogcGFnZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogc3ViUmVwb3J0c1JhbigpLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46ICRwYXJlbnQuQ29sdW1ucy5sZW5ndGggfVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiZm9yZWFjaDogc3ViUmVwb3J0c1JhblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAyMHB4O1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwicHVsbC1sZWZ0XCIgZGF0YS1iaW5kPVwidGV4dDogUmVwb3J0TmFtZVwiPjwvaDI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3Qtb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnREZXNjcmlwdGlvbiwgdmlzaWJsZTogUmVwb3J0RGVzY3JpcHRpb25cIj48L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiIGRhdGEtYmluZD1cIndpdGg6IHBhZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1sZWZ0IHRvdGFsLXJlY29yZHNcIiBkYXRhLWJpbmQ9XCJpZjogdG90YWxSZWNvcmRzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnVG90YWwgUmVjb3JkczogJyArIHRvdGFsUmVjb3JkcygpXCI+PC9zcGFuPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJpZjogcGFnZXMoKT4xICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuU3ViVG90YWxzKCkubGVuZ3RoID09IDEgJiYgJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudC5PdXRlckdyb3VwQ29sdW1ucygpLmxlbmd0aCA9PSAwIC0tPlxyXG4gICAgICAgICAgICA8dGZvb3QgZGF0YS1iaW5kPVwiZm9yZWFjaDogJHBhcmVudENvbnRleHQuJHBhcmVudC5TdWJUb3RhbHNcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInN1Yi10b3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgISRwYXJlbnQuSXNEcmlsbERvd24oKSAmJiAhJHBhcmVudC5DYW5FeHBhbmRPcHRpb24oKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IEl0ZW1zIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IFZhbHVlICE9ICdOQScgJiYgVmFsdWUgIT0gJ05hTicgJiYgIW91dGVyR3JvdXAoKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwic3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6IF9iYWNrQ29sb3IgPz8gYmFja0NvbG9yKCksICdjb2xvcic6IF9mb250Q29sb3IgPz8gZm9udENvbG9yKCksICdmb250LXdlaWdodCc6IGZvbnRCb2xkKCkgfHwgX2ZvbnRCb2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsICd0ZXh0LWFsaWduJzogZmllbGRBbGlnbigpID8gZmllbGRBbGlnbigpIDogJ3JpZ2h0J31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGggfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rmb290PlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtcmVuZGVyXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydERhdGFcIj5cclxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBSb3dzXCI+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJodG1sOiByZW5kZXJlZEh0bWwsIGNzczogeyAnY2FyZC12aWV3JzogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTFdLmNhcmRWaWV3IH1cIj48L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBzdWJSZXBvcnRzUmFuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAyMHB4O1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBSZXBvcnROYW1lXCI+PC9oMj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3Qtb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydERlc2NyaXB0aW9uLCB2aXNpYmxlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0UmVzdWx0XCIgY2xhc3M9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCIgZGF0YS1iaW5kPVwid2l0aDogcGFnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwiaWY6IHRvdGFsUmVjb3JkcygpPjEgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnVG90YWwgUmVjb3JkczogJyArIHRvdGFsUmVjb3JkcygpXCI+PC9zcGFuPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwiaWY6IHBhZ2VzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LWNoYXJ0XCIgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAnY2hhcnRfZGl2XycgKyAkcGFyZW50LlJlcG9ydElEKCl9LCB2aXNpYmxlOiAkcGFyZW50LmlzQ2hhcnRcIj48L2Rpdj5cclxuICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuUmVwb3J0VHlwZSgpID09ICdQaXZvdCcgLS0+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1waXZvdCcsIGRhdGE6ICRkYXRhIH1cIj48L2Rpdj5cclxuICAgIDwhLS0gL2tvIC0tPlxyXG5cclxuICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuUmVwb3J0VHlwZSgpID09ICdIdG1sJyAtLT5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LXJlbmRlcicsIGRhdGE6ICRkYXRhIH1cIj48L2Rpdj5cclxuICAgIDwhLS0gL2tvIC0tPlxyXG5cclxuICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdQaXZvdCcgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ0h0bWwnICYmICghJHBhcmVudC5pc0NoYXJ0KCkgfHwgJHBhcmVudC5TaG93RGF0YVdpdGhHcmFwaCgpKSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuT3V0ZXJHcm91cENvbHVtbnMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cImZhbHNlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgIE1hbmFnZSBHcm91cHMgPHNwYW4gY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgc3R5bGU9XCJ6LWluZGV4OiAxMDAxO1wiIGRhdGEtYmluZD1cImZvcmVhY2g6ICRwYXJlbnQuT3V0ZXJHcm91cENvbHVtbnNcIj5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZHJvcGRvd24taXRlbSBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogcmVtb3ZlXCIgdGl0bGU9XCJSZW1vdmUgZnJvbSBHcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2xvc2VcIj48L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZpZWxkTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2xlYXItZml4XCI+PC9kaXY+XHJcblxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBvdXRlckdyb3VwRGF0YVwiPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IHJvd3MubGVuZ3RoID4gMCB8fCAoJHBhcmVudC5vdXRlckdyb3VwRGF0YSAmJiAkcGFyZW50Lm91dGVyR3JvdXBEYXRhKCkubGVuZ3RoID09IDEpIC0tPlxyXG4gICAgICAgIDxoNiBkYXRhLWJpbmQ9XCJodG1sOiBkaXNwbGF5XCI+PC9oNj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPjwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50c1sxXS5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSctLT5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC10YWJsZScsIGRhdGE6ICRwYXJlbnQuUmVwb3J0RGF0YSB9XCI+PC9kaXY+XHJcbiAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudHNbMV0uUmVwb3J0VHlwZSgpID09ICdTaW5nbGUnLS0+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtd2lkZ2V0JywgZGF0YTogJHBhcmVudC5SZXBvcnREYXRhIH1cIj48L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSAva28gLS0+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImFkbWluLW1vZGUtdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDEwcHg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBkLWlubGluZS1ibG9ja1wiIHN0eWxlPVwiZm9udC1zaXplOiAxMHB0OyBwYWRkaW5nOiA1cHg7IG1heC13aWR0aDogMzUwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7IG1hcmdpbi1ib3R0b206IDA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS11c2VyLWNpcmNsZVwiPjwvaT4gWW91IGNhbiBtYW5hZ2UgUmVwb3J0cy9EYXNoYm9hcmRzIGZvciBhbGwgdXNlcnNcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidWJibGUtYmFkZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICBBZG1pbiBNb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbXMtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwibWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZVwiPlxyXG4gICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEta2V5XCI+PC9zcGFuPk1hbmFnZSBBY2Nlc3M8L2g1PlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgcGFuZWwtYm9keVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIwcHg7XCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tMyBjb250cm9sLWxhYmVsXCI+Q2xpZW50IElkIHRvIFJlc3RyaWN0IEFjY2VzczwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtYm94IHNpbmdsZS1saW5lXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY2xpZW50SWRcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMSBjb2wtc20tMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlIGhlbHB0aXBcIiB0aXRsZT1cIkxlYXZlIGJsYW5rIHRvIGdpdmUgYWxsIGNsaWVudHMgYWNjZXNzIChHbG9iYWwgUmVwb3J0cylcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW8gZmEtMnhcIj48L3NwYW4+Jm5ic3A7VXNlciBsZXZlbCByaWdodHMgb3ZlcnJpZGUgUm9sZSBsZXZlbCByaWdodHMuIE5vIHNlbGVjdGlvbiBmb3IgYSBydWxlIGltcGxpZXMgcmVwb3J0IGlzIGF2YWlsYWJsZSB0byBhbGwuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZU1hbmFnZVVzZXJzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd01hbmFnZVVzZXJzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dNYW5hZ2VVc2VycygpIH1cIj48L2k+IDxiPk1hbmFnZSBieSBVc2VyPC9iPiAoYWxsb3cgZWRpdClcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd01hbmFnZVVzZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZFVzZXJzKCkubGVuZ3RoID4gMCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGdyb3VwZWRVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzaG93KCFzaG93KCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgdG9nZ2xlLWljb25cIiBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3coKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvdygpIH1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlcIj48L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+ICZuYnNwOyA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwOyA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVXNlcnMoKS5sZW5ndGggPT0gMCAmJiB1c2Vycy5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4mbmJzcDs8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogZ3JvdXBlZFVzZXJzKCkubGVuZ3RoID09IDAgJiYgdXNlcnMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlcnMgbGlzdCBub3QgcG9wdWxhdGVkIG9yIG5vdCBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0b2dnbGUtaWNvbiBmYVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVWaWV3VXNlcnMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93Vmlld1VzZXJzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dWaWV3VXNlcnMoKSB9XCI+PC9pPiA8Yj5WaWV3IG9ubHkgYnkgVXNlcjwvYj4gKG5vIGVkaXQvZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93Vmlld1VzZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZFZpZXdPbmx5VXNlcnMoKS5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZ3JvdXBlZFZpZXdPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRlclwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgc2hvdyghc2hvdygpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIHRvZ2dsZS1pY29uXCIgZGF0YS1iaW5kPVwiY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93KCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3coKSB9XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGRhdGEtYmluZD1cInRleHQ6IGNhdGVnb3J5XCI+PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHZpZXdPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+ICZuYnNwOyA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwOyA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVmlld09ubHlVc2VycygpLmxlbmd0aCA9PSAwICYmIHZpZXdPbmx5VXNlcnMubGVuZ3RoID4gMCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHZpZXdPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4mbmJzcDs8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogZ3JvdXBlZFZpZXdPbmx5VXNlcnMoKS5sZW5ndGggPT0gMCAmJiB1c2Vycy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OiBpc0Rhc2hib2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRGVsZXRlVXNlcnMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93RGVsZXRlVXNlcnMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd0RlbGV0ZVVzZXJzKCkgfVwiPjwvaT48Yj5EZWxldGUgYnkgVXNlcjwvYj4gKGFsbG93IGRlbGV0ZSlcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dEZWxldGVVc2Vyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGdyb3VwZWREZWxldGVPbmx5VXNlcnMoKS5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZ3JvdXBlZERlbGV0ZU9ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzaG93KCFzaG93KCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgdG9nZ2xlLWljb25cIiBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3coKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvdygpIH1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlcIj48L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZGVsZXRlT25seVVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiAmbmJzcDsgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDsgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZERlbGV0ZU9ubHlVc2VycygpLmxlbmd0aCA9PSAwICYmIGRlbGV0ZU9ubHlVc2Vycy5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZGVsZXRlT25seVVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBncm91cGVkRGVsZXRlT25seVVzZXJzKCkubGVuZ3RoID09IDAgJiYgIHVzZXJzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0b2dnbGUtaWNvbiBmYVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVNYW5hZ2VSb2xlcyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dNYW5hZ2VSb2xlcygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93TWFuYWdlUm9sZXMoKSB9XCI+PC9pPjxiPk1hbmFnZSBieSBVc2VyIFJvbGU8L2I+IChhbGxvdyBlZGl0KVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93TWFuYWdlUm9sZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHVzZXJSb2xlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VyUm9sZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBSb2xlcyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZVZpZXdSb2xlcyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dWaWV3Um9sZXMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd1ZpZXdSb2xlcygpIH1cIj48L2k+PGI+VmlldyBvbmx5IGJ5IFVzZXIgUm9sZTwvYj4gKG5vIGVkaXQvZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93Vmlld1JvbGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB2aWV3T25seVVzZXJSb2xlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VyUm9sZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlciBSb2xlcyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogaXNEYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZURlbGV0ZVJvbGVzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd0RlbGV0ZVJvbGVzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dEZWxldGVSb2xlcygpIH1cIj48L2k+PGI+RGVsZXRlIGJ5IFVzZXIgUm9sZTwvYj4gKGFsbG93IGRlbGV0ZSlcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dEZWxldGVSb2xlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGRlbGV0ZU9ubHlVc2VyUm9sZXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogdXNlclJvbGVzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIFJvbGVzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJmaWx0ZXItZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWVyeS1idWlsZGVyIGZvcm0taW5saW5lXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogRmlsdGVyR3JvdXBzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ1bGVzLWdyb3VwLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXMtZ3JvdXAtaGVhZGVyXCIgZGF0YS1iaW5kPVwiYXR0cjoge3BhcmVudGRpdmlkOiBnZW5lcmF0ZVVuaXF1ZUlkKCl9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFpc1Jvb3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXRvZ2dsZSBidG4tZ3JvdXAtc21cIiBkYXRhLWJzLXRvZ2dsZT1cImJ1dHRvbnNcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tbGlnaHQgYWN0aXZlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgZGF0YS1iaW5kPVwiYXR0cjogeyBuYW1lOiAnYW5kT3JHcm91cC0nICsgJGVsZW1lbnQuY2xvc2VzdCgnLnJ1bGVzLWdyb3VwLWhlYWRlcicpLmdldEF0dHJpYnV0ZSgncGFyZW50ZGl2aWQnKSB9LCBjaGVja2VkOiBBbmRPclwiIHZhbHVlPVwiQW5kXCIgLz4gQW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBhY3RpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgZGF0YS1iaW5kPVwiYXR0cjogeyBuYW1lOiAnYW5kT3JHcm91cC0nICsgJGVsZW1lbnQuY2xvc2VzdCgnLnJ1bGVzLWdyb3VwLWhlYWRlcicpLmdldEF0dHJpYnV0ZSgncGFyZW50ZGl2aWQnKSB9LCBjaGVja2VkOiBBbmRPclwiIHZhbHVlPVwiT3JcIiAvPiBPclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LlJlbW92ZUZpbHRlckdyb3VwLCB2aXNpYmxlOiAhaXNSb290XCI+UmVtb3ZlIEdyb3VwPC9idXR0b24+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNSb290XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdCBwYWRkZWQtZGl2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4gJm5ic3A7RmlsdGVyIENvbmRpdGlvbnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXMtZ3JvdXAtYm9keVwiIGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2ZpbHRlci1pbm5lcid9XCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZmx5LWZpbHRlci10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBGbHlGaWx0ZXJzKCkubGVuZ3RoPjAgfHwgRG9udEV4ZWN1dGVPblJ1blwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8YSBkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCIgZGF0YS1iaW5kPVwiYXR0cjogeydkYXRhLWJzLXRhcmdldCc6ICcjZmlsdGVyLXBhbmVsLScgKyBSZXBvcnRJRCgpIH1cIiBocmVmPVwiI1wiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L2k+IENob29zZSBGaWx0ZXJzXHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImF0dHI6IHtpZDogJ2ZpbHRlci1wYW5lbC0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHtjb2xscGFzZWQ6ICFEb250RXhlY3V0ZU9uUnVuKCksIGNvbGxhcHNlOiAhRG9udEV4ZWN1dGVPblJ1bigpfVwiIGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IEZseUZpbHRlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IGNvbC14cy00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB0aXRsZT1cIkFwcGx5IHRoaXMgZmlsdGVyXCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogJHBhcmVudC5BcHBseSwgZGlzYWJsZWQ6IGZvcmNlZFwiIC8+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkRmlsdGVyTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBjbGFzcz1cImNvbC1zbS0yIGNvbC14cy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuQXBwbHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGZpZWxkRmlsdGVyLCB2YWx1ZTogJHBhcmVudC5PcGVyYXRvclwiIHJlcXVpcmVkPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgY2xhc3M9XCJjb2wtc20tNSBjb2wteHMtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAkcGFyZW50LkFwcGx5XCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJGXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1maWx0ZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IEV4ZWN1dGVSZXBvcnRcIj5SdW48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImZpbHRlci1pbm5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ1bGVzLWxpc3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZS1jb250YWluZXJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBGaWx0ZXJzKCkubGVuZ3RoPjBcIj5cclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1ib3JkZXJsZXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+RmllbGQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+RmlsdGVyPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keSBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicnVsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGRhdGEtYmluZD1cInZhbHVlOiBBbmRPciwgdmlzaWJsZTogJGluZGV4KCk+MFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5BbmQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5Pcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLnNlbGVjdGVkRmllbGRzQ2FuRmlsdGVyICE9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uc2VsZWN0ZWRGaWVsZHNDYW5GaWx0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTFdLnNlbGVjdGVkRmllbGRzQ2FuRmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdzZWxlY3RlZEZpZWxkTmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zQ2FwdGlvbjogJ1BsZWFzZSBDaG9vc2UnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge3JlcXVpcmVkOiBGaWVsZCgpPT1udWxsPydyZXF1aXJlZCc6ZmFsc2V9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogRmllbGQoKSAmJiBGaWVsZCgpLmZvcmNlZFwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGZpZWxkRmlsdGVyLCB2YWx1ZTogJHBhcmVudC5PcGVyYXRvclwiIHJlcXVpcmVkPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiIGRhdGEtcGFyZW50cHJlZml4PVwiTVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWZpbHRlcicsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogRmllbGQoKSAmJiBGaWVsZCgpLmZpZWxkVHlwZSA9PSAnRGF0ZVRpbWUnICYmIE9wZXJhdG9yKCkgPT0gJ3JhbmdlJyAmJiAkaW5kZXgoKT09MCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uY2FuQWRkU2VyaWVzICE9IHVuZGVmaW5lZCAmJiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uY2FuQWRkU2VyaWVzKCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uQWRkU2VyaWVzLmJpbmQoJGRhdGEpXCI+QWRkIENvbXBhcmlzb248L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5jYW5BZGRTZXJpZXMgPT0gdW5kZWZpbmVkICYmICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuQWRkU2VyaWVzICE9IHVuZGVmaW5lZCAmJiAkcGFyZW50Q29udGV4dC4kcGFyZW50LmNhbkFkZFNlcmllcygpLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50Q29udGV4dC4kcGFyZW50LkFkZFNlcmllcy5iaW5kKCRkYXRhKVwiPkFkZCBDb21wYXJpc29uPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6IEZpZWxkKCkgJiYgRmllbGQoKS5mb3JjZWRcIiBjbGFzcz1cImJhZGdlIGJnLWluZm9cIj5SZXF1aXJlZCBGaWx0ZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwiZmxleC1ncm93OiAxO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LlJlbW92ZUZpbHRlciwgaGlkZGVuOiBGaWVsZCgpICYmIEZpZWxkKCkuZm9yY2VkXCIgdGl0bGU9XCJSZW1vdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIHN0eWxlPVwiZmxleC1ncm93OiAxO1wiIGRhdGEtYmluZD1cIndpdGg6IEZpZWxkLCBoaWRkZW46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItcGFuZWwuY2FyZC1ib2R5LmNvbGxhcHNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBmaWx0ZXJPbkZseSghZmlsdGVyT25GbHkoKSk7IH0sIGNzczogeydidG4tc3VjY2Vzcyc6IGZpbHRlck9uRmx5KCk9PXRydWUsICdidG4tc2Vjb25kYXJ5JzogZmlsdGVyT25GbHkoKT09ZmFsc2V9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkZpbHRlciBvbiBSZXBvcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBjb21wYXJlVG8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodFwiPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWzJdLlJlbW92ZVNlcmllc1wiPjxzcGFuIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiPjwvc3Bhbj48L2J1dHRvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdXRlZFwiPkNvbXBhcmUgdG88L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IFJhbmdlLCB2YWx1ZTogVmFsdWVcIiByZXF1aXJlZD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmaWx0ZXItZ3JvdXAnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IEFkZEZpbHRlclwiPkFkZCBGaWx0ZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBBZGRGaWx0ZXJHcm91cFwiPkFkZCBGaWx0ZXIgR3JvdXA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJmaWx0ZXItcGFyYW1ldGVyc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJoaWRkZW46IHNob3dQYXJhbWV0ZXJzXCI+Tm8gZmlsdGVycyBhdmFpbGFibGUgdG8gY2hvb3NlPC9zcGFuPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtYm9yZGVybGVzc1wiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dQYXJhbWV0ZXJzXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlXCI+RmlsdGVyPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMjAlXCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlXCI+VmFsdWU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImZvcmVhY2g6IFBhcmFtZXRlcnNcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBkYXRhLWJpbmQ9XCJpZm5vdDogSGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cInRleHQ6IERpc3BsYXlOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IG9wZXJhdG9ycywgdmFsdWU6IE9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJQXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtZmlsdGVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LXNjaGVkdWxlXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IHNjaGVkdWxlQnVpbGRlclwiIGlkPVwic2NoZWR1bGUtYnVpbGRlci1kaXZcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGFzU2NoZWR1bGVcIiBpZD1cInNjaGVkdWxlUmVwb3J0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNjaGVkdWxlUmVwb3J0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIFNldCBTY2hlZHVsZSB0byBzZW5kIGJ5IEVtYWlsXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogaGFzU2NoZWR1bGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE9wdGlvbigpICE9ICdvbmNlJyA/ICdFdmVyeSAnIDogJydcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogb3B0aW9ucywgdmFsdWU6IHNlbGVjdGVkT3B0aW9uXCIgc3R5bGU9XCJtaW4td2lkdGg6IDgwcHg7XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNlbGVjdGVkT3B0aW9uKCkgPT0gJ29uY2UnXCIgY2xhc3M9XCJtZS0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAmbmJzcDtvbiZuYnNwOzxpbnB1dCBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiBzZWxlY3RlZERhdGUsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6IHNlbGVjdGVkRGF0ZX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogc2hvd0RheXNcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7b24mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tc2VsZWN0IG1zLTJcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IHBsYWNlaG9sZGVyOiAnQ2hvb3NlIERheXMnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6IGRheXMsIHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWREYXlzXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogc2hvd0RhdGVzXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO29uJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgcGxhY2Vob2xkZXI6ICdDaG9vc2UgRGF0ZXMnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6IGRhdGVzLCBzZWxlY3RlZE9wdGlvbnM6IHNlbGVjdGVkRGF0ZXNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93TW9udGhzXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO29uJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbXVsdGlwbGUgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgcGxhY2Vob2xkZXI6ICdDaG9vc2UgTW9udGhzJywgYWxsb3dDbGVhcjogdHJ1ZSB9LCBvcHRpb25zOiBtb250aHMsIHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWRNb250aHNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93QXRUaW1lXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7YXQmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IG1lLTJcIiBzdHlsZT1cIm1pbi13aWR0aDogNjBweDtcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBob3VycywgdmFsdWU6IHNlbGVjdGVkSG91clwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgbWUtMlwiIHN0eWxlPVwibWluLXdpZHRoOiA2MHB4O1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IG1pbnV0ZXMsIHZhbHVlOiBzZWxlY3RlZE1pbnV0ZVwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogc2VsZWN0ZWRBbVBtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkFNPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlBNPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgIFJlcG9ydCB3aWxsIGJlIHJ1biBhbmQgZW1haWxlZCA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE9wdGlvbigpICE9ICdvbmNlJyA/ICdldmVyeScgOiAnJ1wiPjwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRPcHRpb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogc2VsZWN0ZWRPcHRpb24oKSA9PSAnb25jZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICBvbiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogIXNlbGVjdGVkRGF0ZSgpXCI+UGxlYXNlIHBpY2sgYSBEYXRlPC9zcGFuPiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZERhdGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogc2hvd0RheXNcIj5cclxuICAgICAgICAgICAgICAgICAgICBvbiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWREYXlzKCkubGVuZ3RoID09IDBcIj5QbGVhc2UgcGljayBEYXkocyk8L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkRGF5c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93RGF0ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICBvbiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWREYXRlcygpLmxlbmd0aCA9PSAwXCI+UGxlYXNlIHBpY2sgRGF0ZShzKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBzZWxlY3RlZERhdGVzXCI+PHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogJGluZGV4KCk+MFwiPiwgPC9zcGFuPjxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRkYXRhID09IDEgPyAnMXN0JzogKCRkYXRhID09IDIgPyAnMm5kJyA6ICgkZGF0YSA9PSAzID8gJzNyZCcgOiAoJGRhdGEgPT0gMzEgPyAnMzFzdCcgOiAkZGF0YSsndGgnKSkpXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93TW9udGhzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgb2YgPHNwYW4gY2xhc3M9XCJlcnJvclwiIGRhdGEtYmluZD1cInZpc2libGU6IHNlbGVjdGVkTW9udGhzKCkubGVuZ3RoID09IDBcIj5QbGVhc2UgcGljayBNb250aChzKTwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRNb250aHNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogc2hvd0F0VGltZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIGF0IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkSG91clwiPjwvc3Bhbj46PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRNaW51dGVcIj48L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkQW1QbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+RW1haWwgdG88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBlbWFpbFRvXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBFbWFpbCBBZGRyZXNzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hIHRvIHNlbmQgdGhlIFJlcG9ydCB0b1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTEgY29sLWZvcm0tbGFiZWxcIj5Gb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybWF0LGV2ZW50OiB7IGNoYW5nZTogb25Gb3JtYXRDaGFuZ2UgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkVYQ0VMXCI+RXhjZWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5jYW5EcmlsbGRvd24gJiYgJHBhcmVudC5jYW5EcmlsbGRvd24oKVwiIHZhbHVlPVwiRVhDRUwtU1VCXCI+RXhjZWwgKEV4cGFuZGVkKTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkNTVlwiPkNTVjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlBERlwiPlBERjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIldPUkRcIj5Xb3JkPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiTElOS1wiPkxpbms8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+UGljayBUaW1lIFpvbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiB0aW1lem9uT3B0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2Rpc3BsYXlOYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndGltZVpvbmVJZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFRpbWV6b25lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QyOiB7ZHJvcGRvd25QYXJlbnQ6ICQoJyNzY2hlZHVsZS1idWlsZGVyLWRpdicpLCBhbGxvd0NsZWFyOiB0cnVlLCBwbGFjZWhvbGRlcjogJ1NldCBhIHRpbWUgem9uZSB0byBzZW5kIHJlcG9ydCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiB0aXRsZT1cIlNldCBhIGRhdGUgdG8gc3RhcnQgc2VuZGluZyBzY2hlZHVsZWQgcmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGFzU2NoZWR1bGVTdGFydFwiIGlkPVwic2NoZWR1bGVTdGFydENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2NoZWR1bGVTdGFydENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGUgU3RhcnQgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCIgZGF0YS1iaW5kPVwiaWY6IGhhc1NjaGVkdWxlU3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiBzY2hlZHVsZVN0YXJ0LCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiBzY2hlZHVsZVN0YXJ0fVwiIHRpdGxlPVwiU2NoZWR1bGVkIFJlcG9ydCB3aWxsIG5vdCBiZSBzZW50IGJlZm9yZSB0aGlzIGRhdGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiB0aXRsZT1cIlNldCBhIGRhdGUgdG8gc3RvcCBzZW5kaW5nIHNjaGVkdWxlZCByZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoYXNTY2hlZHVsZUVuZFwiIGlkPVwic2NoZWR1bGVFbmRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNjaGVkdWxlRW5kQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZSBFbmQgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCIgZGF0YS1iaW5kPVwiaWY6IGhhc1NjaGVkdWxlRW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwiZGF0ZXBpY2tlcjogc2NoZWR1bGVFbmQsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6IHNjaGVkdWxlRW5kfVwiIHRpdGxlPVwiU2NoZWR1bGVkIFJlcG9ydCB3aWxsIG5vdCBiZSBzZW50IGFmdGVyIHRoaXMgZGF0ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWZpZWxkLW9wdGlvbnNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBzdHlsZT1cIm1heC13aWR0aDogNzUwcHg7XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBlZGl0RmllbGRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGROYW1lXCI+PC9zcGFuPiAtIFNldHVwIEFkZGl0aW9uYWwgRmllbGQgT3B0aW9uczwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBuZWVkcy12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Yj5Db2x1bW4gRm9ybWF0IFNldHRpbmdzPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGljayBEYXRhIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogWydEYXlzJywgJ0hvdXJzJywgJ01pbnV0ZXMnLCAnU2Vjb25kcyddLmluZGV4T2YoZmllbGRGb3JtYXQoKSkgPj0gMCA/IFsnRGF5cycsICdIb3VycycsICdNaW51dGVzJywgJ1NlY29uZHMnXSA6ICRwYXJlbnRzWzFdLmZpZWxkRm9ybWF0VHlwZXMsIHZhbHVlOiBmaWVsZEZvcm1hdFwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50c1sxXS5kZWNpbWFsRm9ybWF0VHlwZXMuaW5kZXhPZigkZGF0YS5maWVsZEZvcm1hdCgpKT49MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGljayBEZWNpbWFsIFBsYWNlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBkZWNpbWFsUGxhY2VzXCIgcGxhY2Vob2xkZXI9XCJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmaWVsZEZvcm1hdCgpPT0nQ3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIEN1cnJlbmN5IEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogJHBhcmVudHNbMV0uY3VycmVuY3lGb3JtYXRzLCBvcHRpb25zVGV4dDogJ2Rpc3BsYXknLG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJywgdmFsdWU6IGN1cnJlbmN5Rm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZpZWxkRm9ybWF0KCk9PSdEYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGljayBEYXRlIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogJHBhcmVudHNbMV0uZGF0ZUZvcm1hdHMsIHZhbHVlOiBkYXRlRm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6c2VsZWN0ZWRBZ2dyZWdhdGUoKT09J1Bpdm90JyAmJiBmaWVsZEZvcm1hdCgpPT0nRGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlBpdm90IERyaWxsZG93biBEYXRlIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogWycnLCAnRGF5JywgJ01vbnRoJywgJ1llYXInLCAnTW9udGgvWWVhciddLCB2YWx1ZTogZHJpbGxEYXRhRm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmaWVsZEZvcm1hdCgpPT0nRGF0ZScgJiYgZGF0ZUZvcm1hdCgpPT09J0N1c3RvbSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkVudGVyIEN1c3RvbSBEYXRlIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY3VzdG9tRGF0ZUZvcm1hdFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+Q2hvb3NlIENvbHVtbiBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZmllbGRMYWJlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+SW5uZXIgQ29sdW1uIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBmaWVsZExhYmVsMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+Q2hvb3NlIFRleHQgQWxpZ25tZW50PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50c1sxXS5maWVsZEFsaWdubWVudHMsIHZhbHVlOiBmaWVsZEFsaWduXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+Q2hvb3NlIFdpZHRoIChsZWF2ZSBibGFuayBmb3IgYXV0byk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZpZWxkV2lkdGhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+SGVhZGVyIFNldHRpbmdzPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBUZXh0IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBoZWFkZXJGb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyRm9udENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiQXBwbHkgdG8gYWxsIGNvbHVtbnNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXthcHBseUFsbEhlYWRlckZvbnRDb2xvcighYXBwbHlBbGxIZWFkZXJGb250Q29sb3IoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGFwcGx5QWxsSGVhZGVyRm9udENvbG9yKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgQmFja2dyb3VuZCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiAzOHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyQmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGhlYWRlckJhY2tDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxIZWFkZXJCYWNrQ29sb3IoIWFwcGx5QWxsSGVhZGVyQmFja0NvbG9yKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEhlYWRlckJhY2tDb2xvcigpID8gJ2ZhLWNoZWNrJyA6ICdmYS1wYXN0ZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGVhZGVyRm9udEJvbGRcIiBpZD1cImhlYWRlckZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiaGVhZGVyRm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkIFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsSGVhZGVyQm9sZCghYXBwbHlBbGxIZWFkZXJCb2xkKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxIZWFkZXJCb2xkKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+VGV4dCBTZXR0aW5nczwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgVGV4dCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiAzOHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9udENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsRm9udENvbG9yKCFhcHBseUFsbEZvbnRDb2xvcigpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxGb250Q29sb3IoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBCYWNrZ3JvdW5kIENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBiYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGJhY2tDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxCYWNrQ29sb3IoIWFwcGx5QWxsQmFja0NvbG9yKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEJhY2tDb2xvcigpID8gJ2ZhLWNoZWNrJyA6ICdmYS1wYXN0ZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogZm9udEJvbGRcIiBpZD1cImZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkIFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsQm9sZCghYXBwbHlBbGxCb2xkKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxCb2xkKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRlZC1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHthZGRDb25kaXRpb25hbEZvcm1hdFNldHRpbmcobnVsbCl9XCI+QWRkIENvbmRpdGlvbmFsIEZvcm1hdHRpbmc8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBmaWVsZENvbmR0aW9uYWxGb3JtYXRzXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDQwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5Db25kaXRpb25hbCBGb3JtYXQgIzxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRpbmRleCgpKzFcIj48L3NwYW4+PC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZVNldHRpbmdcIj5SZW1vdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgVGV4dCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaWNrIEJhY2tncm91bmQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiAzOHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogYmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogYmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGZvbnRCb2xkXCIgaWQ9XCJmb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkIFRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0yXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogZmlsdGVyLkZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogZmllbGRGaWx0ZXIsIHZhbHVlOiAkcGFyZW50Lk9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJDXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtZmlsdGVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudHNbMV0udXNlU3RvcmVkUHJvYygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggcHVsbC1sZWZ0XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGVja091dGVyR3JvdXBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dGVyIEdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiBjYW5jZWxGaWVsZE9wdGlvbnNcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGaWVsZE9wdGlvbnNcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1saW5rLWVkaXRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBzdHlsZT1cIm1heC13aWR0aDogNzUwcHg7XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBlZGl0TGlua0ZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+U2V0dXAgTGluayBGaWVsZDwvaDU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBuZWVkcy12YWxpZGF0aW9uXCIgZGF0YS1iaW5kPVwid2l0aDogbGlua0ZpZWxkSXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlRoaXMgZmllbGQgd2lsbCBsaW5rIHRvPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogbGlua1R5cGVzLCB2YWx1ZTogc2VsZWN0ZWRMaW5rVHlwZVwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBMaW5rc1RvUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5MaW5rIHRvIHRoaXMgUmVwb3J0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50Q29udGV4dC4kcGFyZW50LlNhdmVkUmVwb3J0cywgb3B0aW9uc1RleHQ6ICdyZXBvcnROYW1lJywgb3B0aW9uc1ZhbHVlOiAncmVwb3J0SWQnLCB2YWx1ZTogTGlua2VkVG9SZXBvcnRJZCwgb3B0aW9uc0NhcHRpb246ICdDaG9vc2UgdGhlIFJlcG9ydCB0byBsaW5rIHRvJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJpZjogTGlua2VkVG9SZXBvcnRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2VuZEFzRmlsdGVyUGFyYW1ldGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQgZmllbGQgdmFsdWUgYXMgUmVwb3J0IEZpbHRlciBQYXJhbWV0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogU2VuZEFzRmlsdGVyUGFyYW1ldGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5MaW5rIHRvIHRoaXMgUmVwb3J0IEZpbHRlcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwib3B0aW9uczogYWxsRmllbGRzLCBvcHRpb25zVGV4dDogJ2ZpZWxkTmFtZScsIG9wdGlvbnNWYWx1ZTogJ2ZpZWxkSWQnLCB2YWx1ZTogU2VsZWN0ZWRGaWx0ZXJJZCwgb3B0aW9uc0NhcHRpb246ICdDaG9vc2UgdGhlIEZpZWxkIHRvIEZpbHRlciBieSB2YWx1ZSdcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IExpbmtzVG9SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkxpbmsgdG8gdGhpcyBVUkw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJFbnRlciBhIHVybCB0byBvcGVuXCIgZGF0YS1iaW5kPVwidmFsdWU6IExpbmtUb1VybFwiIHRpdGxlPVwiVmFsaWQgVVJMIG5lZWRzIHRvIHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovL1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNlbmRBc1F1ZXJ5UGFyYW1ldGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQgZmllbGQgdmFsdWUgYXMgUXVlcnkgUGFyYW1ldGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwiaWY6IFNlbmRBc1F1ZXJ5UGFyYW1ldGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QYXJhbWV0ZXIgTmFtZSB0byB1c2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJFbnRlciBwYXJhbWV0ZXIgbmFtZSB0byBzZW5kIHZhbHVlIGFzXCIgZGF0YS1iaW5kPVwidmFsdWU6IFF1ZXJ5UGFyYW1ldGVyTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiByZW1vdmVMaW5rRmllbGRcIj5SZW1vdmUgTGluazwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUxpbmtGaWVsZFwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItY2hvb3NlLXZpc3VhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJWaXN1YWxpemF0aW9uIE9wdGlvbnNcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdMaXN0Jyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J0xpc3QnIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1saXN0LWFsdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+TGlzdDwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdTdW1tYXJ5Jyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1N1bW1hcnknIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS10YWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+U3VtbWFyeTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdCYXInKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nQmFyJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtYmFyLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5CYXI8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnUGllJyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1BpZScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXBpZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+UGllPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0xpbmUnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nTGluZScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWxpbmUtY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkxpbmU8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnQ29tYm8nKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nQ29tYm8nIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1zaWduYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkNvbWJvPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0h0bWwnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nSHRtbCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWNvZGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkN1c3RvbTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdNYXAnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpLmluZGV4T2YoJ01hcCcpPT0wIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1nbG9iZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+TWFwPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0hlYXRNYXAnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpLmluZGV4T2YoJ0hlYXRNYXAnKT09MCB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtbWFwXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5IZWF0TWFwPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1NpbmdsZScpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdTaW5nbGUnIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS13aW5kb3ctbWF4aW1pemVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPktQSTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdUcmVlbWFwJyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1RyZWVtYXAnIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS13aW5kb3ctcmVzdG9yZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+VHJlZW1hcDwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdQaXZvdCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdQaXZvdCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXJhbmRvbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+VHJhbnNwb3NlPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1jaG9vc2UtZGF0YVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0IGJ0bi1ncm91cCBidG4tZ3JvdXAtdG9nZ2xlXCIgcm9sZT1cImdyb3VwXCIgZGF0YS1iaW5kPVwiaWY6IFJlcG9ydElEKCkgPD0gMFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodCBhY3RpdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMHB4O1wiIHRpdGxlPVwiWW91IGNhbiBjaGFuZ2UgdGhlIERhdGEgc291cmNlIG9ubHkgd2hlbiBjcmVhdGluZyBhIG5ldyByZXBvcnQsIGNoYW5naW5nIHRoaXMgd2lsbCBjbGVhciBhbGwgc2VsZWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkYXRhb3B0aW9uXCIgaWQ9XCJ0YWJsZVwiIGNoZWNrZWQgZGF0YS1iaW5kPVwiY2hlY2tlZDogdXNlU3RvcmVkUHJvYywgY2hlY2tlZFZhbHVlOiBmYWxzZVwiPiBEeW5hbWljXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IGFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkYXRhb3B0aW9uXCIgaWQ9XCJwcm9jXCIgdmFsdWU9XCIxXCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogdXNlU3RvcmVkUHJvYywgY2hlY2tlZFZhbHVlOiB0cnVlXCI+IFByZWRlZmluZWRcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgdGl0bGU9XCJBZGQgQ3VzdG9tIEZpZWxkIHVzaW5nIEZvcm11bGFcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IGlzRnVuY3Rpb25GaWVsZCgpIHx8IHVzZVN0b3JlZFByb2MoKSwgY2xpY2s6IGNhbmNlbEZvcm11bGFGaWVsZCwgdGV4dDogaXNGb3JtdWxhRmllbGQoKT8gJ0NhbmNlbCc6ICdDdXN0b20gRmllbGQnLCBjc3M6IHsnYnRuLXByaW1hcnknOiAhaXNGb3JtdWxhRmllbGQoKSwgJ2J0bi1kYW5nZXInOiBpc0Zvcm11bGFGaWVsZH1cIj48L2E+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIkFkZCBDdXN0b20gRmllbGQgdXNpbmcgRnVuY3Rpb25cIiBkYXRhLWJpbmQ9XCJoaWRkZW46IHRydWUgfHwgaXNGb3JtdWxhRmllbGQoKSB8fCB1c2VTdG9yZWRQcm9jKCksIGNsaWNrOiBmdW5jdGlvbigpe2Rlc2lnbkZ1bmN0aW9uRmllbGQoKX0sIHRleHQ6IGlzRnVuY3Rpb25GaWVsZCgpPyAnQ2FuY2VsJzogJ0Z1bmN0aW9uIEZpZWxkJywgY3NzOiB7J2J0bi1wcmltYXJ5JzogIWlzRnVuY3Rpb25GaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRnVuY3Rpb25GaWVsZH1cIj48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBkYXRhLWJpbmQ9XCJkaXNhYmxlOiBpc0Zvcm11bGFGaWVsZCwgaGlkZGVuOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogdGV4dFF1ZXJ5LnNlYXJjaEZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInNlYXJjaC1maWVsZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwic2VsZWN0Mjoge2Ryb3Bkb3duUGFyZW50OiAkcm9vdC5hY3RpdmVEZXNpZ24oKSA/ICQoJyNjaG9vc2UtZGF0YS1kZXNpZ24nKSA6ICQoJyNjaG9vc2UtZGF0YS1jYXJkJyksIHBsYWNlaG9sZGVyOiAnU2VhcmNoIGZvciBhIERhdGEgRmllbGQuLi4nLCBhamF4OiB7IHVybDogdXJsLCBkYXRhVHlwZTogJ2pzb24nLCBkYXRhOiBxdWVyeSwgcHJvY2Vzc1Jlc3VsdHM6IHByb2Nlc3NSZXN1bHRzLCBoZWFkZXJzOiBoZWFkZXJzIH0sIG1pbmltdW1JbnB1dExlbmd0aDogMiwgYWxsb3dDbGVhcjogdHJ1ZSB9LCB2YWx1ZTogc2VsZWN0ZWRPcHRpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwic2VsZWN0MlZhbHVlOiB7ZHJvcGRvd25QYXJlbnQ6ICRyb290LmFjdGl2ZURlc2lnbigpID8gJCgnI2Nob29zZS1kYXRhLWRlc2lnbicpIDogJCgnI2Nob29zZS1kYXRhLWNhcmQnKX0sIG9wdGlvbnM6IFByb2NzLCBvcHRpb25zQ2FwdGlvbjogJ0Nob29zZSBTZWN0aW9uLi4uJywgb3B0aW9uc1RleHQ6ICdEaXNwbGF5TmFtZScsIHZhbHVlOiBTZWxlY3RlZFByb2MsIHZpc2libGU6IHVzZVN0b3JlZFByb2NcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cImhpZGRlbjogdXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMTVweDtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBEYXRhIHRvIHVzZSBpbiBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlIHRleHQtbXV0ZWRcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkNob29zZSBhIHRhYmxlIHRvIHNob3cgZmllbGRzIHRvIHNlbGVjdC5cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtc2VsZWN0LXRyZWVcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogQ2F0ZWdvcml6ZWRUYWJsZXMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBpc0V4cGFuZGVkKCFpc0V4cGFuZGVkKCkpOyB9LCB2aXNpYmxlOiBjYXRlZ29yeU5hbWVcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogaXNFeHBhbmRlZCgpID8gJ2ZhLWNoZXZyb24tZG93biB0ZXh0LXNlY29uZGFyeScgOiAnZmEtY2hldnJvbi1yaWdodCB0ZXh0LXNlY29uZGFyeSdcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGlzRXhwYW5kZWQoKSA/ICdmYS1mb2xkZXItb3BlbicgOiAnZmEtZm9sZGVyJ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlOYW1lXCIgY2xhc3M9XCJtbC0yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtbGlzdFwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzRXhwYW5kZWQoKSwgZm9yZWFjaDogdGFibGVzXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDE1cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYm9yZGVyLWJvdHRvbSBweS0yIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgc2VsZWN0VGFibGUoJGRhdGEpOyB9LCBjc3M6IHsndGV4dC1tdXRlZCc6ICFpc0VuYWJsZWQoKX0sIHN0eWxlOiB7Y3Vyc29yOiBpc0VuYWJsZWQoKSA/ICdwb2ludGVyJyA6ICcnfSwgYXR0cjoge3RpdGxlOiAhaXNFbmFibGVkKCkgPyAnQ2Fubm90IHVzZSB0YWJsZSBhcyBqb2lucyBkbyBub3QgZXhpc3QnOiAnJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBmYVwiIGRhdGEtYmluZD1cImNzczogaXNFbmFibGVkKCkgPyAoJGRhdGEgPT09ICRwYXJlbnRzWzFdLlNlbGVjdGVkVGFibGUoKSA/ICdmYS1jaGV2cm9uLWRvd24nIDogJ2ZhLWNoZXZyb24tcmlnaHQnKSA6ICdmYS1iYW4nXCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRhYmxlXCI+PC9zcGFuPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRhYmxlTmFtZVwiIGNsYXNzPVwiXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJGRhdGEgPT09ICRwYXJlbnRzWzFdLlNlbGVjdGVkVGFibGUoKSAmJiAhJHBhcmVudHNbMV0uaXNGb3JtdWxhRmllbGQoKSAmJiAhJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpLmR5bmFtaWNDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWzFdLk1vdmVBbGxGaWVsZHNcIj5TZWxlY3QgYWxsPC9hPiB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWzFdLlJlbW92ZVNlbGVjdGVkRmllbGRzXCI+UmVtb3ZlIGFsbDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmllbGRzIEV4cGFuZCBIZXJlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkZGF0YSA9PT0gJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDMwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiAkcGFyZW50c1sxXS5DaG9vc2VGaWVsZHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBib3JkZXItYm90dG9tIHB5LTIgYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkSW5BcnJheToge2FycmF5OiAkcGFyZW50c1syXS5pc0Zvcm11bGFGaWVsZCgpID8gJHBhcmVudHNbMl0uZm9ybXVsYUZpZWxkcyA6ICRwYXJlbnRzWzJdLlNlbGVjdGVkRmllbGRzLCB2YWx1ZTogJGRhdGF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGROYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLXNlbGVjdGVkLWRhdGFcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogU2VsZWN0ZWRGaWVsZHMoKS5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgIFBsZWFzZSBjaG9vc2UgZGF0YVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBTZWxlY3RlZEZpZWxkcygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0JhcidcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBCYXIgR3JhcGgsIHRoZSBmaXJzdCBmaWVsZCBiZWxvdyB3aWxsIHNob3cgb24gdGhlIHgtYXhpcy4gQWxsIG90aGVyIG51bWVyaWMgZmllbGRzIHdpbGwgc2hvdyBvbiB5LWF4aXMuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRIb3Jpem9udGFsXCIgLz5cclxuICAgICAgICAgICAgICAgIEhvcml6b250YWwgQmFyIENoYXJ0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRTdGFja2VkXCIgLz5cclxuICAgICAgICAgICAgICAgIFN0YWNrZWQgQmFyIENoYXJ0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nUGllJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIFBpZSBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgYmUgZ3JvdXBlZCwgYW5kIHRoZSBmaXJzdCBudW1lcmljIGZpZWxkIHdpbGwgc2hvdyBhcyB0aGUgcmF0aW8uXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogcGllQ2hhcnREb251dFwiIC8+XHJcbiAgICAgICAgICAgICAgICBEb251dCBDaGFydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J1RyZWVtYXAnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTBcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgVHJlZW1hcCwgdGhlIGRhdGEgbXVzdCBiZSBpbiBhIGhpZXJhcmNoaWNhbCBmb3JtYXQgd2l0aCAybmQgY29sdW1uIGhhdmluZyBwYXJlbnQgYW5kIHRoaXJkIGNvbHVtbiBoYXZpbmcgYSBudW1lcmljIHZhbHVlLiBUaGUgZGF0YSBtdXN0IGhhdmUgYSBzaW5nbGUgcm9vdCBub2RlIGhhdmluZyBudWxsIGFzIGl0cyBwYXJlbnQgYXMgd2VsbC5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIZWF0TWFwJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItbyBmYS0yeFwiPjwvc3Bhbj4mbmJzcDtGb3IgSGVhdE1hcCwgdGhlIGZpcnN0IHR3byBjb2x1bW5zIG11c3QgYmUgbnVtZXJpYyB2YWx1ZXMgcmVwcmVzZW50aW5nXHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPkxhdGl0dWRlPC9zdHJvbmc+IGFuZCA8c3Ryb25nPkxvbmdpdHVkZTwvc3Ryb25nPi4gQXQgbGVhc3Qgb25lIGFkZGl0aW9uYWwgbnVtZXJpYyBjb2x1bW4gaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGVcclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+aW50ZW5zaXR5PC9zdHJvbmc+IG9mIGVhY2ggcG9pbnQuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGhlYXRNYXBPcHRpb25zLnNob3dNYXJrZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTaG93IE1hcmtlclxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLTEyIGZ3LWJvbGRcIj5IZWF0bWFwIENvbG9yczwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IG1iLTJcIj4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhdE1hcE9wdGlvbnMuZ3JhZGllbnQxXCIgdGl0bGU9XCJHcmFkaWVudCAxXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IGhlYXRNYXBPcHRpb25zLmdyYWRpZW50MlwiIHRpdGxlPVwiR3JhZGllbnQgMlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiBoZWF0TWFwT3B0aW9ucy5ncmFkaWVudDNcIiB0aXRsZT1cIkdyYWRpZW50IDNcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0xpbmUnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgTGluZSBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgc2hvdyBvbiB0aGUgeC1heGlzLiBBbGwgb3RoZXIgZmllbGRzIHdpbGwgbnVtZXJpYyBmaWVsZHMgd2lsbCBzaG93IG9uIHktYXhpcy5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBsaW5lQ2hhcnRBcmVhXCIgLz5cclxuICAgICAgICAgICAgICAgIEFyZWEgQ2hhcnRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdDb21ibydcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBDb21ibyBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgc2hvdyBvbiB0aGUgeC1heGlzLiBBbGwgb3RoZXIgbnVtZXJpYyBmaWVsZHMgd2lsbCBzaG93IG9uIHktYXhpcywgYW5kIHlvdSBjYW4gY2hvb3NlIGRpc3BsYXkgZWFjaCBzZXJpZXMgYXMgbGluZSwgYmFyIG9yIGFyZWEuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+RGVmYXVsdCBTZXJpZXMgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBzZXJpZXNUeXBlcywgdmFsdWU6IGNvbWJvQ2hhcnRUeXBlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdQaXZvdCdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBUcmFuc3Bvc2UsIHRoZSBmaXJzdCBmaWVsZCBiZWxvdyB3aWxsIGJlIHVzZWQgdG8gUGl2b3QvVHJhbnNwb3NlIHRoZSByb3dzIGFzIGNvbHVtbnMsIGFuZCBpdCBtdXN0IGJlIGdyb3VwZWQuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J1NpbmdsZSdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0tQSSBpcyBhIHNpbmdsZSB2YWx1ZSByZXBvcnQgdGhhdCBpcyBpZGVhbCBmb3IgcGxhY2luZyBvbiBhIERhc2hib2FyZC4gQWxsIGZpZWxkcyBleGNlcHQgb25lIG11c3QgYmUgaGlkZGVuIGZvciBXaWRnZXRzLlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IHNtYWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGRvbnRHcm91cEN1c3RvbVwiIC8+XHJcbiAgICAgICAgICAgICAgICBMaXN0IChEb24ndCBTdW1tYXJpemUpXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nTWFwJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIE1hcCBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IGhhcyB0byBiZSBhIFJlZ2lvbiwgbGlrZSBhIENvdW50cnkuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29udHJvbC1sYWJlbFwiPk1hcCBEaXNwbGF5PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBtYXBSZWdpb25zLCB2YWx1ZTogbWFwUmVnaW9uXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiIGRhdGEtYmluZD1cInNvcnRhYmxlOiB7IGRhdGE6IFNlbGVjdGVkRmllbGRzLCBvcHRpb25zOiB7IGhhbmRsZTogJy5zb3J0YWJsZScsIGN1cnNvcjogJ21vdmUnLCBwbGFjZWhvbGRlcjogJ2Ryb3AtaGlnaGxpZ2h0JyB9LCBzdHJhdGVneU1vdmU6IHRydWUgfVwiPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnRhYmxlIHB1bGwtbGVmdFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTVweDtcIiBkYXRhLWJpbmQ9XCJpZm5vdDogJHBhcmVudC51c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtdlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRHJhZyB0byByZW9yZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvbHVtbnNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRGaWVsZE5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogaXNGb3JtdWxhRmllbGQoKSA/ICcoJyArIGZpZWxkRm9ybWF0KCkgKyAnKScgOiAnJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhJHBhcmVudC5pc0ZpZWxkVmFsaWRGb3JZQXhpcygkaW5kZXgoKSwgZmllbGRUeXBlIHx8IGZpZWxkRm9ybWF0KCksIHNlbGVjdGVkQWdncmVnYXRlKCkpICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9J1RyZWVtYXAnICYmICRwYXJlbnQuaXNDaGFydCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogIWdyb3VwSW5HcmFwaCgpXCI+V2lsbCBub3Qgc2hvdyBpbiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAkcGFyZW50LlJlcG9ydFR5cGVcIj48L3NwYW4+Q2hhcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuSXNQaXZvdEZpZWxkTGFzdENvbHVtbigkaW5kZXgoKSxzZWxlY3RlZEFnZ3JlZ2F0ZSgpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiID5QaXZvdCBmaWVsZCBjYW5ub3QgYmUgdGhlIGxhc3QgY29sdW1uLjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5Jc0R5bmFtaWNGaWVsZEZpcnN0Q29sdW1uKCRpbmRleCgpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiID5EeW5hbWljIGNhbm5vdCBiZSBmaXJzdCBjb2x1bW4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHg7XCIgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuQWdncmVnYXRlUmVwb3J0KCkgJiYgISRwYXJlbnQudXNlU3RvcmVkUHJvYygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLWNvbnRyb2wtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50LmNhbkRyaWxsZG93bigpICYmICRpbmRleCgpPjAgPyBmaWVsZEFnZ3JlZ2F0ZVdpdGhEcmlsbGRvd24gOiBmaWVsZEFnZ3JlZ2F0ZSwgdmFsdWU6IHNlbGVjdGVkQWdncmVnYXRlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiIGRhdGEtYmluZD1cImlmbm90OiAkcGFyZW50LnVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgdGl0bGU9XCJDYW5ub3QgRGVsZXRlIFJlcXVpcmVkIEZpbHRlclwiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcmNlRmlsdGVyRm9yVGFibGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdHJhc2hcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkRlbGV0ZSB0aGlzIEZpZWxkXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuUmVtb3ZlRmllbGQsIGhpZGRlbjogZm9yY2VGaWx0ZXJGb3JUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwiaWZub3Q6ICRwYXJlbnQudXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBmaWx0ZXJPbkZseSghZmlsdGVyT25GbHkoKSk7IH0sIGNzczoge2FjdGl2ZTogZmlsdGVyT25GbHkoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJGaWx0ZXIgYnkgdGhpcyBmaWVsZCBvbiB0aGUgUmVwb3J0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdQaXZvdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRGlzYWJsZSwgY3NzOiB7YWN0aXZlOiBkaXNhYmxlZCgpPT10cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jbG9zZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRG8gbm90IGluY2x1ZGUgaW4gUmVwb3J0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdQaXZvdCcgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdMaXN0JyAmJiAhJHBhcmVudC51c2VTdG9yZWRQcm9jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgaGlkZUluRGV0YWlsKCFoaWRlSW5EZXRhaWwoKSk7IH0sIGNzczoge2FjdGl2ZTogaGlkZUluRGV0YWlsKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWV5ZS1zbGFzaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiSGlkZSBpbiBEZXRhaWxzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5pc0ZpZWxkVmFsaWRGb3JZQXhpcygkaW5kZXgoKSwgZmllbGRUeXBlIHx8IGZpZWxkRm9ybWF0KCksIHNlbGVjdGVkQWdncmVnYXRlKCkpICAmJiAkcGFyZW50LmlzQ2hhcnQoKSAmJiAkaW5kZXgoKT4wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IGdyb3VwSW5HcmFwaCghZ3JvdXBJbkdyYXBoKCkpOyB9LCBjc3M6IHthY3RpdmU6IGdyb3VwSW5HcmFwaCgpPT1mYWxzZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2lnbmFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJJbmNsdWRlIGluIHNlcmllc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuSW5jbHVkZVN1YlRvdGFsKCkgICYmICAoWydJbnQnLCAnRG91YmxlJywgJ01vbmV5JywgJ0RlY2ltYWwnLCAnQ3VycmVuY3knXS5pbmRleE9mKGZpZWxkVHlwZSkgPj0gMCB8fCBbJ0ludCcsICdEb3VibGUnLCAnTW9uZXknLCAnRGVjaW1hbCcsICdDdXJyZW5jeSddLmluZGV4T2YoZmllbGRGb3JtYXQoKSkgPj0gMClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgZG9udFN1YlRvdGFsKCFkb250U3ViVG90YWwoKSk7IH0sIGNzczoge2FjdGl2ZTogZG9udFN1YlRvdGFsKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJEb24ndCBhZGQgdG8gVG90YWwgcm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCkhPSdQaXZvdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogc2V0dXBMaW5rRmllbGQsIGNzczoge2FjdGl2ZTogbGlua0ZpZWxkKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpbmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkxpbmsgdG8gYW5vdGhlciBSZXBvcnQgb3IgVXJsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5SZXBvcnRUeXBlKCk9PSdDb21ibycgJiYgJHBhcmVudC5pc0ZpZWxkVmFsaWRGb3JZQXhpcygkaW5kZXgoKSwgZmllbGRUeXBlIHx8IGZpZWxkRm9ybWF0KCksIHNlbGVjdGVkQWdncmVnYXRlKCkpICAmJiAkcGFyZW50LmlzQ2hhcnQoKSAmJiAkaW5kZXgoKT4wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNlcmllc1R5cGUoc2VyaWVzVHlwZSgpID09ICdsaW5lJyA/ICdhcmVhJyA6IChzZXJpZXNUeXBlKCk9PSdiYXJzJyA/ICdsaW5lJyA6ICdiYXJzJykpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwiY3NzOiB7J2ZhLWxpbmUtY2hhcnQnOiBzZXJpZXNUeXBlKCkgPT0gJ2xpbmUnLCAnZmEtYmFyLWNoYXJ0Jzogc2VyaWVzVHlwZSgpID09ICdiYXJzJywgJ2ZhLWFyZWEtY2hhcnQnOiBzZXJpZXNUeXBlKCk9PSdhcmVhJyB9LCBhdHRyOiB7dGl0bGU6IHNlcmllc1R5cGV9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNldHVwRmllbGRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWdlYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIk1vcmUgT3B0aW9uc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiIGRhdGEtYmluZD1cImlmOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBlZGl0Rm9ybXVsYUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBlbmNpbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRWRpdCBGb3JtdWxhIEZpZWxkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1zdWItcmVwb3J0XCI+XHJcbiAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQgbWItM1wiPlxyXG4gICAgICAgIExpbmtlZCByZXBvcnRzIGFyZSBhdmFpbGFibGUgdG8gYWRkIGFzIHN1YiByZXBvcnRzLlxyXG4gICAgICAgIFNlbGVjdGluZyBzdWIgcmVwb3J0cyB3aWxsIHJlc3RyaWN0IHRoZSByZXBvcnQgdG8gPHN0cm9uZz5vbmUgcmVjb3JkIHBlciBwYWdlPC9zdHJvbmc+LlxyXG4gICAgPC9wPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGxpbmtlZFJlcG9ydEZpZWxkcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRTdWJSZXBvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zQ2FwdGlvbjogJ1NlbGVjdCBhIGxpbmtlZCByZXBvcnQuLi4nXCI+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXBcIlxyXG4gICAgICAgIGRhdGEtYmluZD1cInNvcnRhYmxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHN1YlJlcG9ydHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgaGFuZGxlOiAnLnNvcnRhYmxlJywgY3Vyc29yOiAnbW92ZScsIHBsYWNlaG9sZGVyOiAnZHJvcC1oaWdobGlnaHQnIH1cclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhcnMgc29ydGFibGUgbWUtMlwiIHN0eWxlPVwiY3Vyc29yOm1vdmU7XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogbmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVTdWJSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgIERlbGV0ZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLWh0bWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBTZWxlY3RlZEZpZWxkcywgdmFsdWU6IFNlbGVjdEZpZWxkVG9JbnNlcnQsIG9wdGlvbnNDYXB0aW9uOiAnU2VsZWN0IGEgZmllbGQuLi4nLCBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBkcm9wZG93blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZHJvcGRvd24tdG9nZ2xlXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10YWJsZVwiPjwvaT4gSW5zZXJ0IGFzIFRhYmxlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogaW5zZXJ0RmllbGRUYWJsZVRyYW5zcG9zZWRcIj5UcmFuc3Bvc2VkPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogaW5zZXJ0RmllbGRUYWJsZVN0YW5kYXJkXCI+U3RhbmRhcmQ8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRIZWFkZXJCcmVha1wiPkFkZCBIZWFkZXIgQnJlYWs8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRGb290ZXJCcmVha1wiPkFkZCBGb290ZXIgQnJlYWs8L2E+PC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC1hdXRvIG1zLTJcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGNhcmRWaWV3XCI+XHJcbiAgICAgICAgICAgIENhcmQgTGF5b3V0XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8dGV4dGFyZWEgZGF0YS1iaW5kPVwic3VtbWVybm90ZTogcmVwb3J0SHRtbFwiPjwvdGV4dGFyZWE+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLXNvcnRcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWF1dG8gY29udHJvbC1sYWJlbFwiPlNvcnQgQnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IEZpbHRlcmVkRmllbGRzLCBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJywgb3B0aW9uc1ZhbHVlOiAnZmllbGRJZCcsIHZhbHVlOiBTb3J0QnlGaWVsZCwgb3B0aW9uc0NhcHRpb246ICdTZWxlY3QgZmllbGQgdG8gc29ydC4uLicsIGFsbG93Q2xlYXI6IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGQtZmxleCBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ0ZXh0OiAhU29ydERlc2MoKSA/ICfilrIgQXNjZW5kaW5nJyA6ICdEZXNjZW5kaW5nIOKWvCcsIGNsaWNrOiBmdW5jdGlvbigpIHsgU29ydERlc2MoIVNvcnREZXNjKCkpOyByZXR1cm4gZmFsc2U7IH1cIj5cclxuICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZFNvcnRGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICBBZGQgU29ydFxyXG4gICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBTb3J0RmllbGRzXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWF1dG8gY29udHJvbC1sYWJlbFwiPiZuYnNwOyZuYnNwO1RoZW4gU29ydCBCeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogJHBhcmVudC5GaWx0ZXJlZEZpZWxkcywgb3B0aW9uc1RleHQ6ICdzZWxlY3RlZEZpZWxkTmFtZScsIG9wdGlvbnNWYWx1ZTogJ2ZpZWxkSWQnLCB2YWx1ZTogc29ydEJ5RmllbGRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZC1mbGV4IGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IHJlbW92ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIFNvcnRcclxuICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidGV4dDogIXNvcnREZXNjKCkgPyAn4payIEFzY2VuZGluZycgOiAnRGVzY2VuZGluZyDilrwnLCBjbGljazogZnVuY3Rpb24oKSB7IHNvcnREZXNjKCFzb3J0RGVzYygpKTsgcmV0dXJuIGZhbHNlOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmFkZFNvcnRGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgQWRkIFNvcnRcclxuICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1vcHRpb25zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKSE9J1Bpdm90J1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBJbmNsdWRlU3ViVG90YWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgVG90YWwgUm93XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiaGlkZGVuOiBBZ2dyZWdhdGVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2hvd1VuaXF1ZVJlY29yZHNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgb25seSBVbmlxdWUgUmVjb3Jkc1xyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKSE9J0xpc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNob3dFeHBhbmRPcHRpb25cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIERvbid0IFNob3cgRXhwYW5kIE9wdGlvblxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0NoYXJ0XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNob3dEYXRhV2l0aEdyYXBoXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBTaG93IERhdGEgYWxvbmcgd2l0aCBHcmFwaFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBEb250RXhlY3V0ZU9uUnVuXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBXYWl0IHRvIFNlbGVjdCBGaWx0ZXJzIGJlZm9yZSBSdW5uaW5nIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogbWF4UmVjb3Jkc1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE1heCBSZWNvcmRzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCIgZGF0YS1iaW5kPVwiaWY6IG1heFJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHN0eWxlPVwid2lkdGg6IDE1MHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJPbmx5IHRvcCBuLi4uXCIgZGF0YS1iaW5kPVwidmFsdWU6IE9ubHlUb3AsIHZpc2libGU6IG1heFJlY29yZHNcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhbmdlUGFnZVNpemUsIGRpc2FibGU6IHN1YlJlcG9ydHMoKS5sZW5ndGggPiAwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgUGFnZSBTaXplXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZpc2libGU6IGNoYW5nZVBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzczogeyAndGV4dC1tdXRlZCc6IHN1YlJlcG9ydHMoKS5sZW5ndGggPiAwIH1cIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3Qgc3R5bGU9XCJ3aWR0aDogMTUwcHg7XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IFsxLDEwLDMwLDUwLDEwMCwxNTAsMjAwLDUwMCwxMDAwXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IERlZmF1bHRQYWdlU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZTogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBGb3JjZSBkZWZhdWx0IHRvIDEgaWYgc3ViIHJlcG9ydHMgc2VsZWN0ZWQgLS0+XHJcbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiIGRhdGEtYmluZD1cInZpc2libGU6IHN1YlJlcG9ydHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGFnZSBzaXplIGlzIHJlc3RyaWN0ZWQgdG8gMSB3aGVuIHN1YiByZXBvcnRzIGFyZSBzZWxlY3RlZC5cclxuICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPVwiZmEgZmEtcGFpbnQtYnJ1c2hcIj48L3NwYW4+IFBpY2sgUmVwb3J0IEZvcm1hdDwvcD5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdGFibGVTdHlsZXMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uXCIgZGF0YS1iaW5kPVwidGl0bGU6ICRkYXRhLm5hbWUsIGNsaWNrOiAkcGFyZW50LnNlbGVjdFN0eWxlLCBjc3M6IHsnZHJvcGRvd24tb3B0aW9uLXNlbGVjdGVkJzogJHBhcmVudC5zZWxlY3RlZFN0eWxlKCkgPT0gJGRhdGEuY29sb3JzY2hlbWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbmktdGFibGUtcHJldmlld1wiIGRhdGEtYmluZD1cImZvcmVhY2g6IG5ldyBBcnJheSg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10YWJsZS1yb3dcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBuZXcgQXJyYXkoNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLWNlbGxcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6ICRwYXJlbnRDb250ZXh0LiRpbmRleCgpID09PSAwID8gJHBhcmVudHNbMV0uaGVhZGVyQmcgOiAoJHBhcmVudENvbnRleHQuJGluZGV4KCkgJSAyID09PSAwID8gJHBhcmVudHNbMV0uYWx0Um93QmcgOiAkcGFyZW50c1sxXS5yb3dCZyksIGNvbG9yOiAkcGFyZW50c1sxXS50ZXh0Q29sb3IgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IG5vSGVhZGVyUm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBObyBIZWFkZXIgUm93XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IG5vRGFzaGJvYXJkQm9yZGVyc1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgQm9yZGVybGVzcyBvbiBEYXNoYm9hcmRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJpZjogUmVwb3J0VHlwZSgpID09ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNob3dQcmlvckluS3BpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBTaG93IHByZXZpb3VzIGNvbXBhcmlzaW9uIGluIEtQSSBpZiBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiY3VzdG9tLWZpZWxkLWRlc2lnbmVyXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzRm9ybXVsYUZpZWxkKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgWW91IGFyZSBub3cgY3JlYXRpbmcgYSBDdXN0b21pemVkIEZpZWxkLiBQbGVhc2Ugc2VsZWN0IHRoZSBmaWVsZHMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSBjYWxjdWxhdGlvbiwgdGhlbiBjaG9vc2UgdGhlIG9wZXJhdGlvbnMgeW91IHdhbnQgdG8gcGVyZm9ybSwgYW5kIGNsaWNrIFwiU2F2ZVwiIHRvIGFkZCB5b3VyIEN1c3RvbSBmaWVsZC5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNiBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgU2V0dXAgeW91ciBGb3JtdWxhIGZvciBjYWxjdWxhdGluZyB0aGlzIEZpZWxkXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgcmlnaHQtYWxpZ25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhVHlwZSgpPT0nYnVpbGQnXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZEZvcm11bGFQYXJlbnRoZXNlc1wiPkFkZCAoICk8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgdGl0bGU9XCJBZGQgVG9kYXlcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHMoKSB8fCBmb3JtdWxhRmllbGRzKCkubGVuZ3RoID09IDAsIGNsaWNrOiBhZGRGb3JtdWxhRGF0ZVRvZGF5XCI+QWRkIFRvZGF5PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIHRpdGxlPVwiQWRkIGEgQ29uc3RhbnQgVmFsdWVcIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkRm9ybXVsYUNvbnN0YW50VmFsdWVcIj5BZGQgVmFsdWU8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNsZWFyRm9ybXVsYUZpZWxkXCI+Q2xlYXI8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLXJvd1wiIGRhdGEtYmluZD1cImlmOiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICBGb3IgRGF0ZXMgRmllbGQgY2FsY3VsYXRpb24sIHlvdSBjYW4gb25seSBzdWJzdHJhY3QgZGF0ZSBmaWVsZHMgYW5kIGRpc3BsYXkgdGhlIHJlc3VsdCBhcyBkYXlzLCBob3VycywgbWludXRlcyBvciBzZWNvbmRzLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RmllbGQgTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYUZpZWxkTGFiZWxcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkN1c3RvbSBGaWVsZCBMYWJlbFwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RGF0YSBGb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYURhdGFGb3JtYXRcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmbm90OiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5TdHJpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkludGVnZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkRlY2ltYWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkN1cnJlbmN5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZm9ybXVsYU9ubHlIYXNEYXRlRmllbGRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RGF5czwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SG91cnM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPk1pbnV0ZXM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlNlY29uZHM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhRGF0YUZvcm1hdCgpID09ICdEZWNpbWFsJyB8fCBmb3JtdWxhRGF0YUZvcm1hdCgpID09ICdDdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPlJvdW5kIHRvIERlY2ltYWwgUGxhY2VzPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRGVjaW1hbFBsYWNlc1wiIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIERlY2ltYWwgcGxhY2VzIChsZWF2ZSBibGFuayB0byBub3QgdXNlIHJvdW5kaW5nKVwiIHRpdGxlPVwiQ2hvb3NlIERlY2ltYWwgcGxhY2VzIChsZWF2ZSBibGFuayB0byBub3QgdXNlIHJvdW5kaW5nKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGFwcFNldHRpbmdzLnVzZVNxbEN1c3RvbUZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBCdWlsZGVyIFR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYVR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnVpbGRcIj5TaW1wbGUgQ2FsY3VsYXRpb248L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3FsXCI+QWR2YW5jZWQgRXhwcmVzc2lvbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogZm9ybXVsYVR5cGUoKT09J2J1aWxkJ1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RmllbGQgRm9ybXVsYTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZm9ybXVsYUZpZWxkcygpLmxlbmd0aCA9PSAwXCI+UGljayBmaWVsZHMgdG8gYnVpbGQgY2FsY3VsYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IGZvcm11bGFGaWVsZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtZS0zXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2V0dXBGb3JtdWxhLmlzUGFyZW50aGVzZXNTdGFydFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMDtcIj4oPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAhc2V0dXBGb3JtdWxhLmlzUGFyZW50aGVzZXNTdGFydCgpICYmICFzZXR1cEZvcm11bGEuaXNQYXJlbnRoZXNlc0VuZCgpXCIgY2xhc3M9XCJsaXN0LWdyb3VwIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZvcm11bGEtZmllbGQtaXRlbVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE1cHg7IHBhZGRpbmc6IDVweCAxNXB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZE5hbWUsIHZpc2libGU6ICFzZXR1cEZvcm11bGEuaXNDb25zdGFudFZhbHVlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzZXR1cEZvcm11bGEuaXNDb25zdGFudFZhbHVlXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtYmluZD1cInZhbHVlOiBzZXR1cEZvcm11bGEuY29uc3RhbnRWYWx1ZSwgdmlzaWJsZTogc2V0dXBGb3JtdWxhLmNvbnN0YW50VmFsdWUoKSE9J3xUb2RheXwnXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG1lLTJcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6IHNldHVwRm9ybXVsYS5jb25zdGFudFZhbHVlKCkgPT0gJ3xUb2RheXwnXCI+PGI+VG9kYXk8L2I+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIG1zLTJcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWUtM1wiIGRhdGEtYmluZD1cInZpc2libGU6IHNldHVwRm9ybXVsYS5pc1BhcmVudGhlc2VzRW5kXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwO1wiPik8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0zXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTVweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LnNob3dGb3JtdWxhT3BlcmF0aW9uKCRpbmRleCgpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHN0eWxlPVwibWF4LXdpZHRoOiA1MHB4O1wiIGRhdGEtYmluZD1cInZhbHVlOiBzZXR1cEZvcm11bGEuZm9ybXVsYU9wZXJhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogISRwYXJlbnQuZm9ybXVsYU9ubHlIYXNEYXRlRmllbGRzKCkgfHwgKCRwYXJlbnQuZm9ybXVsYU9ubHlIYXNEYXRlRmllbGRzKCkgJiYgJHBhcmVudC5pc0NvbnN0YW50T3BlcmF0aW9uKCRpbmRleCgpKSkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPis8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4tPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBbJ0ludGVnZXInLCdNb25leScsJ0Zsb2F0JywnRG91YmxlJywnRGVjaW1hbCcsJ0N1cnJlbmN5J10uaW5kZXhPZigkcGFyZW50LmZvcm11bGFEYXRhRm9ybWF0KCkpICE9IC0xIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4qPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPi88L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogY3VzdG9tU3FsRmllbGQsIHZpc2libGU6IGZvcm11bGFUeXBlKCk9PSdzcWwnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlNlbGVjdCBEYXRhIE9wZXJhdGlvbjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7XHJcbiAgICAgICAgICAgICAgICBkcm9wZG93blBhcmVudDogJHJvb3QuYWN0aXZlRGVzaWduKCkgPyAkKCcjY2hvb3NlLWRhdGEtZGVzaWduJykgOiAkKCcjY2hvb3NlLWRhdGEtY2FyZCcpLFxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRnVuY3Rpb24uLi4nLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogYXZhaWxhYmxlRnVuY3Rpb25zR3JvdXBlZCgpLFxyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVSZXN1bHQ6IHRlbXBsYXRlUmVzdWx0XHJcbiAgICAgICAgICAgIH0sIHZhbHVlOiBzZWxlY3RlZFNxbEZ1bmN0aW9uXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgZGF0YS1iaW5kPVwiaGlkZGVuOiBpc0NvbmRpdGlvbmFsRnVuY3Rpb24oKSB8fCBzZWxlY3RlZFNxbEZ1bmN0aW9uKCkgPT0gJ090aGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IHRoZSBEYXRhIEZpZWxkIHRvIHVzZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInNlbGVjdDI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25QYXJlbnQ6ICRyb290LmFjdGl2ZURlc2lnbigpID8gJCgnI2Nob29zZS1kYXRhLWRlc2lnbicpIDogJCgnI2Nob29zZS1kYXRhLWNhcmQnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggRmllbGQuLi4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhamF4OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICRwYXJlbnQudGV4dFF1ZXJ5LnNlYXJjaEZpZWxkcy51cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLnF1ZXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdHM6ICRwYXJlbnQudGV4dFF1ZXJ5LnNlYXJjaEZpZWxkcy5wcm9jZXNzUmVzdWx0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6ICRwYXJlbnQudGV4dFF1ZXJ5LnNlYXJjaEZpZWxkcy5oZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1JbnB1dExlbmd0aDogMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDbGVhcjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNlbGVjdDJUZXh0OiBzZWxlY3RlZEZpZWxkLHNlbGVjdDJUYWJsZUlkOnNlbGVjdGVkRmllbGRUYWJsZUlkXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogc2VsZWN0ZWRGaWVsZFwiIGNsYXNzPVwic21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZDogPHNwYW4gY2xhc3M9XCJoaWdobGlnaHRcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiAkZGF0YVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgZGF0YS1iaW5kPVwiaWY6IHJlcXVpcmVzVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImlucHV0VmFsdWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Qcm92aWRlIHRoZSByZWxldmFudCB2YWx1ZSB0byB1c2U6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJpbnB1dFZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaW5wdXRWYWx1ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWRTcWxGdW5jdGlvbigpID09ICdPdGhlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImN1c3RvbS1zcWxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DdXN0b20gU1FMIEV4cHJlc3Npb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCB5b3VyIGN1c3RvbSBTUUwgRXhwcmVzc2lvbiBiZWxvdyBieSBzZWxlY3RpbmcgZGF0YSBmaWVsZHMsIGFkZGluZyBjYWxjdWxhdGlvbnMgb3IgdXNpbmcgU1FMIGtleXdvcmRzIGFzIG5lZWRlZC4gRm9yIHN0cmluZyB2YWx1ZXMsIHJlbWVtYmVyIHRvIGVuY2xvc2UgdGhlbSBpbiBzaW5nbGUgcXVvdGVzICgnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBpZD1cImN1c3RvbS1zcWxcIiBjbGFzcz1cImhpbnQtaW5wdXRcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIGN1c3RvbSBTUUxcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0NvbmRpdGlvbmFsRnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCB5b3VyIGNvbmRpdGlvbmFsIGxvZ2ljIGJlbG93IGJ5IHNlbGVjdGluZyBkYXRhIGZpZWxkcywgYWRkaW5nIGNhbGN1bGF0aW9ucyBhbmQgZGVmaW5pbmcgY29uZGl0aW9ucyBhcyBuZWVkZWQsIGFuZCBwcm92aWRlIGNvcnJlc3BvbmRpbmcgcmVzdWx0cy4gRm9yIHN0cmluZyB2YWx1ZXMsIHJlbWVtYmVyIHRvIGVuY2xvc2UgdGhlbSBpbiBzaW5nbGUgcXVvdGVzICgnJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50LWlucHV0XCIgaWQ9XCJjb25kaXRpb24tZmllbGRcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJGaWVsZCB0byBjb21wYXJlXCIgdGl0bGU9XCJGaWVsZCB0byBjb21wYXJlXCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIiBzdHlsZT1cIndpZHRoOiAxMjBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVPcGVyYXRvcnMsIHZhbHVlOiBzZWxlY3RlZE9wZXJhdG9yXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi12YWx1ZVwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIlZhbHVlIHRvIGNvbXBhcmVcIiB0aXRsZT1cIlZhbHVlIHRvIGNvbXBhcmVcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMycHg7XCI+VEhFTjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi1yZXN1bHRcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJDb25kaXRpb24gUmVzdWx0XCIgdGl0bGU9XCJDb25kaXRpb24gUmVzdWx0XCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZENvbmRpdGlvblwiPkFkZCBDb25kaXRpb248L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBtdC0zXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogY29uZGl0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBjb25kaXRpb25EaXNwbGF5XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kYW5nZXJcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVDb25kaXRpb25cIj5SZW1vdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItM1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDVweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiIHN0eWxlPVwibWF4LWhlaWdodDogMzJweDtcIj5FTFNFPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50LWlucHV0XCIgaWQ9XCJjb25kaXRpb24tZWxzZVwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIkRlZmF1bHQgUmVzdWx0XCIgdGl0bGU9XCJEZWZhdWx0IFJlc3VsdFwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCIgdGl0bGU9XCJTYXZlIEN1c3RvbSBGb3JtdWxhIEZpZWxkXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGb3JtdWxhRmllbGQsIHZpc2libGU6IGlzRm9ybXVsYUZpZWxkXCI+U2F2ZTwvYT5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc21cIiB0aXRsZT1cIkN1c3RvbSBGaWVsZCB1c2luZyBGb3JtdWxhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNhbmNlbEZvcm11bGFGaWVsZCwgdGV4dDogaXNGb3JtdWxhRmllbGQoKT8gJ0NhbmNlbCc6ICdDdXN0b21pemUnLCBjc3M6IHsnYnRuLXByaW1hcnknOiAhaXNGb3JtdWxhRmllbGQoKSwgJ2J0bi1kYW5nZXInOiBpc0Zvcm11bGFGaWVsZH1cIj48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1kZXNpZ25lci1jb21wYWN0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGVzaWduZXItY29udGFpbmVyIGNvbXBhY3QtZGVzaWduZXJcIiBpZD1cImNob29zZS1kYXRhLWRlc2lnblwiIHN0eWxlPVwiZm9udC1zaXplOjEycHg7XCI+XHJcblxyXG4gICAgICA8IS0tIFZpc3VhbGl6YXRpb24gVG9vbGJhciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0xIG1iLTJcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cImZhIGZhLWZpbGVcIj48L2k+IFZpc3VhbGl6YXRpb248L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0SUQoKSwgY2xpY2s6IGZ1bmN0aW9uKCkge2FjdGl2ZURlc2lnbihmYWxzZSk7fVwiIHRpdGxlPVwiQ2xvc2VcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lc1wiPjwvaT4gQ2xvc2UgRGVzaWduZXJcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xXCI+XHJcbiAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItY2hvb3NlLXZpc3VhbCdcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1haW4gR3JpZCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBmbGV4LXdyYXAgZ2FwLTIgY29tcGFjdC1maWx0ZXJzIG5lZWRzLXZhbGlkYXRpb25cIj5cclxuXHJcbiAgICAgICAgPCEtLSBEYXRhIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJkYXRhUGFuZWxcIiBzdHlsZT1cIm1heC13aWR0aDogMzAwcHhcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdkYXRhUGFuZWwnKX1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnZGF0YVBhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZGF0YWJhc2VcIj48L2k+IERhdGFcclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLWNob29zZS1kYXRhJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2VsZWN0ZWQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNlbGVjdGVkUGFuZWxcIiBzdHlsZT1cIm1heC13aWR0aDogNDAwcHhcIlxyXG4gICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ3NlbGVjdGVkUGFuZWwnKX1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnc2VsZWN0ZWRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRhYmxlXCI+PC9pPiBTZWxlY3RlZCBkYXRhIGZvciB0aGUgUmVwb3J0XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkIGZsb2F0LWVuZFwiXHJcbiAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZpc2libGU6IFNlbGVjdGVkRmllbGRzKCkubGVuZ3RoLCBjbGljazpmdW5jdGlvbigpe1NlbGVjdGVkRmllbGRzKFtdKTt9XCI+Q2xlYXIgYWxsPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkZXNpZ25lci1hdXRvLXVwZGF0ZSBwLTFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMDBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc2VsZWN0ZWQtZGF0YSdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInN1YlJlcG9ydHNQYW5lbFwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ3N1YlJlcG9ydHNQYW5lbCcpfSwgdmlzaWJsZTogbGlua2VkUmVwb3J0RmllbGRzKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3N1YlJlcG9ydHNQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJvb2ttYXJrXCI+PC9pPiBTdWIgUmVwb3J0c1xyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXN1Yi1yZXBvcnQnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImh0bWxSZXBvcnRQYW5lbFwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2h0bWxSZXBvcnRQYW5lbCcpfSwgdmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nSHRtbCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdodG1sUmVwb3J0UGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L2k+IEN1c3RvbSBEZXNpZ25cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xXCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1odG1sJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQ3VzdG9tIEZpZWxkIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJjdXN0b21GaWVsZFBhbmVsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNGb3JtdWxhRmllbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLW1hZ2ljXCI+PC9pPiBDdXN0b20gRmllbGRcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGN1c3RvbS1maWVsZC1kZXNpZ25cIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy14OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnY3VzdG9tLWZpZWxkLWRlc2lnbmVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBGaWVsZCBPcHRpb25zIFBhbmVsIC0tPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJmaWVsZE9wdGlvbnNQYW5lbFwiIGNsYXNzPVwiY2FyZCBwLTIgbXQtMiBjb2xsYXBzZVwiPlxyXG4gICAgICAgIDwhLS0gZHluYW1pYyBmaWVsZCBzZXR0aW5ncyBsb2FkIGhlcmUgLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBGaWx0ZXJzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJmaWx0ZXJzUGFuZWxcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdmaWx0ZXJzUGFuZWwnKX0sIGhpZGRlbjogaXNGb3JtdWxhRmllbGRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnZmlsdGVyc1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCI+PC9pPiBGaWx0ZXJzXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGRlc2lnbmVyLWF1dG8tdXBkYXRlXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjMwMHB4OyBvdmVyZmxvdy15OmF1dG87XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6dXNlU3RvcmVkUHJvY1wiPjxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6e25hbWU6J2ZpbHRlci1wYXJhbWV0ZXJzJ31cIj48L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDp1c2VTdG9yZWRQcm9jXCI+PGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTp7bmFtZTonZmlsdGVyLWdyb3VwJ31cIj48L2Rpdj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNvcnQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNvcnRQYW5lbFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ3NvcnRQYW5lbCcpfSwgaGlkZGVuOiB1c2VTdG9yZWRQcm9jKCkgfHwgaXNGb3JtdWxhRmllbGQoKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzb3J0UGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0XCI+PC9pPiBTb3J0XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGRlc2lnbmVyLWF1dG8tdXBkYXRlIHJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc29ydCdcIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNldHRpbmdzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJzZXR0aW5nc1BhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc2V0dGluZ3NQYW5lbCcpfSwgaGlkZGVuOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzZXR0aW5nc1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZ2VhclwiPjwvaT5PcHRpb25zXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtZm9ybS1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvaT4gUmVwb3J0IE5hbWVcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJSZXBvcnQgTmFtZVwiIGRhdGEtYmluZD1cInZhbHVlOiBSZXBvcnROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+IFJlcG9ydCBEZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiByb3dzPVwiM1wiIHBsYWNlaG9sZGVyPVwiQWRkaXRpb25hbCBkZXRhaWxzIChvcHRpb25hbClcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUmVwb3J0RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBDYW5TYXZlUmVwb3J0cygpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICBTYXZlIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgaDZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZvbGRlci1vcGVuXCI+PC9pPiBDaG9vc2UgRm9sZGVyXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IEZvbGRlcnMsIG9wdGlvbnNUZXh0OiAnRm9sZGVyTmFtZScsIG9wdGlvbnNWYWx1ZTogJ0lkJywgdmFsdWU6IEZvbGRlcklEXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxociAvPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItb3B0aW9ucydcIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNjaGVkdWxlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJzY2hlZHVsZVBhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc2NoZWR1bGVQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzY2hlZHVsZVBhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaG91cmdsYXNzXCI+PC9pPiBTY2hlZHVsZVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMSBkZXNpZ25lci1hdXRvLXVwZGF0ZSByb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtc2NoZWR1bGUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWNjZXNzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZsZXgtZmlsbCBleHBhbmRhYmxlLXBhbmVsXCIgaWQ9XCJhY2Nlc3NQYW5lbFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2FjY2Vzc1BhbmVsJyl9LCB2aXNpYmxlOiBhZG1pbk1vZGUoKSAmJiAhaXNGb3JtdWxhRmllbGQoKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdhY2Nlc3NQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWtleVwiPjwvaT5TZWN1cml0eVxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnbWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZScsIGRhdGE6IG1hbmFnZUFjY2Vzc31cIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aHIgLz5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1kZXNpZ25lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctc2Nyb2xsYWJsZVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDB2aDtcIiBpZD1cInJlcG9ydC1kZXNpZ25lci1tb2RhbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJteU1vZGFsTGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT1cIk5lZWQgaGVscCBzZXR0aW5nIHVwIGEgcmVwb3J0P1wiIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL2RvdG5ldHJlcG9ydC5jb20vYmxvZ3MvZG9jcy9kZXNpZ25pbmctcmVwb3J0c1wiPjxzcGFuIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlXCI+PC9zcGFuPjwvYT4gRGVzaWduIHlvdXIgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBvbk1vZGFsQ2xvc2VDbGlja2VkXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBuZWVkcy12YWxpZGF0aW9uXCIgc3R5bGU9XCJvdmVyZmxvdy15OiBhdXRvOyBmbGV4LWdyb3c6IDE7XCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCIgaWQ9XCJjaG9vc2UtZGF0YS1jYXJkXCIgIHN0eWxlPVwibWluLWhlaWdodDogY2FsYygxMDB2aCAtIDIwMHB4KTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGVcIj48L2k+IFJlcG9ydCBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIlJlcG9ydCBOYW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6IFJlcG9ydE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1kYXRhYmFzZVwiPjwvc3Bhbj4mbmJzcDtDaG9vc2UgRGF0YSBmb3IgUmVwb3J0PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1jaG9vc2UtZGF0YSdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlXCI+PC9pPiBSZXBvcnQgRGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcm93cz1cIjNcIiBwbGFjZWhvbGRlcj1cIkFkZGl0aW9uYWwgZGV0YWlscyAob3B0aW9uYWwpXCIgZGF0YS1iaW5kPVwidmFsdWU6IFJlcG9ydERlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogQ2FuU2F2ZVJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTYXZlUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZvbGRlci1vcGVuXCI+PC9pPiBDaG9vc2UgRm9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IEZvbGRlcnMsIG9wdGlvbnNUZXh0OiAnRm9sZGVyTmFtZScsIG9wdGlvbnNWYWx1ZTogJ0lkJywgdmFsdWU6IEZvbGRlcklEXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvc3Bhbj4mbmJzcDtDaG9vc2UgVmlzdWFsaXphdGlvbjwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItY2hvb3NlLXZpc3VhbCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGlzRnVuY3Rpb25GaWVsZFwiIGNsYXNzPVwiY3VzdG9tLWZpZWxkLWRlc2lnblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIiB0aXRsZT1cIlNhdmUgQ3VzdG9tIEZ1bmN0aW9uIEZpZWxkXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGdW5jdGlvbkZpZWxkLCB2aXNpYmxlOiBpc0Z1bmN0aW9uRmllbGRcIj5TYXZlPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHRpdGxlPVwiQ3VzdG9tIEZpZWxkIHVzaW5nIEZ1bmN0aW9uXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7aXNGdW5jdGlvbkZpZWxkKCFpc0Z1bmN0aW9uRmllbGQoKSl9LCB0ZXh0OiBpc0Z1bmN0aW9uRmllbGQoKT8gJ0NhbmNlbCc6ICdGdW5jdGlvbicsIGNzczogeydidG4tcHJpbWFyeSc6ICFpc0Z1bmN0aW9uRmllbGQoKSwgJ2J0bi1kYW5nZXInOiBpc0Z1bmN0aW9uRmllbGR9XCI+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcGFkZGVkLWRpdlwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzRnVuY3Rpb25GaWVsZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgYXJlIG5vdyBjcmVhdGluZyBhIEN1c3RvbWl6ZWQgRmllbGQgdXNpbmcgRnVuY3Rpb25zIGF2YWlsYWJsZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RmllbGQgTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFGaWVsZExhYmVsXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJDdXN0b20gRmllbGQgTGFiZWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+RGF0YSBGb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRGF0YUZvcm1hdFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5TdHJpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SW50ZWdlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5EZWNpbWFsPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkN1cnJlbmN5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkRhdGU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJEYXRlVGltZVwiPkRhdGUgYW5kIFRpbWU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0RlY2ltYWwnIHx8IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5Sb3VuZCB0byBEZWNpbWFsIFBsYWNlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFEZWNpbWFsUGxhY2VzXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgdGl0bGU9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHlvdXIgRnVuY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPVwiZnVuY3Rpb24tY29kZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBsYXN0UGlja2VkRmllbGQoKSAmJiBsYXN0UGlja2VkRmllbGQoKS5maWVsZFR5cGUgPT0gJ0pzb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDY+U2VsZWN0IERhdGEgRmllbGRzIGZyb20gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogbGFzdFBpY2tlZEZpZWxkKCkuZmllbGROYW1lXCI+PC9zcGFuPjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IGpzb25GaWVsZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgY29sLXNtLTQgY29sLXhzLTYgbGlzdC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkSW5BcnJheToge2FycmF5OiAkcGFyZW50LlNlbGVjdGVkRmllbGRzLCB2YWx1ZTogJGRhdGF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGpzb25Db2x1bW5OYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY3VzdG9tRmllbGRTZWN0aW9uXCIgZGF0YS1iaW5kPVwiaWY6IGlzRm9ybXVsYUZpZWxkXCIgY2xhc3M9XCJjdXN0b20tZmllbGQtZGVzaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CdWlsZCBDdXN0b20gRmllbGQ8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCIgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdjdXN0b20tZmllbGQtZGVzaWduZXInXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNvbC04IHB1bGwtbGVmdFwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtdGFibGVcIj48L3NwYW4+Jm5ic3A7U2VsZWN0ZWQgZGF0YSBmb3IgdGhlIFJlcG9ydDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IHB1bGwtcmlnaHQgcmlnaHQtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTZWxlY3RlZEZpZWxkcygpLmxlbmd0aCwgY2xpY2s6IGZ1bmN0aW9uKCkge1NlbGVjdGVkRmllbGRzKFtdKTt9XCI+Q2xlYXIgYWxsPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXNlbGVjdGVkLWRhdGEnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBsaW5rZWRSZXBvcnRGaWVsZHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYmctbGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYm9va21hcmtcIj48L2k+IEluY2x1ZGUgU3ViIFJlcG9ydHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXN1Yi1yZXBvcnQnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nSHRtbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L2k+IERlc2lnbiB5b3VyIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItaHRtbCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBGaWx0ZXJzPC9oNT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEwcHg7IG92ZXJmbG93LXg6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogdXNlU3RvcmVkUHJvY1wiIGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLXBhcmFtZXRlcnMnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IHVzZVN0b3JlZFByb2NcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2ZpbHRlci1ncm91cCd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IEVkaXRGaWx0ZXJzT25SZXBvcnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgc2V0dGluZyB1cCBhbmQgc2F2aW5nIGZpbHRlcnMgb24gUmVwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImhpZGRlbjogdXNlU3RvcmVkUHJvY1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT48c3BhbiBjbGFzcz1cImZhIGZhLXNvcnRcIj48L3NwYW4+Jm5ic3A7Q2hvb3NlIFNvcnRpbmc8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLXNvcnQnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTYXZlUmVwb3J0XCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtaG91cmdsYXNzXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBTY2hlZHVsZTwvaDU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTBweFwiIGRhdGEtYmluZD1cImlmOiBTYXZlUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtc2NoZWR1bGUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogdXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLW9wdGlvbnMnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IGFkbWluTW9kZVwiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnbWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZScsIGRhdGE6IG1hbmFnZUFjY2Vzc31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlLCBjbGljazogUnVuUmVwb3J0U3FsUHJldmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvaT4gUHJldmlldyBSZXBvcnQgQ29kZVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWJpbmQ9XCJjbGljazogY2FuY2VsQ3JlYXRlUmVwb3J0XCI+Q2FuY2VsIGVkaXRpbmcgUmVwb3J0PC9hPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTYXZlUmVwb3J0KCkgJiYgQ2FuU2F2ZVJlcG9ydHMoKSwgY2xpY2s6IFNhdmVXaXRob3V0UnVuXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPlNhdmUgUmVwb3J0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYmluZD1cInRleHQ6IFNhdmVSZXBvcnQoKSAmJiBDYW5TYXZlUmVwb3J0cygpPyAnU2F2ZSAmIFJ1biBSZXBvcnQnOiAnUnVuIFJlcG9ydCcsIGNsaWNrOiBSdW5SZXBvcnRcIj5SdW4gUmVwb3J0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiY2hhcnQtc2V0dGluZ3NcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjaGFydC1jb250YWluZXIgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTIgY2hhcnQtc2V0dGluZ3MtYnRuXCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVDaGFydFNldHRpbmdzXCIgdGl0bGU9XCJSZXBvcnQgc2V0dGluZ3NcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb2dcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC1zZXR0aW5ncy1wYW5lbCBib3JkZXIgcC0yIHNoYWRvdy1zbSBiZy1saWdodFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dTZXR0aW5nc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tY2xvc2VcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlQ2hhcnRTZXR0aW5nc1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItMFwiPlJlcG9ydCBTZXR0aW5nczwvaDY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG5hdi1zbSBtYi0yIHNtYWxsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGhyZWY6ICcjY2hhcnRUYWItJyArIFJlcG9ydElEKCkgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRcclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBocmVmOiAnI3RhYmxlVGFiLScgKyBSZXBvcnRJRCgpIH0sIGNzczogeyBhY3RpdmU6ICEoUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50IHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICdjaGFydFRhYi0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHsgJ3Nob3cgYWN0aXZlJzogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkJhciBDaGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczogeyAnYWN0aXZlJzogUmVwb3J0VHlwZSgpID09PSAnQmFyJyB9LCBjbGljazogZnVuY3Rpb24oKSB7IFJlcG9ydFR5cGUoJ0JhcicpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1iYXItY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiUGllIENoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIH0sIGNsaWNrOiBmdW5jdGlvbigpIHsgUmVwb3J0VHlwZSgnUGllJyk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBpZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgdGl0bGU9XCJMaW5lIENoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdMaW5lJyB9LCBjbGljazogZnVuY3Rpb24oKSB7IFJlcG9ydFR5cGUoJ0xpbmUnKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGluZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0JhcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGJhckNoYXJ0SG9yaXpvbnRhbFwiIC8+IEhvcml6b250YWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGJhckNoYXJ0U3RhY2tlZFwiIC8+IFN0YWNrZWQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nUGllJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogcGllQ2hhcnREb251dFwiIC8+IERvbnV0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0xpbmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBsaW5lQ2hhcnRBcmVhXCIgLz4gQXJlYTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJhY2tncm91bmQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS5iYWNrZ3JvdW5kQ29sb3IsIGF0dHI6IHsgcGxhY2Vob2xkZXI6ICdTZWxlY3QnIH0sIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rm9udCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmZvbnRDb2xvciwgYXR0cjogeyBwbGFjZWhvbGRlcjogJ1NlbGVjdCcgfSwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5TZXJpZXMgQ29sb3JzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXBcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBjaGFydE9wdGlvbnMoKS5zZXJpZXNDb2xvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1ib3ggbWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiAkZGF0YSwgZXZlbnQ6IHsgaW5wdXQ6IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7ICRwYXJlbnQudXBkYXRlU2VyaWVzQ29sb3IoJGluZGV4KCksIGV2ZW50LnRhcmdldC52YWx1ZSk7IH0gfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kYW5nZXIgcmVtb3ZlLWNvbG9yXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQucmVtb3ZlU2VyaWVzQ29sb3JcIj4mdGltZXM7PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb2xvci1ib3ggYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFkZFNlcmllc0NvbG9yXCIgdGl0bGU9XCJBZGQgU2VyaWVzIENvbG9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAtN3B4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5MZWdlbmQgUG9zaXRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmxlZ2VuZFBvc2l0aW9uLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmlnaHRcIj5SaWdodDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ0b3BcIj5Ub3A8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYm90dG9tXCI+Qm90dG9tPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rm9udCBTaXplPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIGZvbnQtc2l6ZS1pbnB1dFwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS5mb250U2l6ZSwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nUGllJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd1hBeGlzTGFiZWwsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlgtQXhpcyBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd1lBeGlzTGFiZWwsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlktQXhpcyBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpICE9PSAnUGllJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGNoYXJ0T3B0aW9ucygpLnNob3dHcmlkbGluZXMsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPkdyaWRsaW5lczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd1NtYWxsVmFsdWVzT25MYWJlbCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U2hvdyBTbWFsbCBWYWx1ZXMgT24gTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgc21hbGwgbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlktQXhpcyBGb3JtYXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgcGxhY2Vob2xkZXI9XCIjLCMjMC4wMFwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS55QXhpc0Zvcm1hdCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHNtYWxsIG1iLTEgZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5ZLUF4aXMgTWluPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS55TWluLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5ZLUF4aXMgTWF4PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBjaGFydE9wdGlvbnMoKS55TWF4LCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIGZhZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGFibGVUYWItJyArIFJlcG9ydElEKCkgfSwgY3NzOiB7ICdzaG93IGFjdGl2ZSc6ICEoUmVwb3J0VHlwZSgpID09PSAnQmFyJyB8fCBSZXBvcnRUeXBlKCkgPT09ICdQaWUnIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+SGVhZGVyIEJhY2sgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGJsLWNvbG9yLXBpY2tlci0nICsgUmVwb3J0SUQoKX0gLCB2YWx1ZTogdGFibGVTZXR0aW5ncygpLmhlYWRlckJhY2tDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5IZWFkZXIgRm9udCBDb2xvcjwvbGFiZWw+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YmwtY29sb3ItcGlja2VyLScgKyBSZXBvcnRJRCgpfSAsdmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5oZWFkZXJGb250Q29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Um93IEJhY2sgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGJsLWNvbG9yLXBpY2tlci0nICsgUmVwb3J0SUQoKX0gLHZhbHVlOiB0YWJsZVNldHRpbmdzKCkucm93QmFja0NvbG9yLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZVRhYmxlIH1cIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPlJvdyBGb250IENvbG9yPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogJ3RibC1jb2xvci1waWNrZXItJyArIFJlcG9ydElEKCl9ICx2YWx1ZTogdGFibGVTZXR0aW5ncygpLnJvd0ZvbnRDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QWx0IFJvdyBCYWNrIENvbG9yPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5hbHRSb3dCYWNrQ29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QWx0IFJvdyBGb250IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5hbHRSb3dGb250Q29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItMlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJvcmRlcnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGQtZmxleCBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxleC1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHRhYmxlU2V0dGluZ3MoKS5ib3JkZXIoJ25vbmUnKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ25vbmUnIH1cIj5Ob25lPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyB0YWJsZVNldHRpbmdzKCkuYm9yZGVyKCdhbGwnKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ2FsbCcgfVwiPkFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdGFibGVTZXR0aW5ncygpLmJvcmRlcignb3V0ZXInKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ291dGVyJyB9XCI+T3V0c2lkZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdGFibGVTZXR0aW5ncygpLmJvcmRlcignaW5uZXInKTsgdXBkYXRlVGFibGUoKTsgfSwgY3NzOiB7IGFjdGl2ZTogdGFibGVTZXR0aW5ncygpLmJvcmRlciA9PT0gJ2lubmVyJyB9XCI+SW5zaWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBjb2wtNlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Cb3JkZXIgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyQ29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02IGQtZmxleCBhbGlnbi1pdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBzbWFsbCBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogY2xlYXJUYWJsZVNldHRpbmdzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZHJpbGxkb3duTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogQ2hhcnREcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RHJpbGxkb3duIERhdGE8L2g0PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgcHVsbC1yaWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBEcmlsbERvd25EYXRhIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IG1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkXCIgZGF0YS1iaW5kPVwid2l0aDogRHJpbGxEb3duRGF0YSwgYXR0cjoge2NsYXNzOiAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWQgJyArICRwYXJlbnQuc2VsZWN0ZWRTdHlsZSgpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQgc3R5bGU9XCJwb3NpdGlvbjogc3RpY2t5OyB0b3A6IC0xcHg7IHotaW5kZXg6IDI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJuby1oaWdobGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IENvbHVtbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6IGZpZWxkSWQgfSwgY3NzOiB7J3JpZ2h0LWFsaWduJzogSXNOdW1lcmljfSwgc3R5bGU6IHsnd2lkdGgnOiBmaWVsZFdpZHRoLCAnYmFja2dyb3VuZC1jb2xvcic6IGhlYWRlckJhY2tDb2xvciB9LCBoaWRkZW46IG91dGVyR3JvdXBcIiBzdHlsZT1cImJvcmRlci1yaWdodDogMXB4IHNvbGlkO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZExhYmVsMigpID8gZmllbGRMYWJlbDIoKSA6IChmaWVsZExhYmVsKCkgPyBmaWVsZExhYmVsKCkgOiBmaWVsZE5hbWUpLCBzdHlsZTogeydjb2xvcic6IGhlYWRlckZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogaGVhZGVyRm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSb3dzICYmIFJvd3MubGVuZ3RoIDwgMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJhdHRyOntjb2xzcGFuOiBDb2x1bW5zLmxlbmd0aH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVjb3JkcyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBSb3dzICAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IEl0ZW1zIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJoaWRkZW46IG91dGVyR3JvdXAsIHN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiBiYWNrQ29sb3IsICdjb2xvcic6IGZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogZm9udEJvbGQoKSA/ICdib2xkJyA6ICdub3JtYWwnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGggfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogTGlua1RvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBkYXRhLWJpbmQ9XCJhdHRyOiB7aHJlZjogTGlua1RvfVwiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogTGlua1RvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiBmb3JtYXR0ZWRWYWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtY2VudGVyZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZSBzbWFsbCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICdUb3RhbCBSZWNvcmRzOiAnICsgdG90YWxSZWNvcmRzKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi14c1wiIHRpdGxlPVwiRG93bmxvYWQgRXhjZWxcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5leHBvcnRFeGNlbFwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxEcmlsbERvd25Nb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvc3Bhbj4gVmlldyBDb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBwYWdlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInNxbE1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+UmVwb3J0IENvZGU8L2g0PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oZGF0YSwgZXZlbnQpIHsgY29weVNxbFRvQ2xpcGJvYXJkKGV2ZW50LnRhcmdldCk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsaXBib2FyZFwiPjwvaT4mbmJzcDtDb3B5XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlIHB1bGwtcmlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJyZXBvcnRTcWxDb2RlXCIgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvOyBtYXgtaGVpZ2h0OiA1MDBweDsgb3ZlcmZsb3cteTogc2Nyb2xsOyBib3JkZXI6IDFweCBzb2xpZDsgcGFkZGluZzogMTBweDtcIiBjbGFzcz1cImJnLWRhcmsgdGV4dC1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwcmU+PGNvZGUgZGF0YS1iaW5kPVwiaHRtbDogUmVwb3J0U3FsXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+PC9jb2RlPjwvcHJlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJzcWxEcmlsbERvd25Nb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOkNoYXJ0RHJpbGxEb3duRGF0YVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RHJpbGwgRG93biBSZXBvcnQgQ29kZTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbihkYXRhLCBldmVudCkgeyBjb3B5U3FsVG9DbGlwYm9hcmQoZXZlbnQudGFyZ2V0KTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2xpcGJvYXJkXCI+PC9pPiZuYnNwO0NvcHlcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgcHVsbC1yaWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGRhdGEtYmluZD1cIndpdGg6RHJpbGxEb3duRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlcG9ydFNxbENvZGVcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IG1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBzY3JvbGw7IGJvcmRlcjogMXB4IHNvbGlkOyBwYWRkaW5nOiAxMHB4O1wiIGNsYXNzPVwiYmctZGFyayB0ZXh0LWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZSBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnRTcWxcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj48L2NvZGU+PC9wcmU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibm9hY2NvdW50TW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QWNjb3VudCBub3QgU2V0dXA8L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+ZG90bmV0IFJlcG9ydCBBY2NvdW50IENvbmZpZ3VyYXRpb24gbWlzc2luZyE8L3A+XHJcbiAgICAgICAgICAgICAgICA8cD5Zb3UgZG8gbm90IGhhdmUgdGhlIG5lY2Nlc3NhcnkgaW5pdGlhbCBjb25maWd1cmF0aW9uIGNvbXBsZXRlZCB0byB1c2UgZG90bmV0IFJlcG9ydC48L3A+XHJcbiAgICAgICAgICAgICAgICA8cD5QbGVhc2UgdmlldyB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZG90bmV0cmVwb3J0LmNvbS9ibG9ncy9nZXR0aW5nLXN0YXJ0ZWQtd2l0aC1kb3RuZXQtcmVwb3J0L1wiIHRhcmdldD1cIl9ibGFua1wiPkdldHRpbmcgU3RhcnRlZCBHdWlkZTwvYT4gdG8gY29ycmVjdGx5IGNvbmZpZ3VyZSBkb3RuZXQgUmVwb3J0LjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJwZGYtb3B0aW9ucy1zY2hlZHVsZS10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFBkZlBhZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInBkZk9wdGlvbnNTY2hlZHVsZU1vZGFsTGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtcGRmLW8gbWUtMlwiPjwvaT4gU2V0IFBERiBQYWdlIFNpemVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFBERiB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIFNhdmVcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJ3b3JkLW9wdGlvbnMtc2NoZWR1bGUtdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBXb3JkUGFnZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicGRmT3B0aW9uc1NjaGVkdWxlTW9kYWxMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtbyBtZS0yXCI+PC9pPiBTZXQgV09SRCBQYWdlIFNpemVcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFdPUkQgd2lsbCBiZSBleHBvcnRlZCB1c2luZyB0aGUgc2VsZWN0ZWQgcGFnZSBzaXplLiBFbnN1cmUgeW91ciBjb250ZW50IGZpdHMgd2VsbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNvbnRlbnQgd2lkdGggZXhjZWVkcyB0aGUgc2VsZWN0ZWQgc2l6ZSwgaXQgd2lsbCBkZWZhdWx0IHRvIExldHRlci5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICBTYXZlXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwid29yZC1vcHRpb25zLXRlbXBsYXRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFdvcmRQYWdlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJ3b3JkT3B0aW9uc01vZGFsTGFiZWxcIj48aSBjbGFzcz1cImZhIGZhLWZpbGUtcGRmLW8gbWUtMlwiPjwvaT4gRXhwb3J0IHRvIFdPUkQ8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcm93IGctMFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBMZWZ0IFNpZGU6IFBhZ2UgUHJldmlldyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgU2lkZTogRm9ybSBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFdvcmQgd2lsbCBiZSBleHBvcnRlZCB1c2luZyB0aGUgc2VsZWN0ZWQgcGFnZSBzaXplLiBFbnN1cmUgeW91ciBjb250ZW50IGZpdHMgd2VsbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNvbnRlbnQgd2lkdGggZXhjZWVkcyB0aGUgc2VsZWN0ZWQgc2l6ZSwgaXQgd2lsbCBkZWZhdWx0IHRvIExldHRlci5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogZG93bmxvYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRvd25sb2FkIG1lLTFcIj48L2k+IERvd25sb2FkIFdPUkRcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJwZGYtb3B0aW9ucy10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFBkZlBhZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInBkZk9wdGlvbnNNb2RhbExhYmVsXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLXBkZi1vIG1lLTJcIj48L2k+IEV4cG9ydCB0byBQREY8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgcm93IGctMFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBMZWZ0IFNpZGU6IFBhZ2UgUHJldmlldyBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBhZ2VQcmV2aWV3Qm94XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogc2VsZWN0ZWRXaWR0aCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzZWxlY3RlZEhlaWdodCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBzZWxlY3RlZEJhY2tncm91bmRTdHlsZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjNzIGVhc2UnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hhZG93IHJvdW5kZWQgbXgtYXV0byBtYi0yIGJvcmRlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSB0ZXh0LW11dGVkIHNtYWxsXCI+UHJldmlldzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRQYWdlTGFiZWxcIiBjbGFzcz1cImZ3LWJvbGRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VEaW1lbnNpb25cIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgU2lkZTogRm9ybSBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBhZ2VTaXplU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIFNpemU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlU2l6ZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogYXZhaWxhYmxlUGFnZVNpemVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICdsYWJlbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRQYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCIgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5QYWdlIE9yaWVudGF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwicGFnZU9yaWVudGF0aW9uU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlT3JpZW50YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VPcmllbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBwLTIgc21hbGwgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIFBERiB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgbWUtMVwiPjwvaT4gRG93bmxvYWQgUERGXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcbmApO1xyXG4gICAgdGhpcy5jZHJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgYmluZFdpbmRvd1Jlc2l6ZSh2bTogYW55KTogdm9pZCB7XHJcbiAgICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodm0ucmVwb3J0TW9kZSA9PSBcImV4ZWN1dGVcIikge1xyXG4gICAgICAgICAgICB2bS5EcmF3Q2hhcnQoKVxyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgfVxyXG4iLCI8ZGl2IGlkPVwiZG90LW5ldC1yZXBvcnRcIiBjbGFzcz1cImJvZHktY29udGVudFwiPlxyXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2FkbWluLW1vZGUtdGVtcGxhdGUnfSwgdmlzaWJsZTogYWxsb3dBZG1pblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cclxuXHJcbiAgICA8IS0tXHJcbiAgICAgICAgVGhlIG1hcmt1cCBjb2RlIGJlbG93IGlzIHJlbGF0ZWQgdG8gcHJlc2VudGF0aW9uLiBZb3UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UgaXQsIHVubGVzcyB5b3VcclxuICAgICAgICBpbnRlbnRpb25hbGx5IHdhbnQgdG8gY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgUmVwb3J0IEJ1aWxkZXIncyBiZWhhdmlvciBpbiB5b3VyIEFwcGxpY2F0aW9uLlxyXG4gICAgICAgIEl0J3MgUmVjb21tZW5kZWQgeW91IHVzZSBpdCBhcyBpcy4gWW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGFuZCBtYWludGFpbmluZyBhbnkgY2hhbmdlcy5cclxuICAgIC0tPlxyXG4gICAgPCEtLSBGb2xkZXJzL1JlcG9ydCBMaXN0IC0tPlxyXG4gICAgPGRpdiBpZD1cInJlcG9ydC1zdGFydFwiIGRhdGEtYmluZD1cImlmOiBSZXBvcnRNb2RlKCkgPT0gJ3N0YXJ0JyB8fCBSZXBvcnRNb2RlKCkgPT0gJ2dlbmVyYXRlJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGZvbGRlci1wYW5lbFwiIGRhdGEtYmluZD1cInZpc2libGU6IHRydWVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdmJhciBuYXZiYXItZXhwYW5kLWxnIG5hdmJhci1saWdodCBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2YmFyLWJyYW5kXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7U2VsZWN0ZWRGb2xkZXIobnVsbCk7IGRlc2lnbmluZ0hlYWRlcihmYWxzZSk7IHNlYXJjaFJlcG9ydHMoJycpOyAkKCcjc2VhcmNoLXJlcG9ydCcpLnZhbChbXSkudHJpZ2dlcignY2hhbmdlJyk7IH1cIj5NYW5hZ2UgUmVwb3J0czwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI25hdmJhclN1cHBvcnRlZENvbnRlbnRcIiBhcmlhLWNvbnRyb2xzPVwibmF2YmFyU3VwcG9ydGVkQ29udGVudFwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJUb2dnbGUgbmF2aWdhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2VcIiBpZD1cIm5hdmJhclN1cHBvcnRlZENvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2YmFyLW5hdiBtci1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBkcm9wZG93blwiIGRhdGEtYmluZD1cInZpc2libGU6IChDYW5TYXZlUmVwb3J0cygpICYmIGFwcFNldHRpbmdzLnVzZVByb21wdEJ1aWxkZXIoKSkgfHwgYWRtaW5Nb2RlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwibmF2LWxpbmsgZHJvcGRvd24tdG9nZ2xlXCIgcm9sZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBsdXNcIj48L3NwYW4+IE5ldyBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogY3JlYXRlTmV3UmVwb3J0XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI21vZGFsLXJlcG9ydGJ1aWxkZXJcIj48aSBjbGFzcz1cImZhIGZhLXNsaWRlcnNcIj48L2k+IFVzZSBTdGFuZGFyZCBEZXNpZ25lcjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogY3JlYXRlTmV3UmVwb3J0QWlcIj48aSBjbGFzcz1cImZhIGZhLWJvbHRcIj48L2k+IFVzZSBTbWFydGVyIERlc2lnbmVyPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGFjdGl2ZVwiIGRhdGEtYmluZD1cInZpc2libGU6IChTZWxlY3RlZEZvbGRlcigpID8gU2VsZWN0ZWRGb2xkZXIoKS5jYW5FZGl0IDogKENhblNhdmVSZXBvcnRzKCkgfHwgYWRtaW5Nb2RlKCkpKSAmJiAhYXBwU2V0dGluZ3MudXNlUHJvbXB0QnVpbGRlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cIm5hdi1saW5rXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNyZWF0ZU5ld1JlcG9ydFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvc3Bhbj4gTmV3IFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIGRhdGEtYmluZD1cInZpc2libGU6IENhbk1hbmFnZUZvbGRlcnMoKSB8fCBhZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJuYXYtbGlua1wiIGRhdGEtYmluZD1cImNsaWNrOiBNYW5hZ2VGb2xkZXIubmV3Rm9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9cIj48L3NwYW4+IEFkZCBGb2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAoQ2FuTWFuYWdlRm9sZGVycygpIHx8IGFkbWluTW9kZSgpKSAmJiBTZWxlY3RlZEZvbGRlcigpIT1udWxsICYmIChTZWxlY3RlZEZvbGRlcigpLmNhbkVkaXQgfHwgU2VsZWN0ZWRGb2xkZXIoKS5jYW5EZWxldGUgfHwgYWRtaW5Nb2RlKCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cIm5hdi1saW5rIGRyb3Bkb3duLXRvZ2dsZVwiIHJvbGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1mb2xkZXJcIj48L3NwYW4+IEZvbGRlciBPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IE1hbmFnZUZvbGRlci5lZGl0Rm9sZGVyLCB2aXNpYmxlOiBTZWxlY3RlZEZvbGRlcigpICYmIChTZWxlY3RlZEZvbGRlcigpLmNhbkVkaXQgfHwgYWRtaW5Nb2RlKCkpXCI+RWRpdCBTZWxlY3RlZCBGb2xkZXI8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IE1hbmFnZUZvbGRlci5kZWxldGVGb2xkZXIsIHZpc2libGU6IFNlbGVjdGVkRm9sZGVyKCkgJiYgKFNlbGVjdGVkRm9sZGVyKCkuY2FuRGVsZXRlIHx8IGFkbWluTW9kZSgpKVwiPkRlbGV0ZSBTZWxlY3RlZCBGb2xkZXI8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gYWN0aXZlXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlKCkgJiYgU2VsZWN0ZWRGb2xkZXIoKSA9PW51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwibmF2LWxpbmtcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgaW5pdEhlYWRlckRlc2lnbmVyKGZhbHNlKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LXVwXCI+PC9zcGFuPiBSZXBvcnQgSGVhZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGRyb3Bkb3duXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYXBwU2V0dGluZ3Muc2hvd0ltcG9ydEV4cG9ydCgpIHx8IGFkbWluTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cIm5hdi1saW5rIGRyb3Bkb3duLXRvZ2dsZVwiIHJvbGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1leGNoYW5nZVwiPjwvc3Bhbj4gSW1wb3J0IC8gRXhwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNlbGVjdE1vZGUoIXNlbGVjdE1vZGUoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImNzczogc2VsZWN0TW9kZSgpID8gJ2ZhIGZhLWNoZWNrLXNxdWFyZSB0ZXh0LXByaW1hcnknIDogJ2ZhIGZhLXNxdWFyZS1vJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdE1vZGUoKSA/ICdDYW5jZWwgU2VsZWN0IE1vZGUnIDogJ1NlbGVjdCBNb2RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiN1cGxvYWRGaWxlTW9kYWxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhc2VsZWN0TW9kZSgpXCIgdGl0bGU9XCJJbXBvcnQgUmVwb3J0IGZyb20gSlNPTiBmaWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXVwbG9hZFwiPjwvc3Bhbj4gSW1wb3J0IFJlcG9ydHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInZpc2libGU6IHNlbGVjdE1vZGUsIGNsaWNrOiBleHBvcnRTZWxlY3RlZFJlcG9ydEpzb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L3NwYW4+IEV4cG9ydCBTZWxlY3RlZCBSZXBvcnRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZSBteS0yIG15LWxnLTAgbXMtYXV0byB3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBpZD1cInNlYXJjaC1pbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiIGRhdGEtcGxhY2Vob2xkZXI9XCJTZWFyY2ggUmVwb3J0IGJ5IE5hbWUsIERlc2NyaXB0aW9uIG9yIERhdGEgRmllbGQuLi5cIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwiY2xpY2s6IHNlYXJjaEZvclJlcG9ydHNcIiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBzdHlsZT1cImhlaWdodDogMzhweDsgY3Vyc29yOiBwb2ludGVyO1wiIHRpdGxlPVwiU2VhcmNoXCI+PGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHtyZXNldFF1ZXJ5KHRydWUsIHRydWUpO31cIiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBzdHlsZT1cImhlaWdodDogMzhweDsgY3Vyc29yOiBwb2ludGVyO1wiIHRpdGxlPVwiQ2xlYXIgU2VhcmNoXCI+PGkgY2xhc3M9XCJmYSBmYS1jbG9zZVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25hdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogZGVzaWduaW5nSGVhZGVyLCB3aXRoOiBoZWFkZXJEZXNpZ25lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBjbGFzcz1cIm92ZXJmbG93LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IFVzZVJlcG9ydEhlYWRlclwiPiBVc2UgUmVwb3J0IEhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogVXNlUmVwb3J0SGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZXNpZ24gdGhlIGNvbW1vbiByZXBvcnQgaGVhZGVyIGJlbG93IHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCByZXBvcnRzIHdoZXJlIHJlcG9ydCBoZWFkZXJzIGFyZSB0dXJuZWQgb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IG0tMVwiIGRhdGEtYmluZD1cInZpc2libGU6IGNsaWVudExpc3RJZHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+SGVhZGVycyBmb3Igb3RoZXIgQ2xpZW50cyBzYXZlZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogY2xpZW50TGlzdElkcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRIZWFkZXJDbGllbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zQ2FwdGlvbjogJ05vIENsaWVudCBJZCAoR2xvYmFsKScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHsgY2hhbmdlOiBmdW5jdGlvbiAoKSB7IGxvYWRIdG1sSGVhZGVyKHRydWUpOyB9IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC1zbS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgY2xhc3M9XCJmYSBmYS1xdWVzdGlvbi1jaXJjbGUgaGVscHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDaG9vc2UgYSBjbGllbnQgdG8gZGVzaWduIGl0cyByZXBvcnQgaGVhZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgbS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgY29sLXNtLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+U3BlY2lmeSBDbGllbnQgSWQgdG8gUmVzdHJpY3QgQWNjZXNzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtYm94IHNpbmdsZS1saW5lXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyQ2xpZW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC1zbS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIGNsYXNzPVwiZmEgZmEtcXVlc3Rpb24tY2lyY2xlIGhlbHB0aXBcIiB0aXRsZT1cIkxlYXZlIGJsYW5rIHRvIGdpdmUgYWxsIGNsaWVudHMgYWNjZXNzIChHbG9iYWwgUmVwb3J0IEhlYWRlcilcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInJlcG9ydC1oZWFkZXItZWRpdG9yXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gbXQtMlwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlSHRtbEhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBDaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIVVzZVJlcG9ydEhlYWRlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHR1cm4gb2ZmIHRoZSA8Yj5Vc2UgUmVwb3J0IEhlYWRlcjwvYj4gb3B0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxiPlJlcG9ydCBIZWFkZXI8L2I+IHdpbGwgbm90IGJlIGFwcGxpZWQgaW4gcmVwb3J0cy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtdC0yXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVIdG1sSGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IGRlc2lnbmluZ0hlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgcHVsbC1yaWdodFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkxpc3QgVmlld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBsYXlvdXQoKSA9PT0gJ2xpc3QnIH0sIGNsaWNrOiB0b2dnbGVMYXlvdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlzdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiSWNvbiBWaWV3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2FjdGl2ZSc6IGxheW91dCgpID09PSAnaWNvbnMnIH0sIGNsaWNrOiB0b2dnbGVMYXlvdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdGgtbGFyZ2VcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBsYXlvdXQoKT09J2ljb25zJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFTZWxlY3RlZEZvbGRlcigpICYmICFzZWFyY2hSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBsZWFzZSBjaG9vc2UgRm9sZGVycyBiZWxvdyB0byB2aWV3IFJlcG9ydHM8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJmb2xkZXItbGlzdFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IEZvbGRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7ICRwYXJlbnQuU2VsZWN0ZWRGb2xkZXIoJGRhdGEpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LnNlbGVjdE1vZGUsIGNsaWNrOiBmdW5jdGlvbihkLGUpeyBpc1NlbGVjdGVkKCFpc1NlbGVjdGVkKCkpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3M6IGlzU2VsZWN0ZWQoKSA/ICdmYSBmYS1jaGVjay1zcXVhcmUgdGV4dC1wcmltYXJ5IG1lLTInIDogJ2ZhIGZhLXNxdWFyZS1vIG1lLTInXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTN4IGZhLWZvbGRlciB0ZXh0LXNlY29uZGFyeVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXNjXCIgZGF0YS1iaW5kPVwidGV4dDogRm9sZGVyTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogU2VsZWN0ZWRGb2xkZXIoKSB8fCBzZWFyY2hSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHVsbC1sZWZ0XCI+UGxlYXNlIGNob29zZSBhIFJlcG9ydCBmcm9tIHRoaXMgRm9sZGVyPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IFNlbGVjdGVkRm9sZGVyKG51bGwpOyBzZWFyY2hSZXBvcnRzKCcnKTsgJCgnI3NlYXJjaC1yZXBvcnQnKS52YWwoW10pLnRyaWdnZXIoJ2NoYW5nZScpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uYmFjayB0byBGb2xkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1vdmVyZmxvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IFNlbGVjdGVkRm9sZGVyKCkhPW51bGwgJiYgcmVwb3J0c0luRm9sZGVyKCkubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZm9sZGVyIGlzIGVtcHR5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNlYXJjaFJlcG9ydHMoKSAmJiByZXBvcnRzSW5TZWFyY2goKS5sZW5ndGg9PTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gUmVwb3J0cyBmb3VuZCBtYXRjaGluZyB5b3VyIFNlYXJjaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogc2VhcmNoUmVwb3J0cygpID8gcmVwb3J0c0luU2VhcmNoKCkgOiByZXBvcnRzSW5Gb2xkZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5zZWxlY3RNb2RlLCBjaGVja2VkOiBpc1NlbGVjdGVkXCIgY2xhc3M9XCJwdWxsLWxlZnQgbWUtMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmYSBmYS0yeCBwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJjc3M6IHsnZmEtZmlsZSc6IHJlcG9ydFR5cGU9PSdMaXN0JywgJ2ZhLXRoLWxpc3QnOiByZXBvcnRUeXBlPT0nU3VtbWFyeScsICdmYS1iYXItY2hhcnQnOiByZXBvcnRUeXBlPT0nQmFyJywgJ2ZhLXBpZS1jaGFydCc6IHJlcG9ydFR5cGU9PSdQaWUnLCAgJ2ZhLWxpbmUtY2hhcnQnOiByZXBvcnRUeXBlPT0nTGluZScsICdmYS1nbG9iZSc6IHJlcG9ydFR5cGUuaW5kZXhPZignTWFwJyk9PTAsICdmYS13aW5kb3ctbWF4aW1pemUnOiByZXBvcnRUeXBlPT0nU2luZ2xlJywgJ2ZhLXJhbmRvbSc6IHJlcG9ydFR5cGU9PSdQaXZvdCcsICdmYS13aW5kb3ctcmVzdG9yZSc6IHJlcG9ydFR5cGU9PSdUcmVlbWFwJywgJ2ZhLXNpZ25hbCc6IHJlcG9ydFR5cGUgPT0gJ0NvbWJvJywgJ2ZhLWNvZGUnOiByZXBvcnRUeXBlID09ICdIdG1sJywgJ2ZhLW1hcCc6IHJlcG9ydFR5cGUgPT0gJ0hlYXRNYXAnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVwiY2xpY2s6IHJ1blJlcG9ydFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImhpZ2hsaWdodGVkVGV4dDogeyB0ZXh0OiByZXBvcnROYW1lLCBoaWdobGlnaHQ6ICRwYXJlbnQuc2VhcmNoUmVwb3J0cywgY3NzOiAnaGlnaGxpZ2h0JyB9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0RGVzY3JpcHRpb25cIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImlmOiAkcGFyZW50LnNlYXJjaFJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1mb2xkZXJcIj48L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZvbGRlck5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBtZXNzYWdlXCIgY2xhc3M9XCJoaWdobGlnaHQgc21hbGxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5hZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPlJlcG9ydCBBY2Nlc3M8L2I+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlIGJ5IFVzZXIgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6IHVzZXJJZCA/IHVzZXJJZCA6ICdBbnkgVXNlcidcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBvbmx5IGJ5IFVzZXIgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6ICh2aWV3T25seVVzZXJJZCA/IHZpZXdPbmx5VXNlcklkIDogKHVzZXJJZCA/IHVzZXJJZCA6ICdBbnkgVXNlcicpKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBkZWxldGVPbmx5VXNlcklkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBvbmx5IGJ5IFVzZXIgPHNwYW4gY2xhc3M9XCJiYWRnZSB0ZXh0LWJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6IGRlbGV0ZU9ubHlVc2VySWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHVzZXJSb2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZSBieSBSb2xlIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB1c2VyUm9sZSA/IHVzZXJSb2xlIDogJ05vIFJvbGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB2aWV3T25seVVzZXJSb2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgb25seSBieSBSb2xlIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB2aWV3T25seVVzZXJSb2xlID8gdmlld09ubHlVc2VyUm9sZSA6ICdBbnkgUm9sZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGRlbGV0ZU9ubHlVc2VyUm9sZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgb25seSBieSBSb2xlIDxzcGFuIGNsYXNzPVwiYmFkZ2UgdGV4dC1iZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBkZWxldGVPbmx5VXNlclJvbGUgPyBkZWxldGVPbmx5VXNlclJvbGUgOiAnU2FtZSBhcyBNYW5hZ2UnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBjbGllbnRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQ2xpZW50IDxzcGFuIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiIGRhdGEtYmluZD1cInRleHQ6IGNsaWVudElkID8gY2xpZW50SWQgOiAnQW55J1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0IExpbmsgdG8gUnVuIFJlcG9ydDogPGEgZGF0YS1iaW5kPVwiYXR0cjoge2hyZWY6ICcvRG90TmV0UmVwb3J0Lz9saW5rZWRyZXBvcnQ9dHJ1ZSZub3BhcmVudD10cnVlJnJlcG9ydElkPScgKyByZXBvcnRJZCB9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1saW5rXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7PGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYgKyAnP2xpbmtlZHJlcG9ydD10cnVlJm5vcGFyZW50PXRydWUmcmVwb3J0SWQ9JyArIHJlcG9ydElkIClcIj48c3BhbiBjbGFzcz1cImZhIGZhLWNvcHlcIiB0aXRsZT1cIkNsaWNrIHRvIENvcHkgTGlua1wiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHJpZ2h0LWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1tZC1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogJHJvb3QuQ2FuU2F2ZVJlcG9ydHMoKSB8fCAkcm9vdC5hZG1pbk1vZGUoKSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogb3BlblJlcG9ydCwgdmlzaWJsZTogY2FuRWRpdFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZWRpdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj4gRWRpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBjb3B5UmVwb3J0LCB2aXNpYmxlOiBjYW5FZGl0XCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI21vZGFsLXJlcG9ydGJ1aWxkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb3B5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPiBDb3B5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBydW5SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1nZWFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj4gUnVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBkcm9wZG93bi10b2dnbGUgZHJvcGRvd24tdG9nZ2xlLXNwbGl0XCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC00cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgncGRmJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIFBERlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwnKTt9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj4gRG93bmxvYWQgRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInZpc2libGU6IGhhc0RyaWxsZG93biwgY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwtc3ViJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIEV4Y2VsIChFeHBhbmRlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZGVsZXRlUmVwb3J0LCB2aXNpYmxlOiBjYW5EZWxldGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPiBEZWxldGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtYmxvY2sgZC1tZC1ub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJpZjogJHJvb3QuQ2FuU2F2ZVJlcG9ydHMoKSB8fCAkcm9vdC5hZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIHRpdGxlPVwiRWRpdCBSZXBvcnRcIiBkYXRhLWJpbmQ9XCJjbGljazogb3BlblJlcG9ydCwgdmlzaWJsZTogY2FuRWRpdFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZWRpdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJjbGljazogY29weVJlcG9ydCwgdmlzaWJsZTogY2FuRWRpdFwiIHRpdGxlPVwiQ29weSBSZXBvcnRcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS1icy10YXJnZXQ9XCIjbW9kYWwtcmVwb3J0YnVpbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvcHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBydW5SZXBvcnRcIiB0aXRsZT1cIlJ1biBSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1nZWFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi10b2dnbGUtc3BsaXRcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTRweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwnKTt9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj4gRG93bmxvYWQgRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInZpc2libGU6IGhhc0RyaWxsZG93biwgY2xpY2s6IGZ1bmN0aW9uKCkge2V4cG9ydFJlcG9ydCgnZXhjZWwtc3ViJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIEV4Y2VsIHdpdGggaW5uZXIgcm93c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiB0aXRsZT1cIkRlbGV0ZSBSZXBvcnRcIiBkYXRhLWJpbmQ9XCJjbGljazogZGVsZXRlUmVwb3J0LCB2aXNpYmxlOiBjYW5EZWxldGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGxheW91dCgpPT0nbGlzdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtZXhwbG9yZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmF2IGNsYXNzPVwiYnJlYWRjcnVtYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJicmVhZGNydW1iLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgU2VsZWN0ZWRGb2xkZXIobnVsbCk7IHNlYXJjaFJlcG9ydHMoJycpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBGb2xkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtIGFjdGl2ZVwiIGRhdGEtYmluZD1cInZpc2libGU6IFNlbGVjdGVkRm9sZGVyICYmICFzZWFyY2hSZXBvcnRzKCksIHRleHQ6IFNlbGVjdGVkRm9sZGVyKCk/LkZvbGRlck5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmVhZGNydW1iLWl0ZW0gYWN0aXZlXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VhcmNoUmVwb3J0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggUmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIVNlbGVjdGVkRm9sZGVyKCkgJiYgIXNlYXJjaFJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmdy1ib2xkIGJvcmRlci1ib3R0b20gcHktMiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+TmFtZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtZW5kXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlXCI+QWNjZXNzIENvbnRyb2w8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb2xkZXItbGlzdFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IEZvbGRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY2xpY2thYmxlIHB5LTIgYm9yZGVyLWJvdHRvbSBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgJHBhcmVudC5TZWxlY3RlZEZvbGRlcigkZGF0YSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5zZWxlY3RNb2RlLCBjbGljazogZnVuY3Rpb24oZCxlKXsgaXNTZWxlY3RlZCghaXNTZWxlY3RlZCgpKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzczogaXNTZWxlY3RlZCgpID8gJ2ZhIGZhLWNoZWNrLXNxdWFyZSB0ZXh0LXByaW1hcnkgbWUtMicgOiAnZmEgZmEtc3F1YXJlLW8gbWUtMidcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZm9sZGVyIHRleHQtc2Vjb25kYXJ5IG1lLTJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IEZvbGRlck5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtZW5kXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5hZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgY2xhc3M9XCJiYWRnZSBiZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB1c2VySWQgPyB1c2VySWQgOiAnQW55IFVzZXInXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UgYmctaW5mbyB0ZXh0LXdoaXRlXCIgZGF0YS1iaW5kPVwidGV4dDogdXNlclJvbGUgPyB1c2VyUm9sZSA6ICdObyBSb2xlJ1wiPjwvZGl2Pi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTZWxlY3RlZEZvbGRlcigpIHx8IHNlYXJjaFJlcG9ydHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogU2VsZWN0ZWRGb2xkZXIoKSE9bnVsbCAmJiByZXBvcnRzSW5Gb2xkZXIoKS5sZW5ndGg9PTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZFwiPlRoaXMgZm9sZGVyIGlzIGVtcHR5LjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzZWFyY2hSZXBvcnRzKCkgJiYgcmVwb3J0c0luU2VhcmNoKCkubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5ObyByZXBvcnRzIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHJlcG9ydHNJbkZvbGRlcigpLmxlbmd0aCA+IDAgfHwgcmVwb3J0c0luU2VhcmNoKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmdy1ib2xkIGJvcmRlci1ib3R0b20gcHktMiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPk5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWFyY2hSZXBvcnRzKClcIj5Gb2xkZXI8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGVcIj5BY2Nlc3M8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGVcIj5EaXJlY3QgTGluazwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1saXN0XCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogc2VhcmNoUmVwb3J0cygpID8gcmVwb3J0c0luU2VhcmNoKCkgOiByZXBvcnRzSW5Gb2xkZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYm9yZGVyLWJvdHRvbSBweS0yIGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRyb290LnNlbGVjdE1vZGUsIGNoZWNrZWQ6IGlzU2VsZWN0ZWRcIiBjbGFzcz1cIm1lLTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLWZpbGUnOiByZXBvcnRUeXBlPT0nTGlzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtdGgtbGlzdCc6IHJlcG9ydFR5cGU9PSdTdW1tYXJ5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1iYXItY2hhcnQnOiByZXBvcnRUeXBlPT0nQmFyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1waWUtY2hhcnQnOiByZXBvcnRUeXBlPT0nUGllJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1saW5lLWNoYXJ0JzogcmVwb3J0VHlwZT09J0xpbmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLXNpZ25hbCc6IHJlcG9ydFR5cGU9PSdDb21ibycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtZ2xvYmUnOiByZXBvcnRUeXBlLmluZGV4T2YoJ01hcCcpPT0wLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLXdpbmRvdy1tYXhpbWl6ZSc6IHJlcG9ydFR5cGU9PSdTaW5nbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLXJhbmRvbSc6IHJlcG9ydFR5cGU9PSdQaXZvdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtd2luZG93LXJlc3RvcmUnOiByZXBvcnRUeXBlPT0nVHJlZW1hcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtY29kZSc6IHJlcG9ydFR5cGUgPT0gJ0h0bWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLW1hcCc6IHJlcG9ydFR5cGUgPT0gJ0hlYXRNYXAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1zLTJcIiBkYXRhLWJpbmQ9XCJjbGljazogcnVuUmVwb3J0LCBoaWdobGlnaHRlZFRleHQ6IHsgdGV4dDogcmVwb3J0TmFtZSwgaGlnaGxpZ2h0OiAkcGFyZW50LnNlYXJjaFJlcG9ydHMsIGNzczogJ2hpZ2hsaWdodCcgfVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+PC9hPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogbWVzc2FnZVwiIGNsYXNzPVwiaGlnaGxpZ2h0IHNtYWxsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLWhcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNtb2RhbC1yZXBvcnRidWlsZGVyXCIgZGF0YS1iaW5kPVwiY2xpY2s6IG9wZW5SZXBvcnQsIHZpc2libGU6IGNhbkVkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVkaXRcIj48L3NwYW4+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS1icy10YXJnZXQ9XCIjbW9kYWwtcmVwb3J0YnVpbGRlclwiIGRhdGEtYmluZD1cImNsaWNrOiBjb3B5UmVwb3J0LCB2aXNpYmxlOiBjYW5FZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb3B5XCI+PC9zcGFuPiBDb3B5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSB0ZXh0LWRhbmdlclwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGRlbGV0ZVJlcG9ydCwgdmlzaWJsZTogY2FuRGVsZXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvc3Bhbj4gRGVsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogcnVuUmVwb3J0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1nZWFyc1wiPjwvc3Bhbj4gUnVuIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZHJvcGRvd24tdG9nZ2xlXCIgaHJlZj1cIiNcIj5FeHBvcnQ8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHtleHBvcnRSZXBvcnQoJ3BkZicpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPiBEb3dubG9hZCBQREZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHtleHBvcnRSZXBvcnQoJ2V4Y2VsJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IERvd25sb2FkIEV4Y2VsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBoYXNEcmlsbGRvd24sIGNsaWNrOiBmdW5jdGlvbigpIHtleHBvcnRSZXBvcnQoJ2V4Y2VsLXN1YicpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPiBEb3dubG9hZCBFeGNlbCAoRXhwYW5kZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiRwYXJlbnQuYWRtaW5Nb2RlLCBjbGljazogZnVuY3Rpb24oKSB7ZXhwb3J0UmVwb3J0KCdqc29uJyk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlXCI+PC9zcGFuPiBFeHBvcnQgSlNPTlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiIGRhdGEtYmluZD1cInRleHQ6IGZvbGRlck5hbWUsIHZpc2libGU6ICRwYXJlbnQuc2VhcmNoUmVwb3J0cygpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGJnLWluZm8gdGV4dC13aGl0ZVwiIGRhdGEtYmluZD1cInRleHQ6IHVzZXJJZCA/IHVzZXJJZCA6ICdBbnkgVXNlcidcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBiZy1pbmZvIHRleHQtd2hpdGVcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiB1c2VyUm9sZSA/IHVzZXJSb2xlIDogJ05vIFJvbGUnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVwiYXR0cjoge2hyZWY6ICcvRG90TmV0UmVwb3J0P2xpbmtlZHJlcG9ydD10cnVlJm5vcGFyZW50PXRydWUmcmVwb3J0SWQ9JyArIHJlcG9ydElkIH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cImZhIGZhLWxpbmtcIj48L3NwYW4+PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgbmF2aWdhdG9yICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoJy9Eb3ROZXRSZXBvcnQ/bGlua2VkcmVwb3J0PXRydWUmbm9wYXJlbnQ9dHJ1ZSZyZXBvcnRJZD0nICsgcmVwb3J0SWQpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvcHlcIiB0aXRsZT1cIkNvcHkgTGlua1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgXHJcblxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRNb2RlKCkgPT0gJ2V4ZWN1dGUnIHx8IFJlcG9ydE1vZGUoKSA9PSAnbGlua2VkJyB8fCBSZXBvcnRNb2RlKCkgPT0gJ2Rlc2lnbidcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHRydWU7XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWV4cGFuZC1sZyBuYXZiYXItbGlnaHQgYmctbGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm5hdmJhci1icmFuZFwiIGhyZWY9XCIjXCI+Vmlld2luZyBSZXBvcnQ8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJzLXRhcmdldD1cIiNuYXZiYXJTdXBwb3J0ZWRDb250ZW50XCIgYXJpYS1jb250cm9scz1cIm5hdmJhclN1cHBvcnRlZENvbnRlbnRcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIG5hdmlnYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZiYXItdG9nZ2xlci1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2VcIiBpZD1cIm5hdmJhclN1cHBvcnRlZENvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibmF2YmFyLW5hdiBtZS1hdXRvXCI+PC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHskcm9vdC5SZXBvcnRNb2RlKCdzdGFydCcpOyAkcm9vdC50ZXh0UXVlcnkuc2V0dXBTZWFyY2goKTt9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkJhY2sgdG8gUmVwb3J0czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0TW9kZSgpPT0nbGlua2VkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctY2lyY2xlLWxlZnRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QmFjayB0byBQYXJlbnQgUmVwb3J0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5DYW5FZGl0KCkgJiYgUmVwb3J0SUQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi10b2dnbGUgYnRuIGJ0bi1saWdodCBidG4tc21cIiByb2xlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWRpdFwiPjwvaT4gRWRpdCBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBTYXZlUmVwb3J0KHRydWUpOyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI21vZGFsLXJlcG9ydGJ1aWxkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2xpZGVyc1wiPjwvaT4gRWRpdCB3aXRoIFN0YW5kYXJkIERlc2lnbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZWRpdFJlcG9ydEFpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJvbHRcIj48L2k+IEVkaXQgd2l0aCBTbWFydGVyIERlc2lnbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGRhdGEtYmluZD1cImNsaWNrOiBSZWZyZXNoUmVwb3J0LCB2aXNpYmxlOiBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5SZWZyZXNoPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogaXNEaXJ0eVwiIHRpdGxlPVwiWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0ZXh0LXdhcm5pbmcgZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc21cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5DYW5FZGl0KCksIGNsaWNrOiBTYXZlV2l0aG91dFJ1blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2F2ZVwiPjwvaT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2F2ZSBSZXBvcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiIGRhdGEtYmluZD1cImhpZGRlbjogKERvbnRFeGVjdXRlT25SdW4oKSAmJiAhcmVwb3J0UmFuKCkpIHx8ICFSZXBvcnRJRCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkcm9wZG93bi10b2dnbGVcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkV4cG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XCJoaWRkZW46IGFwcFNldHRpbmdzLnVzZUFsdFBkZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogYXBwU2V0dGluZ3Muc2hvd1BhZ2VTaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKCkgeyBQZGZQYWdlLmlzRGVidWcgPSBmYWxzZTsgJCgnI3BkZk9wdGlvbnNNb2RhbCcpLm1vZGFsKCdzaG93Jyk7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oKSB7IGRvd25sb2FkUGRmKGZhbHNlKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGUoKSAmJiAhYXBwU2V0dGluZ3MudXNlQWx0UGRmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBhcHBTZXR0aW5ncy5zaG93UGFnZVNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oKSB7IFBkZlBhZ2UuaXNEZWJ1ZyA9IHRydWU7ICQoJyNwZGZPcHRpb25zTW9kYWwnKS5tb2RhbCgnc2hvdycpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uKCkgeyBkb3dubG9hZFBkZih0cnVlKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmIChEZWJ1ZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGFwcFNldHRpbmdzLnVzZUFsdFBkZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogYXBwU2V0dGluZ3Muc2hvd1BhZ2VTaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKCkgeyAkKCcjcGRmT3B0aW9uc01vZGFsJykubW9kYWwoJ3Nob3cnKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsgZG93bmxvYWRQZGZBbHQoKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGRvd25sb2FkRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvaT4gRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGNhbkRyaWxsZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZG93bmxvYWRFeGNlbFdpdGhEcmlsbGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvaT4gRXhjZWwgKEV4cGFuZGVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1iaW5kPVwiaGlkZGVuOiBhcHBTZXR0aW5ncy5kb250V29yZEV4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGFwcFNldHRpbmdzLnNob3dQYWdlU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oKSB7ICQoJyN3b3JkT3B0aW9uc01vZGFsJykubW9kYWwoJ3Nob3cnKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oKSB7IGRvd25sb2FkV29yZCgpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLXdvcmQtb1wiPjwvc3Bhbj4gV29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZENzdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9pPiBDc3ZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cImhpZGRlbjogYXBwU2V0dGluZ3MuZG9udFhtbEV4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogZG93bmxvYWRYbWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbGUtY29kZS1vXCI+PC9pPiBYbWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogcHJpbnRSZXBvcnRQYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wcmludFwiPjwvaT4gUHJpbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uYXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBhY3RpdmVEZXNpZ24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IFJlcG9ydElEKCkgPD0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnNcIiBpZD1cImRlc2lnblRhYnNcIiByb2xlPVwidGFibGlzdFwiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayBhY3RpdmVcIiBpZD1cImRlc2lnbmVyLXRhYlwiIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCIgZGF0YS1icy10YXJnZXQ9XCIjZGVzaWduZXJcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBvcnQgRGVzaWduZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWxpbmtcIiBpZD1cIm5sLXRhYlwiIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCIgZGF0YS1icy10YXJnZXQ9XCIjbmxcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgUHJvbXB0PHNwYW4gdGl0bGU9XCJUaGlzIGZlYXR1cmUgaXMgc3RpbGwgaW4gQmV0YSByZWxlYXNlLiBZb3UgY2FuIHR1cm4gaXQgb2ZmIGZyb20gc2V0dGluZ3NcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTBwdDsgcGFkZGluZzogNXB4OyBtYXgtd2lkdGg6IDM1MHB4OyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBtYXJnaW4tYm90dG9tOiAwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZSBzaG93IGFjdGl2ZVwiIGlkPVwiZGVzaWduZXJcIiByb2xlPVwidGFicGFuZWxcIiBhcmlhLWxhYmVsbGVkYnk9XCJkZXNpZ25lci10YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWRlc2lnbmVyLWNvbXBhY3QnLCBkYXRhOiAkcm9vdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiIGlkPVwibmxcIiByb2xlPVwidGFicGFuZWxcIiBhcmlhLWxhYmVsbGVkYnk9XCJubC10YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0IHdvdWxkIHlvdSBsaWtlIHRvIGtub3c/IFR5cGUgYSA8Yj5uYXR1cmFsIGxhbmd1YWdlIHByb21wdDwvYj4gYmVsb3cgdG8gYXNrIHF1ZXN0aW9ucyBhYm91dCB5b3VyIGRhdGEuPGJyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSA8Yj5BdXRvIENvbXBsZXRlPC9iPiBzdWdnZXN0aW9ucyB0byBndWlkZSB5b3VyIHF1ZXJ5IOKAlCB0aGUgQUkgd2lsbCBjb252ZXJ0IHlvdXIgcHJvbXB0IGludG8gYSBEb3RuZXQgUmVwb3J0IHRoYXQgeW91IGNhbiB0aGVuIHByZXZpZXcsIGRlc2lnbiwgc2F2ZSBhbmQgcmV1c2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgaWQ9XCJxdWVyeS1pbnB1dFwiIGNsYXNzPVwicXVlcnktaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IG1lJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7cnVuUXVlcnkoZmFsc2UpO31cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1tYWdpY1wiPjwvc3Bhbj4gUHJvY2VzcyB3aXRoIEFJXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge3Jlc2V0UXVlcnkodHJ1ZSwgZmFsc2UpO31cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXVuZG9cIj48L3NwYW4+IFN0YXJ0IE92ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6IGFkbWluTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvZGVcIj48L3NwYW4+IFZpZXcgQ29kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogQ2FuU2F2ZVJlcG9ydHMoKSwgY2xpY2s6IFNhdmVXaXRob3V0UnVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2F2ZVwiPjwvc3Bhbj4gU2F2ZSBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLWJpbmQ9XCJjbGljazogb3BlbkRlc2lnbmVyXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L3NwYW4+IERlc2lnbi9TYXZlIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogUmVwb3J0SUQoKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1kZXNpZ25lci1jb21wYWN0JywgZGF0YTogJHJvb3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0UmVzdWx0XCIgY2xhc3M9XCJyZXBvcnQtdmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IEhhc0Vycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogJHJvb3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogRWRpdEZpbHRlcnNPblJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYnMtdGFyZ2V0PVwiI2ZpbHRlci1wYW5lbFwiIGhyZWY9XCIjXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyXCI+PC9pPkNob29zZSBGaWx0ZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZmlsdGVyLXBhbmVsXCIgY2xhc3M9XCJjYXJkLWJvZHkgY29sbGFwc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLXBhcmFtZXRlcnMnfVwiIGNsYXNzPVwiY29sLW1kLTEyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmaWx0ZXItZ3JvdXAnfVwiIGNsYXNzPVwiY29sLW1kLTEyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogU2F2ZUZpbHRlckFuZFJ1blJlcG9ydFwiPlVwZGF0ZSBGaWx0ZXJzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IEVkaXRGaWx0ZXJzT25SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmbHktZmlsdGVyLXRlbXBsYXRlJ31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtcmVuZGVyXCIgZGF0YS1iaW5kPVwiY3NzOiB7ICdyZXBvcnQtZXhwYW5kZWQnOiBpc0V4cGFuZGVkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LW1lbnViYXIgYmctbGlnaHRcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IERvbnRFeGVjdXRlT25SdW4oKSAmJiAhcmVwb3J0UmFuKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtY2VudGVyZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5saW5lIHB1bGwtbGVmdFwiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnIFRvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhJHJvb3QuaXNDaGFydCgpIHx8ICRyb290LlNob3dEYXRhV2l0aEdyYXBoKCksIGNsaWNrOiAkcm9vdC5kb3dubG9hZEV4Y2VsXCIgdGl0bGU9XCJFeHBvcnQgdG8gRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1leGNlbC1vXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnRvZ2dsZUV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1leHBhbmQnOiAhJHBhcmVudC5pc0V4cGFuZGVkKCksICdmYS1jb21wcmVzcyc6ICRwYXJlbnQuaXNFeHBhbmRlZCgpIH1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5jYW5EcmlsbGRvd24sIGNsaWNrOiAkcGFyZW50LkV4cGFuZEFsbFwiIHRpdGxlPVwiRXhwYW5kIGFsbCByb3dzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBsdXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5jYW5EcmlsbGRvd24sIGNsaWNrOiAkcGFyZW50LkNvbGxhcHNlQWxsXCIgdGl0bGU9XCJDb2xsYXBzZSBhbGwgcm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1taW51c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIlJlLXJ1biBSZXBvcnRcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7ICRyb290LlJ1blJlcG9ydChmYWxzZSwgdHJ1ZSk7fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbGF5XCI+PC9pPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogJHBhcmVudFwiIGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tc2VsZWN0ZWRcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IHNlbGVjdGVkVGFibGVTdHlsZVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJGb3JtYXQgVGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0gZmEtcGFpbnQtYnJ1c2hcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB0YWJsZVN0eWxlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uXCIgZGF0YS1iaW5kPVwidGl0bGU6ICRkYXRhLm5hbWUsIGNsaWNrOiAkcGFyZW50LnNlbGVjdFN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLXByZXZpZXdcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBuZXcgQXJyYXkoNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLXJvd1wiIGRhdGEtYmluZD1cImZvcmVhY2g6IG5ldyBBcnJheSg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLWNlbGxcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6ICRwYXJlbnRDb250ZXh0LiRpbmRleCgpID09PSAwID8gJHBhcmVudHNbMV0uaGVhZGVyQmcgOiAoJHBhcmVudENvbnRleHQuJGluZGV4KCkgJSAyID09PSAwID8gJHBhcmVudHNbMV0uYWx0Um93QmcgOiAkcGFyZW50c1sxXS5yb3dCZyksIGNvbG9yOiAkcGFyZW50c1sxXS50ZXh0Q29sb3IgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5saW5lIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbSBwdWxsLXJpZ2h0XCIgcm9sZT1cImdyb3VwXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvaT4gVmlldyBSZXBvcnQgQ29kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuem9vbU91dFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiWm9vbSBPdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2gtbWludXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZXNldFpvb21cIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIlJlc2V0IFpvb21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb21wcmVzc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50Lnpvb21JblwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiWm9vbSBJblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaC1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtY2FudmFzXCIgZGF0YS1iaW5kPVwiaGlkZGVuOiBEb250RXhlY3V0ZU9uUnVuKCkgJiYgIXJlcG9ydFJhbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtY29udGFpbmVyIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LWlubmVyIGJnLXdoaXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHJvb3QuQ2FuRWRpdCgpICYmIFJlcG9ydFR5cGUoKSE9J0h0bWwnICYmIFJlcG9ydFR5cGUoKSE9J1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2NoYXJ0LXNldHRpbmdzJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IGhlYWRlckRlc2lnbmVyLlVzZVJlcG9ydEhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicmVwb3J0LWhlYWRlclwiIHdpZHRoPVwiOTAwXCIgaGVpZ2h0PVwiMTIwXCIgZGF0YS1iaW5kPVwiaHRtbDogaGVhZGVyRGVzaWduZXIuaGVhZGVySHRtbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBkYXRhLWJpbmQ9XCJ0ZXh0OiBSZXBvcnROYW1lXCI+PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnREZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInJlcG9ydC1leHBhbmRlZC1zY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlJlcG9ydCByYW4gb246IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCkgKyAnICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogSGFzRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGRhdGEtYmluZD1cInRleHQ6ICRyb290LlJlcG9ydE5hbWVcIj48L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWJpbmQ9XCJ0ZXh0OiAkcm9vdC5SZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5BbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQgd2hpbGUgcnVubmluZyB0aGUgUmVwb3J0PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkVycm9yIERldGFpbHM8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGV4dDogRXhjZXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZGVcIj48L2k+IFZpZXcgUmVwb3J0IENvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyAkcm9vdC5SdW5SZXBvcnQoZmFsc2UsIHRydWUpO31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGxheVwiPjwvaT4gUmUtcnVuIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIFJlcG9ydCBCdWlsZGVyIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWwgbW9kYWwtZnVsbHNjcmVlblwiIGlkPVwibW9kYWwtcmVwb3J0YnVpbGRlclwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJteU1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50O1wiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtZGVzaWduZXInLCBkYXRhOiAkZGF0YX1cIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIEZpZWxkIE9wdGlvbnMgTW9kYWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZmllbGRPcHRpb25zTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtZmllbGQtb3B0aW9ucycsIGRhdGE6ICRkYXRhfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gTGluayBFZGl0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImxpbmtNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1saW5rLWVkaXQnLCBkYXRhOiAkZGF0YX1cIj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIEZvbGRlciBFZGl0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImZvbGRlck1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiBkYXRhLWJpbmQ9XCJjc3M6IHsnbW9kYWwtbGcnOiBhZG1pbk1vZGV9XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBNYW5hZ2VGb2xkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgIGZzLTVcIj5NYW5hZ2UgRm9sZGVyPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1tZC00IGNvbnRyb2wtbGFiZWxcIj5Gb2xkZXIgTmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGNvbC1tZC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmb2xkZXJOYW1lXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XCJGb2xkZXIgTmFtZVwiIGRhdGEtYmluZD1cInZhbHVlOiBGb2xkZXJOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcm9vdC5hZG1pbk1vZGVcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlJywgZGF0YTogJHJvb3QubWFuYWdlRm9sZGVyQWNjZXNzfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVGb2xkZXJcIj5TYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBJbXBvcnQgSnNvbiBGaWxlIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInVwbG9hZEZpbGVNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJ1cGxvYWRGaWxlTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogTWFuYWdlSnNvbkZpbGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInVwbG9hZEZpbGVNb2RhbExhYmVsXCI+SW1wb3J0IHByZXZpb3VzbHkgRXhwb3J0ZWQgUmVwb3J0czwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5JbnN0cnVjdGlvbnM6PC9zdHJvbmc+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAg4oCiIFNlbGVjdCBhIDxjb2RlPi5qc29uPC9jb2RlPiBmaWxlIHByZXZpb3VzbHkgZXhwb3J0ZWQgZnJvbSBEb3RuZXQgUmVwb3J0LjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIOKAoiBUaGUgZmlsZSBtYXkgaW5jbHVkZSBtdWx0aXBsZSByZXBvcnRzIGFuZCB0aGVpciBmb2xkZXJzLjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIOKAoiBBbnkgbWlzc2luZyBmb2xkZXJzIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgIOKAoiBJZiBhIHJlcG9ydCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvOlxyXG4gICAgICAgICAgICAgICAgICAgIDxlbT5Ta2lwPC9lbT4sIDxlbT5PdmVyd3JpdGU8L2VtPiwgb3IgPGVtPk1ha2UgYSBDb3B5PC9lbT4uPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAg4oCiIE9uY2UgdXBsb2FkZWQsIGFsbCBpbXBvcnRlZCByZXBvcnRzIHdpbGwgYmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRyb3B6b25lXCIgY2xhc3M9XCJkcm9wem9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImV2ZW50OiB7Y2xpY2s6IHRyaWdnZXJGaWxlSW5wdXQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyOiAycHggZGFzaGVkICMwMDdiZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMzBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzAwN2JmZjsgY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIENsaWNrIGhlcmUgdG8gc2VsZWN0IGEgSlNPTiBmaWxlXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImZpbGVJbnB1dEpzb25cIiBhY2NlcHQ9XCIuanNvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImV2ZW50OiB7IGNoYW5nZTogaGFuZGxlRmlsZVNlbGVjdCB9XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmaWxlTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+U2VsZWN0ZWQgRmlsZTo8L3N0cm9uZz4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmlsZU5hbWVcIj48L3NwYW4+PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHVwbG9hZEZpbGVcIj5VcGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cIndvcmRPcHRpb25zTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwid29yZE9wdGlvbnNNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICd3b3JkLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInBkZk9wdGlvbnNNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJwZGZPcHRpb25zTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAncGRmLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBUaGlzIHJlbmRlcnMgdGhlIHRlbXBsYXRlIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInBkZk9wdGlvbnNTY2hlZHVsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInBkZk9wdGlvbnNTY2hlZHVsZU1vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHsgbmFtZTogJ3BkZi1vcHRpb25zLXNjaGVkdWxlLXRlbXBsYXRlJywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSBUaGlzIHJlbmRlcnMgdGhlIHRlbXBsYXRlIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cIndvcmRPcHRpb25zU2NoZWR1bGVNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJ3b3JkT3B0aW9uc1NjaGVkdWxlTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAnd29yZC1vcHRpb25zLXNjaGVkdWxlLXRlbXBsYXRlJywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGVtcGxhdGVzIC0tPlxyXG48ZGl2IFtpbm5lckh0bWxdPVwicmVwb3J0VGVtcGxhdGVzXCI+PC9kaXY+XHJcbjwhLS0gVGVtcGxhdGVzIC0tPiJdfQ==