@firestitch/report 18.9.0 → 18.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/anchor-at-point.d.ts +14 -0
- package/app/reports/canvas-landing-page.d.ts +2 -0
- package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +3 -0
- package/app/reports/components/report-component/report-component.component.d.ts +35 -1
- package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
- package/app/reports/data/report.data.d.ts +20 -7
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +18 -3
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +45 -8
- package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
- package/app/reports/drill-crumbs.d.ts +12 -0
- package/app/reports/export/report-export-collector.service.d.ts +13 -4
- package/app/reports/export/report-filter-lines.d.ts +18 -0
- package/app/reports/filter-settings-rules.d.ts +37 -0
- package/app/reports/format.d.ts +0 -1
- package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
- package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
- package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
- package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
- package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
- package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
- package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
- package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
- package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
- package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
- package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
- package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
- package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
- package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
- package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
- package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
- package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
- package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
- package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
- package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
- package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
- package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
- package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
- package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
- package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
- package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
- package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
- package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
- package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
- package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
- package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
- package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
- package/app/reports/interfaces/report-view.interface.d.ts +7 -0
- package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
- package/app/reports/interfaces/report-views.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +27 -16
- package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
- package/app/reports/mark-click.d.ts +20 -0
- package/app/reports/option-builder.d.ts +12 -1
- package/app/reports/report-chat-viewer-state.d.ts +8 -0
- package/app/reports/report-date-presets.d.ts +2 -0
- package/app/reports/report-filter-items.d.ts +20 -21
- package/app/reports/report-tile.d.ts +2 -0
- package/app/reports/report-view-config.d.ts +34 -0
- package/app/reports/report-view-menu.d.ts +15 -0
- package/app/reports/report-viewer-features.d.ts +5 -0
- package/app/reports/services/report-filter-options.service.d.ts +26 -0
- package/app/reports/services/report-filter-state.service.d.ts +65 -11
- package/app/reports/services/report-view.service.d.ts +39 -0
- package/app/reports/tile-data-state.d.ts +7 -0
- package/app/reports/tile-loads.d.ts +4 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +10 -8
- package/app/reports/views/report/report.component.d.ts +6 -0
- package/esm2022/app/reports/anchor-at-point.mjs +49 -0
- package/esm2022/app/reports/canvas-landing-page.mjs +26 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +11 -5
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +56 -40
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +261 -65
- package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
- package/esm2022/app/reports/data/report.data.mjs +94 -14
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +106 -51
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +248 -104
- package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
- package/esm2022/app/reports/drill-crumbs.mjs +73 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +187 -117
- package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +12 -7
- package/esm2022/app/reports/export/report-pptx.service.mjs +18 -14
- package/esm2022/app/reports/filter-settings-rules.mjs +290 -0
- package/esm2022/app/reports/format.mjs +2 -22
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
- package/esm2022/app/reports/mark-click.mjs +193 -0
- package/esm2022/app/reports/option-builder.mjs +159 -15
- package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
- package/esm2022/app/reports/report-date-presets.mjs +18 -0
- package/esm2022/app/reports/report-filter-items.mjs +263 -72
- package/esm2022/app/reports/report-tile.mjs +12 -0
- package/esm2022/app/reports/report-view-config.mjs +587 -0
- package/esm2022/app/reports/report-view-menu.mjs +119 -0
- package/esm2022/app/reports/report-viewer-features.mjs +42 -0
- package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +668 -210
- package/esm2022/app/reports/services/report-view.service.mjs +218 -0
- package/esm2022/app/reports/tile-data-state.mjs +127 -0
- package/esm2022/app/reports/tile-loads.mjs +38 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +194 -127
- package/esm2022/app/reports/views/report/report.component.mjs +112 -29
- package/esm2022/public_api.mjs +23 -1
- package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CqbXT1gh.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +8222 -4447
- package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +22 -0
- package/app/reports/report-url-state.d.ts +0 -19
- package/esm2022/app/reports/report-url-state.mjs +0 -189
- package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { addDays, isValid, parseISO } from 'date-fns';
|
|
2
|
-
import {
|
|
2
|
+
import { toZonedTime } from 'date-fns-tz';
|
|
3
3
|
import { ReportListColumnFormat } from './enums/report-list-column-format.enum';
|
|
4
4
|
import { ReportNumberUnits } from './enums/report-number-units.enum';
|
|
5
5
|
import { ReportValueFormat } from './enums/report-value-format.enum';
|
|
@@ -1011,26 +1011,6 @@ function kpiBaselineText(against) {
|
|
|
1011
1011
|
function capitalize(text) {
|
|
1012
1012
|
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
1013
1013
|
}
|
|
1014
|
-
// A short, human label for a zone: its city plus the current abbreviation,
|
|
1015
|
-
// e.g. 'America/New_York' reads 'New York (EDT)'. UTC stays 'UTC', and an
|
|
1016
|
-
// unknown zone is shown as its id. An 'Etc/' zone names no city, and its POSIX
|
|
1017
|
-
// sign is the reverse of the offset ('Etc/GMT+5' is GMT-5), so it reads as the
|
|
1018
|
-
// abbreviation alone: 'Etc/UTC' is 'UTC', 'Etc/GMT+5' is 'GMT-5'.
|
|
1019
|
-
export function getTimezoneLabel(timezone) {
|
|
1020
|
-
if (timezone === 'UTC') {
|
|
1021
|
-
return timezone;
|
|
1022
|
-
}
|
|
1023
|
-
const segments = timezone.split('/');
|
|
1024
|
-
try {
|
|
1025
|
-
const abbreviation = formatInTimeZone(new Date(), timezone, 'zzz');
|
|
1026
|
-
return segments[0] === 'Etc'
|
|
1027
|
-
? abbreviation
|
|
1028
|
-
: `${segments[segments.length - 1].replace(/_/g, ' ')} (${abbreviation})`;
|
|
1029
|
-
}
|
|
1030
|
-
catch {
|
|
1031
|
-
return timezone;
|
|
1032
|
-
}
|
|
1033
|
-
}
|
|
1034
1014
|
// "Now" as a Date whose local fields read the wall clock in the given zone, so
|
|
1035
1015
|
// date-fns calendar arithmetic (startOfWeek, startOfMonth, ...) and
|
|
1036
1016
|
// dateBoundString() land on the zone's calendar day rather than the browser's.
|
|
@@ -1045,4 +1025,4 @@ export function getZonedNow(timezone) {
|
|
|
1045
1025
|
return now;
|
|
1046
1026
|
}
|
|
1047
1027
|
}
|
|
1048
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQXNCckUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW9CLE9BQU8sQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBdUIsS0FBSyxDQUFDO0FBRWxFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFrQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pGLE1BQU0sRUFBRSxzQkFBc0I7SUFDOUIsUUFBUSxFQUFFLHdCQUF3QjtJQUNsQyxZQUFZLEVBQUUsSUFBSTtDQUNuQixDQUFDLENBQUM7QUFFSCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLHNEQUFzRDtBQUN0RCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBOEI7SUFDaEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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QUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5FLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUs7WUFDMUIsQ0FBQyxDQUFDLFlBQVk7WUFDZCxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFlBQVksR0FBRyxDQUFDO0lBQzlFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUdELCtFQUErRTtBQUMvRSxvRUFBb0U7QUFDcEUsK0VBQStFO0FBQy9FLHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWdCO0lBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkRGF5cywgaXNWYWxpZCwgcGFyc2VJU08gfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBmb3JtYXRJblRpbWVab25lLCB0b1pvbmVkVGltZSB9IGZyb20gJ2RhdGUtZm5zLXR6JztcblxuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtbnVtYmVyLXVuaXRzLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0VmFsdWVGb3JtYXQgfSBmcm9tICcuL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBDaGFydE1lYXN1cmUsXG4gIENvbXBhcmlzb25BZ2FpbnN0LFxuICBDb21wYXJpc29uTm90ZUNvZGUsXG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIEtwaU5vdGVDb2RlLFxuICBOdW1iZXJGb3JtYXRTcGVjLFxuICBPdXRwdXRNZXRhLFxuICBPdXRwdXRSb2xlLFxuICBSZXBvcnQsXG4gIFJlcG9ydEN1cnJlbmN5Q29kZSxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxuICBXaW5kb3dOb3RlQ29kZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoYXQgYSByZXBvcnQgcmVhZHMgd2hlbiB0aGUgc2VydmVyIG5hbWVzIG5vIHVzYWJsZSBsb2NhbGUgb3IgY3VycmVuY3k6IGFuXG4vLyBvbGRlciBzZXJ2ZXIgdGhhdCBzZW5kcyBuZWl0aGVyLCBvciBhIHZhbHVlIHRoaXMgYnJvd3NlcidzIEludGwgY2Fubm90IHVzZS5cbi8vIE5ldmVyIHRoZSBicm93c2VyJ3Mgb3duIGxvY2FsZSwgc28gZXZlcnkgdmlld2VyIG9mIGEgcmVwb3J0IHNlZXMgdGhlIHNhbWUgdGV4dC5cbmV4cG9ydCBjb25zdCBSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFOiBSZXBvcnRMb2NhbGVUYWcgPSAnZW4tVVMnO1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWTogUmVwb3J0Q3VycmVuY3lDb2RlID0gJ1VTRCc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUk1BVF9DT05URVhUOiBSZWFkb25seTxSZXBvcnRGb3JtYXRDb250ZXh0PiA9IE9iamVjdC5mcmVlemUoe1xuICBsb2NhbGU6IFJFUE9SVF9GQUxMQkFDS19MT0NBTEUsXG4gIGN1cnJlbmN5OiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1ksXG4gIHJhdGlvUGVyY2VudDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBDVVJSRU5DWV9QQVRURVJOID0gL15bQS1aXXszfSQvO1xuXG5cbi8vIFRoZSBzZXJ2ZXIncyByZXNvbHZlZCBsb2NhbGUgYXMgb25lIHRoaXMgYnJvd3NlciBjYW4gZm9ybWF0IGluLiBBIG1hbGZvcm1lZFxuLy8gdGFnICgnZW5fQ0EnKSBtYWtlcyBzdXBwb3J0ZWRMb2NhbGVzT2YgdGhyb3csIGFuZCBvbmUgSW50bCBoYXMgbm8gZGF0YSBmb3Jcbi8vICgneHgtWVknKSBjb21lcyBiYWNrIGVtcHR5OyBib3RoIHJlYWQgdGhlIGZhbGxiYWNrLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZXBvcnRMb2NhbGUodGFnOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0TG9jYWxlVGFnIHtcbiAgaWYgKCF0YWcpIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEludGwuTnVtYmVyRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihbdGFnXSlbMF0gPz8gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFJFUE9SVF9GQUxMQkFDS19MT0NBTEU7XG4gIH1cbn1cblxuLy8gVGhlIHNlcnZlcidzIHJlc29sdmVkIGN1cnJlbmN5IGFzIG9uZSBJbnRsIGNhbiBsYWJlbC4gVGhlIHNlcnZlciBkZWNpZGVzXG4vLyB3aGljaCBjb2RlcyBuYW1lIG1vbmV5OyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYSBjb2RlIEludGwgY2Fubm90IHRha2UgYXRcbi8vIGFsbC4gSXQgaXMgbmV2ZXIgY2hlY2tlZCBhZ2FpbnN0IHRoZSBydW50aW1lJ3Mgb3duIGN1cnJlbmN5IGxpc3QsIHdoaWNoXG4vLyBkaWZmZXJzIGJldHdlZW4gYnJvd3NlcnMgYW5kIGxlYXZlcyBvdXQgY29kZXMgdGhlIHNlcnZlciBvZmZlcnMgKFZFRiwgTVJPKSxcbi8vIHNvIGV2ZXJ5IHZpZXdlciBsYWJlbHMgYSByZXBvcnQncyBtb25leSB0aGUgc2FtZSB3YXkuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnRDdXJyZW5jeUNvZGUge1xuICBpZiAoIWNvZGUgfHwgIUNVUlJFTkNZX1BBVFRFUk4udGVzdChjb2RlKSkge1xuICAgIHJldHVybiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1k7XG4gIH1cblxuICB0cnkge1xuICAgIG51bWJlckZvcm1hdChSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogY29kZSB9KTtcblxuICAgIHJldHVybiBjb2RlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0NVUlJFTkNZO1xuICB9XG59XG5cbi8vIFRoZSBvbmUgcGxhY2UgYSByZXBvcnQncyBmb3JtYXQgY29udGV4dCBpcyBidWlsdDogdGhlIHNlcnZlcidzIGVmZmVjdGl2ZVxuLy8gbG9jYWxlIGFuZCBjdXJyZW5jeSAoYWJzZW50IG9uIGFuIG9sZGVyIHNlcnZlciwgd2hpY2ggdGhlbiByZWFkcyBlbi1VUy9VU0QpXG4vLyBhbmQgd2hldGhlciBpdHMgcGVyY2VudCBtZWFzdXJlcyBhcnJpdmUgYXMgMC0xIHJhdGlvcy5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm9ybWF0Q29udGV4dChcbiAgcmVwb3J0OiBQaWNrPFJlcG9ydCwgJ2VmZmVjdGl2ZUxvY2FsZScgfCAnZWZmZWN0aXZlQ3VycmVuY3knIHwgJ3BlcmNlbnRGb3JtYXQnPixcbik6IFJlcG9ydEZvcm1hdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGxvY2FsZTogcmVzb2x2ZVJlcG9ydExvY2FsZShyZXBvcnQuZWZmZWN0aXZlTG9jYWxlKSxcbiAgICBjdXJyZW5jeTogcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSksXG4gICAgcmF0aW9QZXJjZW50OiByZXBvcnQucGVyY2VudEZvcm1hdCA9PT0gJ3JhdGlvJyxcbiAgfTtcbn1cblxuXG4vLyBCdWlsZGluZyBhbiBJbnRsIGZvcm1hdHRlciBpcyBmYXIgc2xvd2VyIHRoYW4gdXNpbmcgb25lLCBhbmQgYSBjaGFydCBmb3JtYXRzXG4vLyBldmVyeSB0aWNrIGFuZCB0b29sdGlwIHZhbHVlLCBzbyBlYWNoIGRpc3RpbmN0IGxvY2FsZSArIG9wdGlvbnMgKCsgem9uZSkgaXNcbi8vIGJ1aWx0IG9uY2UgYW5kIHJldXNlZC5cbmNvbnN0IE5VTUJFUl9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuTnVtYmVyRm9ybWF0PigpO1xuY29uc3QgREFURV9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuRGF0ZVRpbWVGb3JtYXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGb3JtYXQobG9jYWxlOiBzdHJpbmcsIG9wdGlvbnM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyk6IEludGwuTnVtYmVyRm9ybWF0IHtcbiAgY29uc3Qga2V5ID0gYCR7bG9jYWxlfXwke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWA7XG4gIGxldCBmb3JtYXR0ZXIgPSBOVU1CRVJfRk9STUFUUy5nZXQoa2V5KTtcblxuICBpZiAoIWZvcm1hdHRlcikge1xuICAgIGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIG9wdGlvbnMpO1xuICAgIE5VTUJFUl9GT1JNQVRTLnNldChrZXksIGZvcm1hdHRlcik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVyO1xufVxuXG4vLyBObyB6b25lIGZvcm1hdHMgaW4gdGhlIGJyb3dzZXIncyBvd24gem9uZSwgd2hpY2ggaXMgcmlnaHQgZm9yIGEgY2FsZW5kYXIgZGF5XG4vLyBwYXJzZWQgYXMgbG9jYWwgbWlkbmlnaHQ6IHRoZSBkYXkgcHJpbnRlZCBpcyB0aGUgZGF5IHN0b3JlZC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRm9ybWF0KFxuICBsb2NhbGU6IHN0cmluZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gIHRpbWVab25lPzogc3RyaW5nLFxuKTogSW50bC5EYXRlVGltZUZvcm1hdCB7XG4gIGNvbnN0IGtleSA9IGAke2xvY2FsZX18JHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX18JHt0aW1lWm9uZSA/PyAnJ31gO1xuICBsZXQgZm9ybWF0dGVyID0gREFURV9GT1JNQVRTLmdldChrZXkpO1xuXG4gIGlmICghZm9ybWF0dGVyKSB7XG4gICAgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IC4uLm9wdGlvbnMsIHRpbWVab25lIH0pO1xuICAgIERBVEVfRk9STUFUUy5zZXQoa2V5LCBmb3JtYXR0ZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlcjtcbn1cblxuXG4vLyBOdW1iZXIgZm9ybWF0dGluZzogdGhlIG9uZSBlbmdpbmUgYmVoaW5kIGV2ZXJ5IG51bWVyaWMgc2xvdCAoYSBjaGFydFxuLy8gbWVhc3VyZSwgYSBLUEkgbWVhc3VyZSwgYSBsaXN0IGNvbHVtbiwgYSBjcm9zcy10YWIncyBjZWxscyksIHNvIGEgZm9ybWF0XG4vLyBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiBzY3JlZW4sIGluIHRoZSBQREYgYW5kIGluIFBvd2VyUG9pbnQuIFRoZSBkYXRhIHN0YXlzXG4vLyByYXc7IG9ubHkgd2hhdCBpcyBzaG93biBjaGFuZ2VzLiBUaGUgcnVsZXM6XG4vLyAtIEVtcHR5OiBudWxsLCB1bmRlZmluZWQsICcnLCAnLScgYW5kIGEgbm9uLWZpbml0ZSBudW1iZXIgcHJpbnQgdGhlIGNhbGxlcidzXG4vLyAgIGBlbXB0eWAgKCfigJQnIHVubGVzcyBpdCBuYW1lcyBhbm90aGVyKS5cbi8vIC0gTnVtZXJpYzogYSBmaW5pdGUgbnVtYmVyLCBvciBhIHN0cmluZyB0aGF0IHNwZWxscyBvbmUgcGxhaW5seSAoJzEyMzQuNTAnLFxuLy8gICAnLTNlMicpLiBBbnl0aGluZyBlbHNlICgnJDEsMjM0JywgYW4gaWQgd2l0aCBsZXR0ZXJzLCAnICcpIHByaW50cyBhcyBpdFxuLy8gICBjYW1lLCBzaW5jZSBhIGNvbHVtbiB0aGUgU1FMIGFscmVhZHkgZm9ybWF0dGVkIGlzIHRleHQuXG4vLyAtIFN0eWxlczogbnVtYmVyIGlzIGEgcGxhaW4gZGVjaW1hbDsgY3VycmVuY3kgaXMgdGhlIHJlcG9ydCdzIGN1cnJlbmN5XG4vLyAgIHdyaXR0ZW4gaW4gaXRzIGxvY2FsZSB3aXRoIGl0cyBzeW1ib2wgKFVTRCByZWFkcyAnJDEsMjM1JyBpbiBlbi1VUyBhbmRcbi8vICAgJ1VTJDEsMjM1JyBpbiBlbi1DQTsgRVVSIHJlYWRzICcxIDIzNSDigqwnIGluIGZyLUZSKTsgcGVyY2VudCB0YWtlcyBhIDAtMVxuLy8gICByYXRpbyAoMC4zIHJlYWRzIDMwJSksIG9yLCBmcm9tIGFuIG9sZGVyIHNlcnZlciB0aGF0IHNlbmRzIHBlcmNlbnQgdmFsdWVzXG4vLyAgIGFscmVhZHkgeDEwMCwgYSBkZWNpbWFsIHdpdGggYSAlIHNpZ24uIFByZWNpc2lvbiBvciB1bml0cyB3aXRob3V0IGEgZm9ybWF0XG4vLyAgIG1lYW4gbnVtYmVyLlxuLy8gLSBEZWNpbWFsczogYSBwcmVjaXNpb24gcGlucyBib3RoIHRoZSBtaW5pbXVtIGFuZCB0aGUgbWF4aW11bSwgc28gYSBjb2x1bW5cbi8vICAgb2YgcmF0ZXMgbGluZXMgdXAuIFdpdGhvdXQgb25lOiBhdCBtb3N0IG9uZSBmb3IgYSBwZXJjZW50IGFuZCBmb3IgYW5cbi8vICAgYWJicmV2aWF0ZWQgdmFsdWUgKDEuMkspLCB3aG9sZSB1bml0cyBmb3IgY3VycmVuY3ksIHRoZSBsb2NhbGUncyBkZWZhdWx0XG4vLyAgIGZvciBhIG51bWJlci5cbi8vIC0gVW5pdHM6IHRob3VzYW5kcyBhbmQgbWlsbGlvbnMgZGl2aWRlIGFuZCBhZGQgYSBLIG9yIE0gYWZ0ZXIgdGhlIGRpZ2l0c1xuLy8gICAoJyQxLjJLJywgJzEsMksgJCcpOyBhdXRvIHBpY2tzIHBlciB2YWx1ZSBieSBzaXplLCBhbmQgYSB2YWx1ZSB0aGF0IHdvdWxkXG4vLyAgIHJvdW5kIHRvIDEwMDBLIHJlYWRzIDFNLiBVbml0cyBuZXZlciBhcHBseSB0byBhIHBlcmNlbnQuXG4vLyAtIE5lZ2F0aXZlcyBrZWVwIHRoZSBsb2NhbGUncyBsZWFkaW5nIG1pbnVzLiBBIG5lZ2F0aXZlIHRoYXQgcm91bmRzIHRvIHplcm9cbi8vICAgcHJpbnRzIGFzIHplcm8sIG5ldmVyICctMCcuXG4vLyAtIFJvdW5kaW5nIGlzIEludGwncywgb24gdGhlIGRpZ2l0cyBzaG93bi4gRXZlcnkgdmFsdWUgaXMgd3JpdHRlbiBpbiB0aGVcbi8vICAgY29udGV4dCdzIGxvY2FsZSwgbmV2ZXIgdGhlIGJyb3dzZXIncy5cblxuLy8gVGhlIG1vc3QgZGVjaW1hbHMgYSBwcmVjaXNpb24gcGluczogdGhlIHNlcnZlcidzIHNjaGVtYSBib3VuZC5cbmNvbnN0IE1BWF9QUkVDSVNJT04gPSA2O1xuLy8gQXQgbW9zdCBvbmUgZGVjaW1hbCBmb3IgYSBwZXJjZW50LCBhbmQgZm9yIGFuIGFiYnJldmlhdGVkIHZhbHVlICgxLjJLKS5cbmNvbnN0IFBFUkNFTlRfREVDSU1BTFMgPSAxO1xuY29uc3QgU0NBTEVEX0RFQ0lNQUxTID0gMTtcbi8vIE1vbmV5IHNob3dzIHdob2xlIHVuaXRzIHVubGVzcyBhIHByZWNpc2lvbiBhc2tzIGZvciBkZWNpbWFscy5cbmNvbnN0IENVUlJFTkNZX0RFQ0lNQUxTID0gMDtcbi8vIEEgY3VycmVuY3kgYXhpcyB3aG9zZSB0aWNrcyBuZWVkIGRlY2ltYWxzIHNob3dzIGNlbnRzLCBub3QgdGVudGhzLlxuY29uc3QgQ1VSUkVOQ1lfQVhJU19ERUNJTUFMUyA9IDI7XG4vLyBXaGF0IGEgbWlzc2luZyB2YWx1ZSBwcmludHMgdW5sZXNzIHRoZSBjYWxsZXIgbmFtZXMgaXRzIG93bi5cbmNvbnN0IEVNUFRZX1ZBTFVFID0gJ+KAlCc7XG4vLyBUaGUgdGljayBjb3VudCBhIHZhbHVlIGF4aXMgYWltcyBmb3IsIGFzIEVDaGFydHMnIHNwbGl0TnVtYmVyIGRlZmF1bHQuXG5jb25zdCBBWElTX1RJQ0tTID0gNTtcblxuLy8gQSBjaGFuZ2UncyBzaWduOiBhIHBsdXMgb24gYSBwb3NpdGl2ZSB2YWx1ZSwgbm90aGluZyBvbiB6ZXJvLlxuY29uc3QgU0lHTkVEOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7IHNpZ25EaXNwbGF5OiAnZXhjZXB0WmVybycgfTtcblxuY29uc3QgTlVNRVJJQ19QQVRURVJOID0gL15cXHMqWy0rXT8oXFxkK1xcLj9cXGQqfFxcLlxcZCspKFtlRV1bLStdP1xcZCspP1xccyokLztcbi8vIFRoZSBmb3JtYXRUb1BhcnRzIHR5cGVzIHRoYXQgY2FycnkgYSBudW1iZXIncyBkaWdpdHMgYW5kIHNlcGFyYXRvcnMuXG5jb25zdCBOVU1CRVJfUEFSVFMgPSBuZXcgU2V0PEludGwuTnVtYmVyRm9ybWF0UGFydFR5cGVzPihbJ2ludGVnZXInLCAnZ3JvdXAnLCAnZGVjaW1hbCcsICdmcmFjdGlvbiddKTtcbmNvbnN0IERJR0lUX1BBUlRTID0gbmV3IFNldDxJbnRsLk51bWJlckZvcm1hdFBhcnRUeXBlcz4oWydpbnRlZ2VyJywgJ2ZyYWN0aW9uJ10pO1xuXG4vLyBBIG51bWVyaWMgZm9ybWF0J3MgdW5pdHMgb25jZSBkZWNpZGVkOiBhdXRvIGlzIHJlc29sdmVkIHRvIG9uZSBvZiB0aGVzZS5cbmV4cG9ydCB0eXBlIFJlc29sdmVkVW5pdHMgPSBSZXBvcnROdW1iZXJVbml0cy5Ob25lIHwgUmVwb3J0TnVtYmVyVW5pdHMuVGhvdXNhbmRzIHwgUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnM7XG5cbmludGVyZmFjZSBVbml0U2NhbGUge1xuICBkaXZpc29yOiBudW1iZXI7XG4gIHN1ZmZpeDogc3RyaW5nO1xuICAvLyBUaGUgUG93ZXJQb2ludC9FeGNlbCBzY2FsaW5nIGNvbW1hczogZWFjaCBvbmUgZGl2aWRlcyBieSAxLDAwMC5cbiAgY29tbWFzOiBzdHJpbmc7XG59XG5cbmNvbnN0IFVOSVRfU0NBTEVTID0gbmV3IE1hcDxSZXNvbHZlZFVuaXRzLCBVbml0U2NhbGU+KFtcbiAgW1JlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcywgeyBkaXZpc29yOiAxZTMsIHN1ZmZpeDogJ0snLCBjb21tYXM6ICcsJyB9XSxcbiAgW1JlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zLCB7IGRpdmlzb3I6IDFlNiwgc3VmZml4OiAnTScsIGNvbW1hczogJywsJyB9XSxcbl0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE51bWJlck9wdGlvbnMge1xuICAvLyBXaGF0IGFuIGVtcHR5IHZhbHVlIHByaW50czogJ+KAlCcgZm9yIGEgS1BJIG9yIGEgdG9vbHRpcCwgJycgZm9yIGEgY2VsbC5cbiAgZW1wdHk/OiBzdHJpbmc7XG4gIC8vIFVuaXRzIGFscmVhZHkgZGVjaWRlZCBmb3IgdGhlIHdob2xlIGNoYXJ0LCBpbiBwbGFjZSBvZiB0aGUgc3BlYydzIG93bi5cbiAgdW5pdHM/OiBSZXNvbHZlZFVuaXRzO1xuICAvLyBEZWNpbWFscyBhbHJlYWR5IGRlY2lkZWQgZm9yIHRoZSB3aG9sZSBjaGFydCwgcGlubmVkIGFzIG1pbiBhbmQgbWF4LiBudWxsXG4gIC8vIGxlYXZlcyB0aGUgc3BlYydzIG93bi5cbiAgZGVjaW1hbHM/OiBudW1iZXIgfCBudWxsO1xuICAvLyBXcml0ZXMgYSBwbHVzIGJlZm9yZSBhIHBvc2l0aXZlIHZhbHVlLCBhcyBhIGNoYW5nZSByZWFkcyAoJysxMiUnKS4gWmVybyxcbiAgLy8gYW5kIGEgdmFsdWUgd2hvc2Ugc2hvd24gZGlnaXRzIGFyZSBhbGwgemVybywgc3RheXMgdW5zaWduZWQuXG4gIHNpZ25lZD86IGJvb2xlYW47XG59XG5cbi8vIEhvdyBhIGNoYXJ0J3MgdmFsdWUgYXhpcyB3cml0ZXMgaXRzIHRpY2tzLCBkZWNpZGVkIG9uY2UgcGVyIGNoYXJ0LlxuZXhwb3J0IGludGVyZmFjZSBDaGFydE51bWJlckZvcm1hdCB7XG4gIHVuaXRzOiBSZXNvbHZlZFVuaXRzO1xuICAvLyBQaW5uZWQgZGVjaW1hbHMsIG9yIG51bGwgZm9yIGEgcGxhaW4gbnVtYmVyIHdob3NlIHRpY2tzIGtlZXAgdGhlaXIgb3duLlxuICBkZWNpbWFsczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLy8gVGhlIHZhbHVlIGFzIGEgZmluaXRlIG51bWJlciB3aGVuIGl0IGlzIG9uZSBvciBwbGFpbmx5IHNwZWxscyBvbmUsIGVsc2Vcbi8vIG51bGwuXG5leHBvcnQgZnVuY3Rpb24gdG9GaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICFOVU1FUklDX1BBVFRFUk4udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIodmFsdWUpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykgPyBudW1lcmljIDogbnVsbDtcbn1cblxuLy8gV2hldGhlciBhIHNsb3QgYXNrcyB0byBiZSBmb3JtYXR0ZWQgYXQgYWxsLiBBIHNsb3Qgd2l0aG91dCB0aGVzZSBrZXlzLCBvciBhXG4vLyBsaXN0IGNvbHVtbiB3aG9zZSBmb3JtYXQgaXMgZGF0ZSwga2VlcHMgaXRzIG93biByZW5kZXJpbmcuIFVuaXRzIG5vbmUgaXMgdGhlXG4vLyBzYW1lIGFzIG5vIHVuaXRzIGtleSwgYXMgaXQgaXMgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBmdW5jdGlvbiBoYXNOdW1iZXJGb3JtYXQoc3BlYz86IE51bWJlckZvcm1hdFNwZWMgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYyB8fCBzcGVjLmZvcm1hdCA9PT0gUmVwb3J0TGlzdENvbHVtbkZvcm1hdC5EYXRlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlRm9ybWF0KHNwZWMpICE9PSBudWxsXG4gICAgfHwgKHNwZWMucHJlY2lzaW9uID8/IG51bGwpICE9PSBudWxsXG4gICAgfHwgKChzcGVjLnVuaXRzID8/IFJlcG9ydE51bWJlclVuaXRzLk5vbmUpICE9PSBSZXBvcnROdW1iZXJVbml0cy5Ob25lKTtcbn1cblxuLy8gVGhlIHVuaXRzIGEgdmFsdWUgaXMgd3JpdHRlbiBpbi4gYXV0byBkZWNpZGVzIGJ5IHRoZSBtYWduaXR1ZGU6IGEgbWlsbGlvblxuLy8gYW5kIHVwIHJlYWRzIE0sIGEgdGhvdXNhbmQgYW5kIHVwIEssIHVubGVzcyB0aGUgdmFsdWUgd291bGQgdGhlbiByb3VuZCB0b1xuLy8gMTAwMEsgYXQgdGhlc2UgZGVjaW1hbHMsIHdoaWNoIHJlYWRzIDFNIGluc3RlYWQuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVuaXRzKFxuICB1bml0czogUmVwb3J0TnVtYmVyVW5pdHMgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBtYWduaXR1ZGU6IG51bWJlcixcbiAgZGVjaW1hbHM6IG51bWJlcixcbik6IFJlc29sdmVkVW5pdHMge1xuICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHM6XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9uczpcbiAgICAgIHJldHVybiB1bml0cztcbiAgICBjYXNlIFJlcG9ydE51bWJlclVuaXRzLkF1dG86XG4gICAgICByZXR1cm4gYXV0b1VuaXRzKE1hdGguYWJzKG1hZ25pdHVkZSksIGRlY2ltYWxzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJlcG9ydE51bWJlclVuaXRzLk5vbmU7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0b1VuaXRzKG1hZ25pdHVkZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogUmVzb2x2ZWRVbml0cyB7XG4gIGlmIChtYWduaXR1ZGUgPj0gMWU2KSB7XG4gICAgcmV0dXJuIFJlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zO1xuICB9XG5cbiAgaWYgKG1hZ25pdHVkZSA8IDFlMykge1xuICAgIHJldHVybiBSZXBvcnROdW1iZXJVbml0cy5Ob25lO1xuICB9XG5cbiAgcmV0dXJuIHJvdW5kVG8obWFnbml0dWRlIC8gMWUzLCBkZWNpbWFscykgPj0gMTAwMFxuICAgID8gUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnNcbiAgICA6IFJlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcztcbn1cblxuLy8gVGhlIHZhbHVlIHJvdW5kZWQgYXMgSW50bCByb3VuZHMgaXQgZm9yIGRpc3BsYXksIHNvIHRoZSBLLXRvLU0gcHJvbW90aW9uXG4vLyBhZ3JlZXMgd2l0aCB0aGUgZGlnaXRzIGFjdHVhbGx5IHNob3duLlxuZnVuY3Rpb24gcm91bmRUbyh2YWx1ZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZGlnaXRzID0gY2xhbXBEZWNpbWFscyhkZWNpbWFscykgPz8gMDtcblxuICAvLyBBIGZpeGVkIGxvY2FsZSBvbmx5IHNvIE51bWJlcigpIGNhbiBwYXJzZSB0aGUgcm91bmRlZCBkaWdpdHMgYmFjay5cbiAgcmV0dXJuIE51bWJlcihudW1iZXJGb3JtYXQoUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRSwge1xuICAgIHVzZUdyb3VwaW5nOiBmYWxzZSxcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkaWdpdHMsXG4gIH0pLmZvcm1hdCh2YWx1ZSkpO1xufVxuXG4vLyBPbmUgdmFsdWUsIHdyaXR0ZW4gYnkgdGhlIHJ1bGVzIGFib3ZlLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBvcHRpb25zOiBGb3JtYXROdW1iZXJPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgIHJldHVybiBvcHRpb25zLmVtcHR5ID8/IEVNUFRZX1ZBTFVFO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IHRvRmluaXRlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlKHNwZWMpO1xuICBjb25zdCBwcmVjaXNpb24gPSBjbGFtcERlY2ltYWxzKHNwZWM/LnByZWNpc2lvbik7XG4gIGNvbnN0IHVuaXRzID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnRcbiAgICA/IFJlcG9ydE51bWJlclVuaXRzLk5vbmVcbiAgICA6IG9wdGlvbnMudW5pdHMgPz8gcmVzb2x2ZVVuaXRzKHNwZWM/LnVuaXRzLCBudW1lcmljLCBwcmVjaXNpb24gPz8gU0NBTEVEX0RFQ0lNQUxTKTtcbiAgY29uc3Qgc2NhbGUgPSBVTklUX1NDQUxFUy5nZXQodW5pdHMpO1xuICBjb25zdCBkZWNpbWFscyA9IGNsYW1wRGVjaW1hbHMob3B0aW9ucy5kZWNpbWFscykgPz8gcHJlY2lzaW9uO1xuICBjb25zdCBmb3JtYXR0ZXIgPSBudW1iZXJGb3JtYXQoY29udGV4dC5sb2NhbGUsIHtcbiAgICAuLi5zdHlsZU9wdGlvbnMoc3R5bGUsIGNvbnRleHQsIGRlY2ltYWxzLCAhIXNjYWxlKSxcbiAgICAuLi4ob3B0aW9ucy5zaWduZWQgPyBTSUdORUQgOiB7fSksXG4gIH0pO1xuICBjb25zdCB0ZXh0ID0gd3JpdGVOdW1iZXIoZm9ybWF0dGVyLCAobnVtZXJpYyA9PT0gMCA/IDAgOiBudW1lcmljKSAvIChzY2FsZT8uZGl2aXNvciA/PyAxKSwgc2NhbGU/LnN1ZmZpeCk7XG5cbiAgcmV0dXJuIHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50ICYmICFjb250ZXh0LnJhdGlvUGVyY2VudCA/IGAke3RleHR9JWAgOiB0ZXh0O1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgIHx8IHZhbHVlID09PSAnJ1xuICAgIHx8IHZhbHVlID09PSAnLSdcbiAgICB8fCAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG59XG5cbi8vIFRoZSB2YWx1ZSBmb3JtYXQgYSBzbG90IG5hbWVzLCBvciBudWxsIHdoZW4gaXQgbmFtZXMgbm9uZSAob3Igb25seSBkYXRlKS5cbmZ1bmN0aW9uIHZhbHVlRm9ybWF0KHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0VmFsdWVGb3JtYXQgfCBudWxsIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUmVwb3J0VmFsdWVGb3JtYXQpLmZpbmQoKGZvcm1hdCkgPT4gZm9ybWF0ID09PSBzcGVjPy5mb3JtYXQpID8/IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZShzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFJlcG9ydFZhbHVlRm9ybWF0IHtcbiAgcmV0dXJuIHZhbHVlRm9ybWF0KHNwZWMpID8/IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlcjtcbn1cblxuLy8gQSB1c2FibGUgZGVjaW1hbCBjb3VudCwgb3IgbnVsbC4gQSBzdG9yZWQgdmFsdWUgb3V0c2lkZSB0aGUgc2NoZW1hJ3MgYm91bmRzXG4vLyBpcyBicm91Z2h0IGluc2lkZSB0aGVtIHJhdGhlciB0aGFuIHRocm93biBvbiBieSBJbnRsLlxuZnVuY3Rpb24gY2xhbXBEZWNpbWFscyhkZWNpbWFsczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIGRlY2ltYWxzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZGVjaW1hbHMpXG4gICAgPyBNYXRoLm1pbihNQVhfUFJFQ0lTSU9OLCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGRlY2ltYWxzKSkpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBzdHlsZU9wdGlvbnMoXG4gIHN0eWxlOiBSZXBvcnRWYWx1ZUZvcm1hdCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgZGVjaW1hbHM6IG51bWJlciB8IG51bGwsXG4gIHNjYWxlZDogYm9vbGVhbixcbik6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIGNvbnN0IGZyYWN0aW9uRGlnaXRzID0gZnJhY3Rpb25EaWdpdE9wdGlvbnMoZGVjaW1hbHMsIGRlZmF1bHREZWNpbWFscyhzdHlsZSwgc2NhbGVkKSk7XG5cbiAgc3dpdGNoIChzdHlsZSkge1xuICAgIGNhc2UgUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3k6XG4gICAgICByZXR1cm4geyAuLi5jdXJyZW5jeU9wdGlvbnMoY29udGV4dC5jdXJyZW5jeSksIC4uLmZyYWN0aW9uRGlnaXRzIH07XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50OlxuICAgICAgcmV0dXJuIGNvbnRleHQucmF0aW9QZXJjZW50ID8geyBzdHlsZTogJ3BlcmNlbnQnLCAuLi5mcmFjdGlvbkRpZ2l0cyB9IDogZnJhY3Rpb25EaWdpdHM7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmcmFjdGlvbkRpZ2l0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeU9wdGlvbnMoY3VycmVuY3k6IFJlcG9ydEN1cnJlbmN5Q29kZSk6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIHJldHVybiB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeSwgY3VycmVuY3lEaXNwbGF5OiAnc3ltYm9sJyB9O1xufVxuXG4vLyBUaGUgbW9zdCBkZWNpbWFscyBhIHN0eWxlIHNob3dzIHdoZW4gbm90aGluZyBwaW5zIHRoZW07IG51bGwgbGVhdmVzIEludGwnc1xuLy8gb3duIGRlZmF1bHQuXG5mdW5jdGlvbiBkZWZhdWx0RGVjaW1hbHMoc3R5bGU6IFJlcG9ydFZhbHVlRm9ybWF0LCBzY2FsZWQ6IGJvb2xlYW4pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHNjYWxlZCkge1xuICAgIHJldHVybiBTQ0FMRURfREVDSU1BTFM7XG4gIH1cblxuICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50OlxuICAgICAgcmV0dXJuIFBFUkNFTlRfREVDSU1BTFM7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeTpcbiAgICAgIHJldHVybiBDVVJSRU5DWV9ERUNJTUFMUztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gUGlubmVkIGRlY2ltYWxzIHNldCBib3RoIGJvdW5kcy4gT3RoZXJ3aXNlIGEgbWF4aW11bSBhbHNvIHNldHMgdGhlIG1pbmltdW1cbi8vIHRvIHplcm8sIHNvIG5vIGVuZ2luZSB0aHJvd3Mgb24gYSBtYXhpbXVtIGJlbG93IGEgY3VycmVuY3kncyBvd24gbWluaW11bS5cbmZ1bmN0aW9uIGZyYWN0aW9uRGlnaXRPcHRpb25zKHBpbm5lZDogbnVtYmVyIHwgbnVsbCwgbWF4aW11bTogbnVtYmVyIHwgbnVsbCk6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIGlmIChwaW5uZWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4geyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IHBpbm5lZCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBwaW5uZWQgfTtcbiAgfVxuXG4gIHJldHVybiBtYXhpbXVtID09PSBudWxsID8ge30gOiB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtIH07XG59XG5cbi8vIFRoZSBmb3JtYXR0ZWQgdmFsdWUsIHdpdGggdGhlIHVuaXRzIGxldHRlciBhZnRlciBpdHMgZGlnaXRzLiBBIG5lZ2F0aXZlXG4vLyB3aG9zZSBzaG93biBkaWdpdHMgYXJlIGFsbCB6ZXJvIGlzIHdyaXR0ZW4gYXMgemVybywgc28gbm8gJy0wJyBhcHBlYXJzLlxuZnVuY3Rpb24gd3JpdGVOdW1iZXIoZm9ybWF0dGVyOiBJbnRsLk51bWJlckZvcm1hdCwgdmFsdWU6IG51bWJlciwgc3VmZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID49IDAgJiYgIXN1ZmZpeCkge1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHModmFsdWUpO1xuXG4gIGlmICh2YWx1ZSA8IDAgJiYgIWhhc05vblplcm9EaWdpdChmb3JtYXR0ZXIsIHBhcnRzKSkge1xuICAgIHJldHVybiB3cml0ZU51bWJlcihmb3JtYXR0ZXIsIDAsIHN1ZmZpeCk7XG4gIH1cblxuICBpZiAoIXN1ZmZpeCkge1xuICAgIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgbGFzdCA9IHBhcnRzLnJlZHVjZSgoZm91bmQsIHBhcnQsIGluZGV4KSA9PiBOVU1CRVJfUEFSVFMuaGFzKHBhcnQudHlwZSkgPyBpbmRleCA6IGZvdW5kLCAtMSk7XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5wYXJ0cy5zbGljZSgwLCBsYXN0ICsgMSkubWFwKChwYXJ0KSA9PiBwYXJ0LnZhbHVlKSxcbiAgICBzdWZmaXgsXG4gICAgLi4ucGFydHMuc2xpY2UobGFzdCArIDEpLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSksXG4gIF0uam9pbignJyk7XG59XG5cbi8vIENvbXBhcmVkIHdpdGggdGhlIGxvY2FsZSdzIG93biB6ZXJvLCBzbyBhIG51bWJlcmluZyBzeXN0ZW0gb3RoZXIgdGhhblxuLy8gMC05IGlzIHJlYWQgY29ycmVjdGx5LlxuZnVuY3Rpb24gaGFzTm9uWmVyb0RpZ2l0KGZvcm1hdHRlcjogSW50bC5OdW1iZXJGb3JtYXQsIHBhcnRzOiBJbnRsLk51bWJlckZvcm1hdFBhcnRbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB6ZXJvID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoMCkuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnaW50ZWdlcicpPy52YWx1ZSA/PyAnMCc7XG5cbiAgcmV0dXJuIHBhcnRzLnNvbWUoKHBhcnQpID0+IERJR0lUX1BBUlRTLmhhcyhwYXJ0LnR5cGUpXG4gICAgJiYgQXJyYXkuZnJvbShwYXJ0LnZhbHVlKS5zb21lKChjaGFyYWN0ZXIpID0+IGNoYXJhY3RlciAhPT0gemVybykpO1xufVxuXG5cbi8vIE91dHB1dCB2YWx1ZXM6IGEgY29sdW1uIHRoZSBzZXJ2ZXIgbWFya3MgaW4gQ29tcG9uZW50RGF0YS5vdXRwdXRzIChhXG4vLyBjb21wYXJlZCB2YWx1ZSwgYSByYW5rLCBhIHNoYXJlKSB3cml0dGVuIGJ5IHdoYXQgaXQgaXMuIFRoZSBkYXRhIHN0YXlzIHJhdztcbi8vIGV2ZXJ5IG51bWJlciBzdGlsbCBnb2VzIHRocm91Z2ggZm9ybWF0TnVtYmVyLiBUaGUgcnVsZXM6XG4vLyAtIFRoZSBmb3JtYXQ6IGEgc2xvdCdzIG93biBleHBsaWNpdCBmb3JtYXQgYWx3YXlzIHdpbnMuIE90aGVyd2lzZSBhIGN1cnJlbnQsXG4vLyAgIHByaW9yIG9yIGNoYW5nZSBjb2x1bW4gdGFrZXMgaXRzIHNvdXJjZSBtZWFzdXJlJ3MgZm9ybWF0OyBhIHBlcmNlbnQgY2hhbmdlXG4vLyAgIGlzIGEgcGVyY2VudDsgYSByYW5rIGlzIGEgd2hvbGUgbnVtYmVyOyBhIHNoYXJlIGlzIGEgcGVyY2VudCB0byAxIGRlY2ltYWwuXG4vLyAgIEFuIG93biBwcmVjaXNpb24gb3IgdW5pdHMgc3RpbGwgYXBwbGllcyBvdmVyIHRob3NlIGRlZmF1bHRzLlxuLy8gLSBTaWduczogYSBjaGFuZ2UgYW5kIGEgcGVyY2VudCBjaGFuZ2UgYXJlIHNpZ25lZCAoJys1NzknLCAnLTMxLjElJyksXG4vLyAgIHVubGVzcyB0aGUgY2FsbGVyJ3MgYHNpZ25lZGAgc2F5cyBvdGhlcndpc2UuXG4vLyAtIFBvaW50czogYSBjaGFuZ2Ugb2YgYSBwZXJjZW50LWZvcm1hdCB2YWx1ZSwgYW5kIGFueSBzaGFyZSBjaGFuZ2UsIGlzIGFcbi8vICAgZGlmZmVyZW5jZSBvZiB0d28gcmF0ZXMsIHNvIGl0IHByaW50cyBpbiBwZXJjZW50YWdlIHBvaW50cywgc2lnbmVkIGFuZCB0b1xuLy8gICAxIGRlY2ltYWwgdW5sZXNzIGEgcHJlY2lzaW9uIHBpbnMgb3RoZXJzOiAwLjEgcmVhZHMgJysxMC4wIHBwJyAoJysxMC4wJ1xuLy8gICB3aGVuIHRoZSBjYWxsZXIncyBgcG9pbnRzVW5pdGAgaXMgZmFsc2UpLlxuLy8gLSBNaXNzaW5nOiBhIG1pc3NpbmcgcHJpb3IsIG9yIGEgY2hhbmdlIG9yIHBlcmNlbnQgY2hhbmdlIGxlZnQgZW1wdHkgYnlcbi8vICAgb25lLCBwcmludHMgJ+KAlCcgdGl0bGVkIHdpdGggdGhlIGZsb29yICgnTm8gYmFzZWxpbmU6IG5vIGRhdGEgYmVmb3JlXG4vLyAgIE1hciAzLCAyMDI2JyksIG9yIGZvciBhIHJhbmsgb3IgYSBzaGFyZSB3aXRoIHRoZSBwZXJpb2QgdGhlIHJvdyB3YXNcbi8vICAgYWJzZW50IGZyb20gKCdObyByYW5rIGluIHRoZSBwcmlvciBwZXJpb2QnKTsgYSBwZXJjZW50IGNoYW5nZSBvdmVyIGEgcHJpb3Igb2YgMCBwcmludHMgJ24vYScgdGl0bGVkXG4vLyAgICdQcmlvciB3YXMgMCcuIEFueSBvdGhlciBtaXNzaW5nIHZhbHVlIHByaW50cyAn4oCUJyAob3IgdGhlIGNhbGxlcidzIGVtcHR5KS5cbi8vIC0gUmFuayBjaGFuZ2U6IHByaW9yIG1pbnVzIGN1cnJlbnQsIHNvIGEgcmlzZSBpcyBwb3NpdGl2ZTogJ+KWsiAyJywgJ+KWvCAxJyxcbi8vICAgJ+KAkycgZm9yIG5vbmUsIGFuZCAnbmV3JyBmb3IgYW4gZW1wdHkgY2hhbmdlIHdob3NlIHByaW9yIHJhbmsgaXMgbWlzc2luZ1xuLy8gICBvciBub3QgcGFzc2VkIChhIHJvdyBhbHdheXMgaGFzIGEgY3VycmVudCByYW5rLCBzbyBvbmx5IHRoZSBwcmlvciBsYWNrcykuXG4vLyBBIHBlcmNlbnQgY2hhbmdlIGFuZCBhIHNoYXJlIGFyZSAwLTEgZnJhY3Rpb25zIHdoYXRldmVyIHRoZSByZXBvcnQnc1xuLy8gcGVyY2VudEZvcm1hdDogdGhlIHNlcnZlciBjb21wdXRlcyB0aGVtLCBuZXZlciBhIHN0b3JlZCB2YWx1ZS5cblxuLy8gQSBtaXNzaW5nIGNvbXBhcmlzb24gdmFsdWUgcHJpbnRzIEVNUFRZX1ZBTFVFIHdoYXRldmVyIHRoZSBjYWxsZXIncyBlbXB0eS5cbmNvbnN0IE5PVF9BUFBMSUNBQkxFX1ZBTFVFID0gJ24vYSc7XG5jb25zdCBORVdfUkFOS19WQUxVRSA9ICduZXcnO1xuY29uc3QgUkFOS19VTkNIQU5HRURfVkFMVUUgPSAn4oCTJztcbmNvbnN0IFJBTktfVVBfTUFSSyA9ICfilrInO1xuY29uc3QgUkFOS19ET1dOX01BUksgPSAn4pa8JztcbmNvbnN0IFBPSU5UU19TVUZGSVggPSAncHAnO1xuY29uc3QgTk9fUFJJT1JfUkFOS19USVRMRSA9ICdObyByYW5rIGluIHRoZSBwcmlvciBwZXJpb2QnO1xuY29uc3QgTk9fUFJJT1JfU0hBUkVfVElUTEUgPSAnTm8gc2hhcmUgaW4gdGhlIHByaW9yIHBlcmlvZCc7XG4vLyBQZXJjZW50YWdlIHBvaW50cyBhbmQgYSBzaGFyZSBhcmUgd3JpdHRlbiB0byBvbmUgZGVjaW1hbCB1bmxlc3MgcGlubmVkLlxuY29uc3QgUE9JTlRTX0RFQ0lNQUxTID0gMTtcbmNvbnN0IFNIQVJFX0RFQ0lNQUxTID0gMTtcblxuY29uc3QgUkFOS19ERUZBVUxUX1NQRUM6IFJlYWRvbmx5PE51bWJlckZvcm1hdFNwZWM+ID0gT2JqZWN0LmZyZWV6ZSh7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLCBwcmVjaXNpb246IDAgfSk7XG5jb25zdCBTSEFSRV9ERUZBVUxUX1NQRUM6IFJlYWRvbmx5PE51bWJlckZvcm1hdFNwZWM+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCxcbiAgcHJlY2lzaW9uOiBTSEFSRV9ERUNJTUFMUyxcbn0pO1xuY29uc3QgUEVSQ0VOVF9DSEFOR0VfREVGQVVMVF9TUEVDOiBSZWFkb25seTxOdW1iZXJGb3JtYXRTcGVjPiA9IE9iamVjdC5mcmVlemUoeyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQgfSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0VmFsdWVPcHRpb25zIHtcbiAgLy8gVGhlIHNvdXJjZSBtZWFzdXJlJ3MgZm9ybWF0IChPdXRwdXRNZXRhLm1lYXN1cmUncyBzbG90KSwgd2hpY2ggYSBjdXJyZW50LFxuICAvLyBwcmlvciBvciBjaGFuZ2UgY29sdW1uIHRha2VzIHdoZW4gaXRzIG93biBzbG90IG5hbWVzIG5vbmUuXG4gIG1lYXN1cmVTcGVjPzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGw7XG4gIC8vIFRoZSByb3cncyBwcmlvciB2YWx1ZSBpbiB0aGUgc2FtZSBsYW5lIChzZWUgbGFuZU91dHB1dEFsaWFzKSwgZm9yIGEgY2hhbmdlXG4gIC8vIG9yIGEgcGVyY2VudCBjaGFuZ2U6IGl0IHRlbGxzIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIGZyb20gYSB6ZXJvIG9uZVxuICAvLyAoJ24vYScpLCBhbmQgYSBuZXcgcmFuayBmcm9tIGFuIHVucmFua2VkIHJvdy4gTGVhdmUgaXQgb3V0IHdoZW4gdW5rbm93bi5cbiAgcHJpb3I/OiB1bmtub3duO1xuICAvLyBDb21wb25lbnREYXRhLmNvbXBhcmlzb24uZmxvb3I6IHRoZSBmaXJzdCBkYXkgd2l0aCBkYXRhLCBuYW1lZCBpbiB0aGVcbiAgLy8gbm8tYmFzZWxpbmUgdGl0bGUuXG4gIGZsb29yPzogc3RyaW5nIHwgbnVsbDtcbiAgLy8gV2hhdCBhIG1pc3NpbmcgY3VycmVudCBvciBwbGFpbiB2YWx1ZSBwcmludHMgKCcnIGZvciBhIGNlbGwpLiBBIG1pc3NpbmdcbiAgLy8gY29tcGFyaXNvbiB2YWx1ZSBhbHdheXMgcHJpbnRzICfigJQnLlxuICBlbXB0eT86IHN0cmluZztcbiAgLy8gV2hldGhlciB0aGUgdmFsdWUgcHJpbnRzIGEgcGx1cyB3aGVuIHBvc2l0aXZlLCBvdmVyIGl0cyByb2xlJ3MgZGVmYXVsdCAoYVxuICAvLyBjaGFuZ2UgYW5kIGEgcGVyY2VudCBjaGFuZ2UgYXJlIHNpZ25lZCwgbm90aGluZyBlbHNlIGlzKS4gQSBmb3JtdWxhIHZhbHVlXG4gIC8vIHNldHMgaXQgZnJvbSBpdHMgb3duIGBzaWduZWRgLCBzbyBpdCBjYW4gZHJvcCBhIGNoYW5nZSdzIHNpZ24gb3IgYXNrIGFcbiAgLy8gcGxhaW4gb3V0cHV0IGZvciBvbmUuXG4gIHNpZ25lZD86IGJvb2xlYW47XG4gIC8vIFdoZXRoZXIgYSBjaGFuZ2UgaW4gcGVyY2VudGFnZSBwb2ludHMgZW5kcyBpbiAnIHBwJy4gT21pdHRlZCByZWFkcyB0cnVlLlxuICAvLyBBIHZhbHVlIGluc2lkZSB0ZXh0IHBhc3NlcyBmYWxzZTogdGhlIHdvcmRzIGFyb3VuZCBpdHMgdG9rZW4gY2FycnkgdGhlXG4gIC8vIHVuaXQgKCdwdHMnLCAnZGF5cyBmYXN0ZXInKS5cbiAgcG9pbnRzVW5pdD86IGJvb2xlYW47XG59XG5cbi8vIEFuIG91dHB1dCB2YWx1ZSBhcyBzaG93biwgYW5kIHdoeSBpdCByZWFkcyBzbyB3aGVuIHRoYXQgaXMgbm90IG9idmlvdXNcbi8vIChudWxsIG90aGVyd2lzZSk6IGZvciBhIHRvb2x0aXAgb3IgYSB0aXRsZSBhdHRyaWJ1dGUuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgdGV4dDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gT25lIG91dHB1dCB2YWx1ZSwgd3JpdHRlbiBieSB0aGUgcnVsZXMgYWJvdmUuIFdpdGhvdXQgb3V0cHV0IG1ldGFkYXRhIChhXG4vLyBwbGFpbiBtZWFzdXJlIGNvbHVtbiwgYW4gb2xkZXIgc2VydmVyKSBpdCBpcyBmb3JtYXROdW1iZXIgd2l0aCB0aGUgc2xvdCdzXG4vLyBvd24gZm9ybWF0LlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE91dHB1dFZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgb3V0cHV0OiBPdXRwdXRNZXRhIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIG9wdGlvbnM6IE91dHB1dFZhbHVlT3B0aW9ucyA9IHt9LFxuKTogRm9ybWF0dGVkT3V0cHV0VmFsdWUge1xuICBpZiAoIW91dHB1dCkge1xuICAgIHJldHVybiBwbGFpbk91dHB1dChmb3JtYXROdW1iZXIodmFsdWUsIHNwZWMsIGNvbnRleHQsIHsgZW1wdHk6IG9wdGlvbnMuZW1wdHkgfSkpO1xuICB9XG5cbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycgJiYgb3V0cHV0LnJvbGUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGZvcm1hdFJhbmtDaGFuZ2UodmFsdWUsIHNwZWMsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3Qgcm9sZSA9IG91dHB1dC5yb2xlO1xuICBjb25zdCBlZmZlY3RpdmUgPSBvdXRwdXRGb3JtYXRTcGVjKG91dHB1dCwgc3BlYywgb3B0aW9ucy5tZWFzdXJlU3BlYyk7XG5cbiAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbWlzc2luZ091dHB1dChvdXRwdXQsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3Qgc2lnbmVkID0gb3B0aW9ucy5zaWduZWQgPz8gKHJvbGUgPT09ICdjaGFuZ2UnIHx8IHJvbGUgPT09ICdwZXJjZW50X2NoYW5nZScpO1xuXG4gIGlmIChyb2xlID09PSAnY2hhbmdlJyAmJiBpc1BvaW50c0NoYW5nZShvdXRwdXQsIGVmZmVjdGl2ZSkpIHtcbiAgICByZXR1cm4gcGxhaW5PdXRwdXQoZm9ybWF0UG9pbnRzKHZhbHVlLCBvdXRwdXQsIGVmZmVjdGl2ZSwgY29udGV4dCwgb3B0aW9ucy5wb2ludHNVbml0ID8/IHRydWUsIHNpZ25lZCkpO1xuICB9XG5cbiAgY29uc3QgcmF0aW9Db250ZXh0ID0gcm9sZSA9PT0gJ3BlcmNlbnRfY2hhbmdlJyB8fCBvdXRwdXQua2luZCA9PT0gJ3NoYXJlJ1xuICAgID8geyAuLi5jb250ZXh0LCByYXRpb1BlcmNlbnQ6IHRydWUgfVxuICAgIDogY29udGV4dDtcblxuICByZXR1cm4gcGxhaW5PdXRwdXQoZm9ybWF0TnVtYmVyKHZhbHVlLCBlZmZlY3RpdmUsIHJhdGlvQ29udGV4dCwgeyBzaWduZWQgfSkpO1xufVxuXG4vLyBUaGUgYWxpYXMgb2YgdGhlIG91dHB1dCB0aGF0IHBsYXlzIGByb2xlYCBpbiB0aGUgc2FtZSBsYW5lIGFzIGBhbGlhc2A6IHRoZVxuLy8gc2FtZSBtZWFzdXJlIGFuZCBraW5kLCBhbmQgKGZvciBhIHByaW9yLCBjaGFuZ2Ugb3IgcGVyY2VudCBjaGFuZ2UpIHRoZSBzYW1lXG4vLyBwcmlvciBsYW5lLiBBIG1lYXN1cmUgY29tcGFyZXMgYWdhaW5zdCBvbmUgbGFuZSBvbmx5ICh0d28gY29tcGFyZXMgb24gb25lXG4vLyB2YWx1ZSBhcmUgdHdvIG1lYXN1cmVzKSwgc28gYSBjdXJyZW50IHZhbHVlJ3MgbGFuZSBpcyB3aGljaGV2ZXIgb25lIGl0c1xuLy8gbWVhc3VyZSdzIHByaW9yIGNvbHVtbnMgY2FycnksIGxhbmUgMiBhcyByZWFkaWx5IGFzIGxhbmUgMS4gQSBjaGFuZ2UgY29sdW1uXG4vLyBmaW5kcyBpdHMgcHJpb3IgdGhpcyB3YXkgdG8gcGFzcyBhcyBPdXRwdXRWYWx1ZU9wdGlvbnMucHJpb3IuIG51bGwgd2hlbiB0aGVcbi8vIHNlcnZlciBzZW5kcyBubyBzdWNoIGNvbHVtbi5cbmV4cG9ydCBmdW5jdGlvbiBsYW5lT3V0cHV0QWxpYXMoXG4gIG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIE91dHB1dE1ldGE+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYWxpYXM6IHN0cmluZyxcbiAgcm9sZTogT3V0cHV0Um9sZSxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBzb3VyY2UgPSBvdXRwdXRzPy5bYWxpYXNdO1xuXG4gIGlmICghc291cmNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhbnlMYW5lID0gc291cmNlLnJvbGUgPT09ICdjdXJyZW50JyB8fCBzb3VyY2Uub2Zmc2V0ID09PSBudWxsO1xuICBjb25zdCBmb3VuZCA9IE9iamVjdC5lbnRyaWVzKG91dHB1dHMgPz8ge30pLmZpbmQoKFssIG1ldGFdKSA9PiBtZXRhLm1lYXN1cmUgPT09IHNvdXJjZS5tZWFzdXJlXG4gICAgJiYgbWV0YS5raW5kID09PSBzb3VyY2Uua2luZFxuICAgICYmIG1ldGEucm9sZSA9PT0gcm9sZVxuICAgICYmIChyb2xlID09PSAnY3VycmVudCcgfHwgKGFueUxhbmUgPyBtZXRhLm9mZnNldCAhPT0gbnVsbCA6IG1ldGEub2Zmc2V0ID09PSBzb3VyY2Uub2Zmc2V0KSkpO1xuXG4gIHJldHVybiBmb3VuZCA/IGZvdW5kWzBdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcGxhaW5PdXRwdXQodGV4dDogc3RyaW5nKTogRm9ybWF0dGVkT3V0cHV0VmFsdWUge1xuICByZXR1cm4geyB0ZXh0LCB0aXRsZTogbnVsbCB9O1xufVxuXG4vLyBUaGUgZm9ybWF0IGFuIG91dHB1dCBpcyB3cml0dGVuIGluOiB0aGUgc2xvdCdzIG93biBleHBsaWNpdCBmb3JtYXQsIGVsc2Vcbi8vIHRoZSBkZWZhdWx0IGZvciB3aGF0IGl0IGhvbGRzLCB3aXRoIGFueSBvd24gcHJlY2lzaW9uIG9yIHVuaXRzIG92ZXIgaXQuXG5mdW5jdGlvbiBvdXRwdXRGb3JtYXRTcGVjKFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIG93bjogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG1lYXN1cmVTcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHtcbiAgaWYgKHZhbHVlRm9ybWF0KG93bikgIT09IG51bGwpIHtcbiAgICByZXR1cm4gb3duO1xuICB9XG5cbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycpIHtcbiAgICByZXR1cm4gd2l0aE93bkRpZ2l0cyhSQU5LX0RFRkFVTFRfU1BFQywgb3duKTtcbiAgfVxuXG4gIGlmIChvdXRwdXQua2luZCA9PT0gJ3NoYXJlJykge1xuICAgIHJldHVybiB3aXRoT3duRGlnaXRzKFNIQVJFX0RFRkFVTFRfU1BFQywgb3duKTtcbiAgfVxuXG4gIGlmIChvdXRwdXQucm9sZSA9PT0gJ3BlcmNlbnRfY2hhbmdlJykge1xuICAgIHJldHVybiB3aXRoT3duRGlnaXRzKFBFUkNFTlRfQ0hBTkdFX0RFRkFVTFRfU1BFQywgb3duKTtcbiAgfVxuXG4gIHJldHVybiBtZWFzdXJlU3BlYyA/IHdpdGhPd25EaWdpdHMobWVhc3VyZVNwZWMsIG93bikgOiBvd24gPz8gbnVsbDtcbn1cblxuLy8gVGhlIGJhc2UgZm9ybWF0IHdpdGggdGhlIHNsb3QncyBvd24gcHJlY2lzaW9uIGFuZCB1bml0cyBvdmVyIGl0LlxuZnVuY3Rpb24gd2l0aE93bkRpZ2l0cyhiYXNlOiBOdW1iZXJGb3JtYXRTcGVjLCBvd246IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkKTogTnVtYmVyRm9ybWF0U3BlYyB7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZSxcbiAgICAuLi4oKG93bj8ucHJlY2lzaW9uID8/IG51bGwpICE9PSBudWxsID8geyBwcmVjaXNpb246IG93bi5wcmVjaXNpb24gfSA6IHt9KSxcbiAgICAuLi4oKG93bj8udW5pdHMgPz8gbnVsbCkgIT09IG51bGwgPyB7IHVuaXRzOiBvd24udW5pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gQSBjaGFuZ2UgYmV0d2VlbiB0d28gcmF0ZXM6IGEgc2hhcmUncywgb3IgYSBwZXJjZW50LWZvcm1hdCB2YWx1ZSdzLlxuZnVuY3Rpb24gaXNQb2ludHNDaGFuZ2Uob3V0cHV0OiBPdXRwdXRNZXRhLCBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgfHwgcmVzb2x2ZVN0eWxlKHNwZWMpID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50O1xufVxuXG4vLyBBIHJhdGUgY2hhbmdlIGluIHBlcmNlbnRhZ2UgcG9pbnRzLiBBIHNoYXJlIGFuZCBhIDAtMSBwZXJjZW50IGFyZSBzY2FsZWRcbi8vIHgxMDA7IGFuIG9sZGVyIHNlcnZlcidzIHBlcmNlbnQgdmFsdWVzIGFscmVhZHkgYXJlLiBgdW5pdGAgd3JpdGVzIHRoZSAnIHBwJ1xuLy8gYWZ0ZXIgdGhlIGRpZ2l0cywgYW5kIGBzaWduZWRgIHRoZSBwbHVzIGJlZm9yZSBhIHJpc2UuXG5mdW5jdGlvbiBmb3JtYXRQb2ludHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICB1bml0OiBib29sZWFuLFxuICBzaWduZWQ6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBudW1lcmljID0gdG9GaW5pdGVOdW1iZXIodmFsdWUpO1xuICBpZiAobnVtZXJpYyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgY29uc3QgcG9pbnRzID0gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgfHwgY29udGV4dC5yYXRpb1BlcmNlbnQgPyBudW1lcmljICogMTAwIDogbnVtZXJpYztcbiAgY29uc3QgZGVjaW1hbHMgPSBjbGFtcERlY2ltYWxzKHNwZWM/LnByZWNpc2lvbikgPz8gUE9JTlRTX0RFQ0lNQUxTO1xuICBjb25zdCB0ZXh0ID0gZm9ybWF0TnVtYmVyKHBvaW50cywgeyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlciB9LCBjb250ZXh0LCB7IGRlY2ltYWxzLCBzaWduZWQgfSk7XG5cbiAgcmV0dXJuIHVuaXQgPyBgJHt0ZXh0fSAke1BPSU5UU19TVUZGSVh9YCA6IHRleHQ7XG59XG5cbi8vIEEgbWlzc2luZyBvdXRwdXQgdmFsdWUuIEEgbWlzc2luZyBwcmlvciwgb3IgYSBkZWx0YSBhIG1pc3NpbmcgcHJpb3IgbGVmdFxuLy8gZW1wdHksIGhhcyBubyBiYXNlbGluZTsgYSBwZXJjZW50IGNoYW5nZSBvdmVyIGEgemVybyBwcmlvciBoYXMgbm9uZSB0b1xuLy8gZGl2aWRlIGJ5LlxuZnVuY3Rpb24gbWlzc2luZ091dHB1dChcbiAgb3V0cHV0OiBPdXRwdXRNZXRhLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBvcHRpb25zOiBPdXRwdXRWYWx1ZU9wdGlvbnMsXG4pOiBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSB7XG4gIGNvbnN0IHJvbGUgPSBvdXRwdXQucm9sZTtcblxuICBpZiAocm9sZSA9PT0gJ3ByaW9yJykge1xuICAgIHJldHVybiB7IHRleHQ6IEVNUFRZX1ZBTFVFLCB0aXRsZTogbWlzc2luZ1ByaW9yVGl0bGUob3V0cHV0LCBvcHRpb25zLmZsb29yLCBjb250ZXh0LmxvY2FsZSkgfTtcbiAgfVxuXG4gIGlmIChyb2xlID09PSAnY2hhbmdlJyB8fCByb2xlID09PSAncGVyY2VudF9jaGFuZ2UnKSB7XG4gICAgY29uc3QgcHJpb3IgPSBvcHRpb25zLnByaW9yO1xuXG4gICAgaWYgKHJvbGUgPT09ICdwZXJjZW50X2NoYW5nZScgJiYgdG9GaW5pdGVOdW1iZXIocHJpb3IpID09PSAwKSB7XG4gICAgICByZXR1cm4geyB0ZXh0OiBOT1RfQVBQTElDQUJMRV9WQUxVRSwgdGl0bGU6ICdQcmlvciB3YXMgMCcgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogRU1QVFlfVkFMVUUsXG4gICAgICB0aXRsZTogcHJpb3IgIT09IHVuZGVmaW5lZCAmJiBpc0VtcHR5VmFsdWUocHJpb3IpXG4gICAgICAgID8gbWlzc2luZ1ByaW9yVGl0bGUob3V0cHV0LCBvcHRpb25zLmZsb29yLCBjb250ZXh0LmxvY2FsZSlcbiAgICAgICAgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gcGxhaW5PdXRwdXQob3B0aW9ucy5lbXB0eSA/PyBFTVBUWV9WQUxVRSk7XG59XG5cbi8vIFdoeSBhIHByaW9yIGlzIG1pc3NpbmcuIEEgdmFsdWUncyBwcmlvciBpcyBtaXNzaW5nIHdoZW4gaXRzIHdpbmRvdyBlbmRzXG4vLyBiZWZvcmUgdGhlIGRhdGEgc3RhcnRzLiBBIHJhbmsncyBvciBhIHNoYXJlJ3MgaXMgbWlzc2luZyB3aGVuIHRoZSByb3cgaGFkXG4vLyBubyByYW5rIG9yIHNoYXJlIGluIHRoZSBwcmlvciBwZXJpb2QsIHdoYXRldmVyIHRoZSBmbG9vci5cbmZ1bmN0aW9uIG1pc3NpbmdQcmlvclRpdGxlKFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIGZsb29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGlmIChvdXRwdXQua2luZCA9PT0gJ3JhbmsnKSB7XG4gICAgcmV0dXJuIE5PX1BSSU9SX1JBTktfVElUTEU7XG4gIH1cblxuICBpZiAob3V0cHV0LmtpbmQgPT09ICdzaGFyZScpIHtcbiAgICByZXR1cm4gTk9fUFJJT1JfU0hBUkVfVElUTEU7XG4gIH1cblxuICByZXR1cm4gbm9CYXNlbGluZVRpdGxlKGZsb29yLCBsb2NhbGUpO1xufVxuXG5mdW5jdGlvbiBub0Jhc2VsaW5lVGl0bGUoZmxvb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgY29uc3QgZGF5ID0gZmxvb3IgPyBmb3JtYXREYXkoZmxvb3IsIGxvY2FsZSkgOiAnJztcblxuICByZXR1cm4gZGF5ID8gYE5vIGJhc2VsaW5lOiBubyBkYXRhIGJlZm9yZSAke2RheX1gIDogJ05vIGJhc2VsaW5lJztcbn1cblxuLy8gQSByYW5rIGNoYW5nZTogcHJpb3IgcmFuayBtaW51cyBjdXJyZW50LCBzbyBtb3ZpbmcgdXAgaXMgcG9zaXRpdmUuXG5mdW5jdGlvbiBmb3JtYXRSYW5rQ2hhbmdlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIG9wdGlvbnM6IE91dHB1dFZhbHVlT3B0aW9ucyxcbik6IEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaXNFbXB0eVZhbHVlKG9wdGlvbnMucHJpb3IpXG4gICAgICA/IHsgdGV4dDogTkVXX1JBTktfVkFMVUUsIHRpdGxlOiBOT19QUklPUl9SQU5LX1RJVExFIH1cbiAgICAgIDogcGxhaW5PdXRwdXQoRU1QVFlfVkFMVUUpO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IHRvRmluaXRlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gcGxhaW5PdXRwdXQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cblxuICBjb25zdCByYW5rU3BlYyA9IHZhbHVlRm9ybWF0KHNwZWMpICE9PSBudWxsID8gc3BlYyA6IHdpdGhPd25EaWdpdHMoUkFOS19ERUZBVUxUX1NQRUMsIHNwZWMpO1xuICBjb25zdCBwbGFjZXMgPSBmb3JtYXROdW1iZXIoTWF0aC5hYnMobnVtZXJpYyksIHJhbmtTcGVjLCBjb250ZXh0KTtcblxuICBpZiAocGxhY2VzID09PSBmb3JtYXROdW1iZXIoMCwgcmFua1NwZWMsIGNvbnRleHQpKSB7XG4gICAgcmV0dXJuIHBsYWluT3V0cHV0KFJBTktfVU5DSEFOR0VEX1ZBTFVFKTtcbiAgfVxuXG4gIHJldHVybiBwbGFpbk91dHB1dChgJHtudW1lcmljID4gMCA/IFJBTktfVVBfTUFSSyA6IFJBTktfRE9XTl9NQVJLfSAke3BsYWNlc31gKTtcbn1cblxuXG4vLyBBIGNoYXJ0J3MgdmFsdWUgYXhpcyB0YWtlcyBhIGZvcm1hdCBvbmx5IHdoZW4gZXZlcnkgbWVhc3VyZSBvbiBpdCBhZ3JlZXMgb25cbi8vIHRoZSBzdHlsZSAoZWFjaCBtZWFzdXJlJ3MgZm9ybWF0LCBudW1iZXIgd2hlbiBpdCBuYW1lcyBub25lKSBhbmQgYXQgbGVhc3Rcbi8vIG9uZSBvZiB0aGVtIG5hbWVzIGEgZm9ybWF0LiBUaGUgZmlyc3QgbWVhc3VyZSB0aGF0IGRvZXMgZ2l2ZXMgdGhlIGF4aXMgaXRzXG4vLyBwcmVjaXNpb24gYW5kIHVuaXRzLiBPdGhlcndpc2UgbnVsbDogdGhlIGF4aXMga2VlcHMgaXRzIGRlZmF1bHQgdGlja3Mgb25cbi8vIHNjcmVlbiBhbmQgaW4gUG93ZXJQb2ludCwgYW5kIGVhY2ggc2VyaWVzIHN0aWxsIGZvcm1hdHMgaXRzIG93biB0b29sdGlwcy5cbmV4cG9ydCBmdW5jdGlvbiBheGlzTnVtYmVyRm9ybWF0KG1lYXN1cmVzOiBDaGFydE1lYXN1cmVbXSk6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHtcbiAgY29uc3Qgc3R5bGUgPSBtZWFzdXJlcy5sZW5ndGggPyByZXNvbHZlU3R5bGUobWVhc3VyZXNbMF0pIDogbnVsbDtcblxuICBpZiAoc3R5bGUgPT09IG51bGwgfHwgbWVhc3VyZXMuc29tZSgobWVhc3VyZSkgPT4gcmVzb2x2ZVN0eWxlKG1lYXN1cmUpICE9PSBzdHlsZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IG1lYXN1cmVzLmZpbmQoKG1lYXN1cmUpID0+IGhhc051bWJlckZvcm1hdChtZWFzdXJlKSk7XG5cbiAgcmV0dXJuIGZvcm1hdHRlZCA/IG51bWJlckZvcm1hdFNwZWMoZm9ybWF0dGVkKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG51bWJlckZvcm1hdFNwZWMoc3BlYzogTnVtYmVyRm9ybWF0U3BlYyk6IE51bWJlckZvcm1hdFNwZWMge1xuICByZXR1cm4ge1xuICAgIC4uLihzcGVjLmZvcm1hdCAhPT0gdW5kZWZpbmVkID8geyBmb3JtYXQ6IHNwZWMuZm9ybWF0IH0gOiB7fSksXG4gICAgLi4uKHNwZWMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyB7IHByZWNpc2lvbjogc3BlYy5wcmVjaXNpb24gfSA6IHt9KSxcbiAgICAuLi4oc3BlYy51bml0cyAhPT0gdW5kZWZpbmVkID8geyB1bml0czogc3BlYy51bml0cyB9IDoge30pLFxuICB9O1xufVxuXG4vLyBIb3cgYSBjaGFydCdzIHZhbHVlIGF4aXMgd3JpdGVzIGl0cyB0aWNrczogdGhlIHVuaXRzIGRlY2lkZWQgb25jZSBmcm9tIHRoZVxuLy8gYXhpcyBwZWFrLCBhbmQgdGhlIGRlY2ltYWxzIHRoZSBwcmVjaXNpb24gcGlucywgZWxzZSBhcyBtYW55IGFzIHRoZSBheGlzJ3Ncbi8vIHRpY2sgc3RlcCBuZWVkcyAoYSBwZXJjZW50IGF4aXMgdXAgdG8gMC4xMiUgc3RlcHMgYnkgMC4wMiUsIHR3byBkZWNpbWFscykuXG4vLyBQaW5uZWQgZGVjaW1hbHMga2VlcCB0aGUgdGlja3MgZGlzdGluY3QsIGFuZCBQb3dlclBvaW50IGNhbiBvbmx5IHBpbiB0aGVtLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDaGFydE51bWJlckZvcm1hdChcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyxcbiAgcGVhazogbnVtYmVyLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogQ2hhcnROdW1iZXJGb3JtYXQge1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZShzcGVjKTtcbiAgY29uc3QgcHJlY2lzaW9uID0gY2xhbXBEZWNpbWFscyhzcGVjLnByZWNpc2lvbik7XG4gIGNvbnN0IHVuaXRzID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnRcbiAgICA/IFJlcG9ydE51bWJlclVuaXRzLk5vbmVcbiAgICA6IHJlc29sdmVVbml0cyhzcGVjLnVuaXRzLCBwZWFrLCBwcmVjaXNpb24gPz8gU0NBTEVEX0RFQ0lNQUxTKTtcblxuICByZXR1cm4geyB1bml0cywgZGVjaW1hbHM6IHByZWNpc2lvbiA/PyBheGlzRGVjaW1hbHMoc3R5bGUsIHVuaXRzLCBwZWFrLCBjb250ZXh0KSB9O1xufVxuXG4vLyBUaGUgZGVjaW1hbHMgdGhlIGF4aXMncyBuaWNlIHRpY2sgc3RlcCBuZWVkcy4gQSBwbGFpbiwgdW5hYmJyZXZpYXRlZCBudW1iZXJcbi8vIHBpbnMgbm9uZSAobnVsbCk6IGl0cyB0aWNrcyBrZWVwIHRoZWlyIG93biBkZWNpbWFscy4gQW4gdW5zY2FsZWQgY3VycmVuY3lcbi8vIGF4aXMgdGhhdCBuZWVkcyBkZWNpbWFscyBzaG93cyBjZW50cywgYW5kIGEgSy9NIGF4aXMga2VlcHMgaXRzIHN0ZXAnc1xuLy8gZGVjaW1hbHMgKCckMC41TScsIG5vdCAnJDAuNTBNJykuXG5mdW5jdGlvbiBheGlzRGVjaW1hbHMoXG4gIHN0eWxlOiBSZXBvcnRWYWx1ZUZvcm1hdCxcbiAgdW5pdHM6IFJlc29sdmVkVW5pdHMsXG4gIHBlYWs6IG51bWJlcixcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBzY2FsZSA9IFVOSVRfU0NBTEVTLmdldCh1bml0cyk7XG5cbiAgaWYgKHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIgJiYgIXNjYWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzaG93blBlYWsgPSBzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCAmJiBjb250ZXh0LnJhdGlvUGVyY2VudFxuICAgID8gTWF0aC5hYnMocGVhaykgKiAxMDBcbiAgICA6IE1hdGguYWJzKHBlYWspIC8gKHNjYWxlPy5kaXZpc29yID8/IDEpO1xuICBjb25zdCBzdGVwID0gbmljZVN0ZXAoc2hvd25QZWFrIC8gQVhJU19USUNLUyk7XG4gIGNvbnN0IGRlY2ltYWxzID0gc3RlcCA+IDAgPyBjbGFtcERlY2ltYWxzKC1NYXRoLmZsb29yKE1hdGgubG9nMTAoc3RlcCkpKSA/PyAwIDogMDtcblxuICByZXR1cm4gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5ICYmIGRlY2ltYWxzID4gMCAmJiAhc2NhbGUgPyBDVVJSRU5DWV9BWElTX0RFQ0lNQUxTIDogZGVjaW1hbHM7XG59XG5cbi8vIEVDaGFydHMnIG5pY2UoKTogdGhlIHJvdW5kIG51bWJlciAoMSwgMiwgMywgNSBvciAxMCB0aW1lcyBhIHBvd2VyIG9mIHRlbikgYVxuLy8gcm91Z2ggdGljayBzdGVwIHNuYXBzIHRvLlxuZnVuY3Rpb24gbmljZVN0ZXAocm91Z2g6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghKHJvdWdoID4gMCkgfHwgIU51bWJlci5pc0Zpbml0ZShyb3VnaCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKHJvdWdoKSk7XG4gIGNvbnN0IHBvd2VyID0gTWF0aC5wb3coMTAsIGV4cG9uZW50KTtcbiAgY29uc3QgZnJhY3Rpb24gPSByb3VnaCAvIHBvd2VyO1xuICBsZXQgbmljZSA9IDEwO1xuICBpZiAoZnJhY3Rpb24gPCAxLjUpIHtcbiAgICBuaWNlID0gMTtcbiAgfSBlbHNlIGlmIChmcmFjdGlvbiA8IDIuNSkge1xuICAgIG5pY2UgPSAyO1xuICB9IGVsc2UgaWYgKGZyYWN0aW9uIDwgNCkge1xuICAgIG5pY2UgPSAzO1xuICB9IGVsc2UgaWYgKGZyYWN0aW9uIDwgNykge1xuICAgIG5pY2UgPSA1O1xuICB9XG5cbiAgcmV0dXJuIG5pY2UgKiBwb3dlcjtcbn1cblxuLy8gUG93ZXJQb2ludCdzIG51bWJlciBmb3JtYXQgY29kZSBmb3IgYSBmb3JtYXR0ZWQgdmFsdWUgYXhpcywgbWF0Y2hpbmcgdGhlXG4vLyBzY3JlZW4ncyB0aWNrczogJyMsIyMwLjAlJyAocGVyY2VudCksICdcIiRcIiMsIyMwJyAoY3VycmVuY3kpLFxuLy8gJyMsIyMwLjAsXCJLXCInICh0aG91c2FuZHMpLCAnIywjIzBcIiAkXCInIChmci1DQSBjdXJyZW5jeSkuIEEgcGxhaW4gbnVtYmVyXG4vLyB3aG9zZSBkZWNpbWFscyBhcmUgbm90IHBpbm5lZCBrZWVwcyBjaGFydEF4aXNGb3JtYXRDb2RlJ3MgY29kZS4gVGhlIGNvZGUnc1xuLy8gc2VwYXJhdG9ycyBmb2xsb3cgdGhlIG9wZW5pbmcgbWFjaGluZSdzIGxvY2FsZTsgdGhlIGN1cnJlbmN5IHN5bWJvbCBhbmQgaXRzXG4vLyBzaWRlIGZvbGxvdyB0aGUgcmVwb3J0J3MuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyRm9ybWF0Q29kZShcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgY2hhcnQ6IENoYXJ0TnVtYmVyRm9ybWF0LFxuICBzZXJpZXM6IChudW1iZXIgfCBudWxsKVtdW10sXG4gIHN0YWNrZWQ6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZShzcGVjKTtcbiAgY29uc3Qgc2NhbGUgPSBzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCA/IHVuZGVmaW5lZCA6IFVOSVRfU0NBTEVTLmdldChjaGFydC51bml0cyk7XG5cbiAgaWYgKHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIgJiYgIXNjYWxlICYmIGNoYXJ0LmRlY2ltYWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoYXJ0QXhpc0Zvcm1hdENvZGUoc2VyaWVzLCBzdGFja2VkKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2ltYWxzID0gY2hhcnQuZGVjaW1hbHMgPz8gMDtcbiAgY29uc3QgZGlnaXRzID0gYCMsIyMwJHtkZWNpbWFscyA+IDAgPyBgLiR7JzAnLnJlcGVhdChkZWNpbWFscyl9YCA6ICcnfWA7XG5cbiAgaWYgKHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50KSB7XG4gICAgcmV0dXJuIGAke2RpZ2l0c30ke2NvbnRleHQucmF0aW9QZXJjZW50ID8gJyUnIDogJ1wiJVwiJ31gO1xuICB9XG5cbiAgY29uc3Qgc2NhbGVkID0gYCR7ZGlnaXRzfSR7c2NhbGU/LmNvbW1hcyA/PyAnJ31gO1xuICBjb25zdCB1bml0ID0gc2NhbGU/LnN1ZmZpeCA/PyAnJztcblxuICBpZiAoc3R5bGUgIT09IFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5KSB7XG4gICAgcmV0dXJuIHVuaXQgPyBgJHtzY2FsZWR9XCIke3VuaXR9XCJgIDogc2NhbGVkO1xuICB9XG5cbiAgY29uc3Qgc3ltYm9sID0gY3VycmVuY3lTeW1ib2woY29udGV4dCk7XG5cbiAgcmV0dXJuIHN5bWJvbC5wcmVmaXhcbiAgICA/IGBcIiR7c3ltYm9sLnRleHR9XCIke3NjYWxlZH0ke3VuaXQgPyBgXCIke3VuaXR9XCJgIDogJyd9YFxuICAgIDogYCR7c2NhbGVkfVwiJHt1bml0fSR7c3ltYm9sLnRleHR9XCJgO1xufVxuXG4vLyBUaGUgY3VycmVuY3kgc3ltYm9sIGFzIHRoZSBsb2NhbGUgd3JpdGVzIGl0IGJlc2lkZSBhIG51bWJlciwgd2l0aCB0aGUgc3BhY2Vcbi8vIGJldHdlZW4gdGhlbSwgYW5kIHdoaWNoIHNpZGUgaXQgc2l0cyBvbjogJyQnIGJlZm9yZSBpbiBlbi1VUywgJyAkJyBhZnRlciBpblxuLy8gZnItQ0EuIFF1b3RlcyBhcmUgZHJvcHBlZCwgYXMgYSBmb3JtYXQgY29kZSBjYW5ub3QgaG9sZCB0aGVtLlxuaW50ZXJmYWNlIEN1cnJlbmN5U3ltYm9sIHtcbiAgcHJlZml4OiBib29sZWFuO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmNvbnN0IENVUlJFTkNZX1NZTUJPTFMgPSBuZXcgTWFwPHN0cmluZywgQ3VycmVuY3lTeW1ib2w+KCk7XG5cbmZ1bmN0aW9uIGN1cnJlbmN5U3ltYm9sKGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiBDdXJyZW5jeVN5bWJvbCB7XG4gIGNvbnN0IGtleSA9IGAke2NvbnRleHQubG9jYWxlfXwke2NvbnRleHQuY3VycmVuY3l9YDtcbiAgbGV0IHN5bWJvbCA9IENVUlJFTkNZX1NZTUJPTFMuZ2V0KGtleSk7XG5cbiAgaWYgKCFzeW1ib2wpIHtcbiAgICBjb25zdCBwYXJ0cyA9IG51bWJlckZvcm1hdChjb250ZXh0LmxvY2FsZSwgY3VycmVuY3lPcHRpb25zKGNvbnRleHQuY3VycmVuY3kpKS5mb3JtYXRUb1BhcnRzKDEpO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcGFydHMuZmluZEluZGV4KChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdjdXJyZW5jeScpO1xuICAgIGNvbnN0IGZpcnN0ID0gcGFydHMuZmluZEluZGV4KChwYXJ0KSA9PiBOVU1CRVJfUEFSVFMuaGFzKHBhcnQudHlwZSkpO1xuICAgIGNvbnN0IGxhc3QgPSBwYXJ0cy5yZWR1Y2UoKGZvdW5kLCBwYXJ0LCBpbmRleCkgPT4gTlVNQkVSX1BBUlRTLmhhcyhwYXJ0LnR5cGUpID8gaW5kZXggOiBmb3VuZCwgLTEpO1xuICAgIGNvbnN0IHByZWZpeCA9IGN1cnJlbmN5IDwgZmlyc3Q7XG4gICAgY29uc3QgdGV4dCA9IChwcmVmaXggPyBwYXJ0cy5zbGljZShNYXRoLm1heChjdXJyZW5jeSwgMCksIGZpcnN0KSA6IHBhcnRzLnNsaWNlKGxhc3QgKyAxKSlcbiAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpXG4gICAgICAuam9pbignJylcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJyk7XG5cbiAgICBzeW1ib2wgPSB7IHByZWZpeCwgdGV4dCB9O1xuICAgIENVUlJFTkNZX1NZTUJPTFMuc2V0KGtleSwgc3ltYm9sKTtcbiAgfVxuXG4gIHJldHVybiBzeW1ib2w7XG59XG5cblxuLy8gRXZlcnkgZGVjaW1hbCBhIG51bWJlciBoYXMsIGdyb3VwZWQsIGluIHRoZSBsb2NhbGU6IHdoYXQgRUNoYXJ0cyBwcmludHMgYnlcbi8vIGRlZmF1bHQgKGl0cyBhZGRDb21tYXMpLCBidXQgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gYSBjaGFydCdzIGF4aXMgYW5kXG4vLyB0b29sdGlwIHJlYWQgbGlrZSB0aGUgcmVzdCBvZiB0aGUgcmVwb3J0LiAxMjM0LjUgcmVhZHMgMSwyMzQuNSBpbiBlbi1VUyBhbmRcbi8vIDEgMjM0LDUgaW4gZnItQ0EuIEEgbm9uLW51bWVyaWMgc3RyaW5nIGlzIHNob3duIGFzIGl0IGNhbWUsIGFuZCBhbnl0aGluZ1xuLy8gZWxzZSBub24tbnVtZXJpYyBhcyAnLScsIGFzIEVDaGFydHMgc2hvd3MgaXQuIEFzIHRoZXJlLCBhbiBpbmZpbml0ZSB2YWx1ZVxuLy8gcmVhZHMgJ0luZmluaXR5JyBhbmQgbmVnYXRpdmUgemVybyAoYSB0aWNrIGEgZmxvYXQgZXJyb3IgbGVhdmVzIGp1c3QgYmVsb3dcbi8vIHplcm8pIHJlYWRzICcwJy5cbmNvbnN0IFBMQUlOX05VTUJFUjogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zID0geyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIwIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQbGFpbk51bWJlcih2YWx1ZTogdW5rbm93biwgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBjb25zdCBudW1lcmljID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgID8gdmFsdWVcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpICE9PSAnJyA/IE51bWJlcih2YWx1ZSkgOiBOYU47XG5cbiAgaWYgKE51bWJlci5pc05hTihudW1lcmljKSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnLSc7XG4gIH1cblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBTdHJpbmcobnVtZXJpYyk7XG4gIH1cblxuICByZXR1cm4gbnVtYmVyRm9ybWF0KGxvY2FsZSwgUExBSU5fTlVNQkVSKS5mb3JtYXQobnVtZXJpYyA9PT0gMCA/IDAgOiBudW1lcmljKTtcbn1cblxuXG4vLyBUaGUgYXhpcyBwZWFrIGF0IHdoaWNoIGEgbmF0aXZlIGNoYXJ0J3MgdmFsdWUgYXhpcyBnYWlucyB0aG91c2FuZHNcbi8vIHNlcGFyYXRvcnMuIEZyb20gaGVyZSB1cCB0aGUgdGlja3MgYXJlIHdob2xlIG51bWJlcnMgaW4gcHJhY3RpY2U7IGJlbG93IGl0XG4vLyBuZWl0aGVyIHRoZSBzY3JlZW4gbm9yIFBvd2VyUG9pbnQncyAnR2VuZXJhbCcgc2hvd3MgYSBzZXBhcmF0b3IuXG5leHBvcnQgY29uc3QgQVhJU19TRVBBUkFUT1JfVEhSRVNIT0xEID0gMTAwMDtcblxuLy8gUG93ZXJQb2ludCdzIG51bWJlciBmb3JtYXQgZm9yIGEgbmF0aXZlIGNoYXJ0J3MgdmFsdWUgYXhpcywgbWF0Y2hpbmcgd2hhdCB0aGVcbi8vIG9uLXNjcmVlbiBheGlzIHByaW50cyBieSBkZWZhdWx0OiB0aG91c2FuZHMgc2VwYXJhdG9ycyB3aXRoIGVhY2ggdGljaydzIG93blxuLy8gZGVjaW1hbHMuIEV4Y2VsIGhhcyBubyBcIkdlbmVyYWwgd2l0aCBzZXBhcmF0b3JzXCIsIHNvIGFuIGF4aXMgcmVhY2hpbmcgMSwwMDBcbi8vICh3aGVyZSB0aWNrcyBhcmUgd2hvbGUgbnVtYmVycykgZ2V0cyAnIywjIzAnLCBhbmQgYSBzbWFsbGVyIHJhbmdlIGtlZXBzXG4vLyAnR2VuZXJhbCcgc28gZnJhY3Rpb25hbCB0aWNrcyAoMC4yNSwgMC41KSBhcmUgbm90IHJvdW5kZWQgYXdheS5cbi8vXG4vLyBUaGUgcGVhayBpcyBjaGFydFZhbHVlUGVhaydzLlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0QXhpc0Zvcm1hdENvZGUoc2VyaWVzOiAobnVtYmVyIHwgbnVsbClbXVtdLCBzdGFja2VkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYXJ0VmFsdWVQZWFrKHNlcmllcywgc3RhY2tlZCkgPj0gQVhJU19TRVBBUkFUT1JfVEhSRVNIT0xEID8gJyMsIyMwJyA6ICdHZW5lcmFsJztcbn1cblxuLy8gVGhlIGxhcmdlc3QgbWFnbml0dWRlIGEgY2hhcnQncyB2YWx1ZSBheGlzIGhhcyB0byByZWFjaC4gQSBtaXNzaW5nIHZhbHVlXG4vLyBjb3VudHMgYXMgMC4gQSBzdGFja2VkIGNoYXJ0J3MgcGVhayBpcyBpdHMgdGFsbGVzdCBzdGFjazogdGhlIGxhcmdlc3Qgc3VtLFxuLy8gcGVyIGNhdGVnb3J5LCBvZiBldmVyeSBzZXJpZXMnIGFic29sdXRlIHZhbHVlLlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0VmFsdWVQZWFrKHNlcmllczogKG51bWJlciB8IG51bGwpW11bXSwgc3RhY2tlZDogYm9vbGVhbik6IG51bWJlciB7XG4gIGNvbnN0IG1hZ25pdHVkZXMgPSBzZXJpZXMubWFwKCh2YWx1ZXMpID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBNYXRoLmFicyh2YWx1ZSA/PyAwKSkpO1xuXG4gIHJldHVybiBzdGFja2VkXG4gICAgPyBNYXRoLm1heCgwLCAuLi4obWFnbml0dWRlc1swXSA/PyBbXSkubWFwKChfLCBpbmRleCkgPT4gbWFnbml0dWRlc1xuICAgICAgLnJlZHVjZSgoc3VtLCB2YWx1ZXMpID0+IHN1bSArICh2YWx1ZXNbaW5kZXhdID8/IDApLCAwKSkpXG4gICAgOiBNYXRoLm1heCgwLCAuLi5tYWduaXR1ZGVzLmZsYXQoKSk7XG59XG5cblxuLy8gVGhlIHpvbmUgZXZlcnkgZGF0ZSBpbiBhIHJlcG9ydCBpcyByZWFkIGluLiBUaGUgc2VydmVyIHJlc29sdmVzIGl0ICh0aGVcbi8vIHJlcG9ydCdzIG93biB6b25lLCBlbHNlIHRoZSBhcHBsaWNhdGlvbidzIGRlZmF1bHQgcmVwb3J0aW5nIHpvbmUpIGFuZCBzZW5kc1xuLy8gaXQgYXMgYGVmZmVjdGl2ZVRpbWV6b25lYC4gQSBzZXJ2ZXIgdG9vIG9sZCB0byBzZW5kIHRoZSBmaWVsZCBzdGlsbCB1c2VkIGFcbi8vIHJlcG9ydCdzIHBpbm5lZCBgdGltZXpvbmVgLCBzbyB0aGF0IGNvbWVzIG5leHQ7IHRoZSBicm93c2VyJ3Mgem9uZSBpcyB0aGUgbGFzdFxuLy8gZmFsbGJhY2suIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB0aGF0IGNoYWluIGxpdmVzLCBzbyBldmVyeSBkYXRlIHRoZSB2aWV3ZXJcbi8vIHJlbmRlcnMgb3IgcmVzb2x2ZXMgYWdyZWVzIHdpdGggZXZlcnkgb3RoZXIuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydDogUGljazxSZXBvcnQsICdlZmZlY3RpdmVUaW1lem9uZScgfCAndGltZXpvbmUnPik6IHN0cmluZyB7XG4gIHJldHVybiByZXBvcnQuZWZmZWN0aXZlVGltZXpvbmUgPz8gcmVwb3J0LnRpbWV6b25lID8/IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbn1cblxuXG4vLyBUaGUgZGF0ZSBzaGFwZXMgYSByZXBvcnQgd3JpdGVzLCBlYWNoIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG4vLyAnSmFuIDUsIDIwMjYnIC8gJzUgamFudi4gMjAyNic6IGEgZGF0ZSBjZWxsLCBhIGZpbHRlciBib3VuZC5cbmV4cG9ydCBjb25zdCBEQVlfU0hPUlQ6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJyB9O1xuLy8gJ0phbnVhcnkgNSwgMjAyNicgLyAnNSBqYW52aWVyIDIwMjYnOiBhbiBleHBvcnQgY292ZXIncyBkYXRlIGxpbmUuXG5leHBvcnQgY29uc3QgREFZX0xPTkc6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH07XG4vLyAnSmFudWFyeScgLyAnamFudmllcic6IGEgbW9udGhseSBwZXJpb2QgbGFiZWwgKGl0cyB5ZWFyIGlzIGFkZGVkIGFwYXJ0KS5cbmV4cG9ydCBjb25zdCBNT05USF9MT05HOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgbW9udGg6ICdsb25nJyB9O1xuLy8gJ0phbnVhcnkgMjAyNicgLyAnamFudmllciAyMDI2JzogYSBtb250aGx5IHBlcmlvZCBsYWJlbCB3cml0dGVuIGluIGZ1bGwuXG5leHBvcnQgY29uc3QgTU9OVEhfWUVBUjogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9O1xuLy8gJ0phbiA1JyAvICc1IGphbnYuJzogYSBkYWlseSBvciB3ZWVrbHkgcGVyaW9kIGxhYmVsLlxuZXhwb3J0IGNvbnN0IE1PTlRIX0RBWTogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJyB9O1xuXG4vLyBBIGRhdGUgaW4gdGhlIGxvY2FsZS4gV2l0aCBhIHpvbmUsIHRoZSBkYXkgaXQgZmFsbHMgb24gdGhlcmU7IHdpdGhvdXQgb25lLFxuLy8gdGhlIGJyb3dzZXIncyB6b25lLCB3aGljaCBrZWVwcyBhIGNhbGVuZGFyIGRheSBwYXJzZWQgYXMgbG9jYWwgbWlkbmlnaHRcbi8vIHVuc2hpZnRlZC4gSXQgbmV2ZXIgdGhyb3dzLCBzaW5jZSBhIHBpcGUgb3IgYW4gZXhwb3J0IGNhbGxzIGl0IHBlciBjZWxsOiBhblxuLy8gaW52YWxpZCBEYXRlIHJlYWRzICcnLCBhIG1hbGZvcm1lZCBsb2NhbGUgKCdlbl9DQScpIHJlYWRzIHRoZSBmYWxsYmFja1xuLy8gbG9jYWxlLCBhbmQgYW4gdW5rbm93biB6b25lIHJlYWRzIFVUQywgd2hpY2ggc3RpbGwgbmFtZXMgYSByZWFsIGRheS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMb2NhbERhdGUoXG4gIGRhdGU6IERhdGUsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgdGltZVpvbmU/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHdyaXRlRGF0ZShkYXRlRm9ybWF0KGxvY2FsZSwgb3B0aW9ucywgdGltZVpvbmUpLCBkYXRlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZvcm1hdEZhbGxiYWNrRGF0ZShkYXRlLCByZXNvbHZlUmVwb3J0TG9jYWxlKGxvY2FsZSksIG9wdGlvbnMsIHRpbWVab25lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRGYWxsYmFja0RhdGUoXG4gIGRhdGU6IERhdGUsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgdGltZVpvbmU/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiB3cml0ZURhdGUoZGF0ZUZvcm1hdChsb2NhbGUsIG9wdGlvbnMsIHRpbWVab25lKSwgZGF0ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB3cml0ZURhdGUoZGF0ZUZvcm1hdChsb2NhbGUsIG9wdGlvbnMsICdVVEMnKSwgZGF0ZSk7XG4gIH1cbn1cblxuLy8gSW50bCB3cml0ZXMgYSB5ZWFyIGJlbG93IDEwMDAgd2l0aCBvbmx5IHRoZSBkaWdpdHMgaXQgaGFzICgnSmFuIDEsIDEnKTsgYVxuLy8gZGF0ZSdzIHllYXIgaXMgYWx3YXlzIHdyaXR0ZW4gd2l0aCBmb3VyICgnSmFuIDEsIDAwMDEnKSwgc28gYSBzZW50aW5lbCBkYXlcbi8vIHN0aWxsIHJlYWRzIGFzIGEgZGF0ZS4gT25seSBzdWNoIGEgeWVhciBwYXlzIGZvciBmb3JtYXRUb1BhcnRzLlxuZnVuY3Rpb24gd3JpdGVEYXRlKGZvcm1hdHRlcjogSW50bC5EYXRlVGltZUZvcm1hdCwgZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gIGlmIChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgPiAxMDAwKSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQoZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd5ZWFyJyA/IHBhcnQudmFsdWUucGFkU3RhcnQoNCwgJzAnKSA6IHBhcnQudmFsdWUpXG4gICAgLmpvaW4oJycpO1xufVxuXG5cbmNvbnN0IERBVEVfT05MWV9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuY29uc3QgREFURV9USU1FX1BBVFRFUk4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfSlbIFRdKFxcZHsyfTpcXGR7Mn06XFxkezJ9KShcXC5cXGQrKT8kLztcblxuLy8gQSByZXBvcnQgcm93J3MgZGF0ZSBjZWxsIGFzIGEgY2FsZW5kYXIgZGF5IGluIHRoZSByZXBvcnQncyB6b25lLlxuLy9cbi8vIFJlcG9ydCByb3dzIGFyZSByYXcgZGF0YWJhc2Ugc3RyaW5ncywgbm90IHNlcmlhbGl6ZWQgbW9kZWxzLCBzbyB0aGVpciBzaGFwZVxuLy8gaXMgdGhlIHdpcmUgY29udHJhY3Q6IGEgREFURSBjb2x1bW4gYXJyaXZlcyBhcyAnWVlZWS1NTS1ERCcgYW5kIGFcbi8vIGRhdGUtYW5kLXRpbWUgY29sdW1uIGFzICdZWVlZLU1NLUREIEhIOk1NOlNTJyBpbiBVVEMuIFJlYWRpbmcgdGhhdCBzaGFwZVxuLy8gaGVyZSBkb2VzIG5vdCByZS1kZXJpdmUgYSBzZXJ2ZXIgcnVsZTsgaXQgb25seSBzdG9wcyB0aGUgYnJvd3NlciBndWVzc2luZy5cbi8vIC0gQSBjYWxlbmRhciBkYXkgaXMgbmV2ZXIgc2hpZnRlZDogcGFyc2VJU08gcmVhZHMgaXQgYXMgbG9jYWwgbWlkbmlnaHQsIHNvXG4vLyAgIHRoZSBkYXkgcHJpbnRlZCBpcyB0aGUgZGF5IHN0b3JlZCwgd2hhdGV2ZXIgdGhlIHpvbmUuXG4vLyAtIEFuIGluc3RhbnQgaXMgcGlubmVkIHRvIFVUQyB3aXRoIGFuIGV4cGxpY2l0ICdaJywgdGhlbiBzaG93biBhcyB0aGUgZGF5IGl0XG4vLyAgIGZlbGwgb24gaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSB0aGUgZmlsdGVycyBhbmQgdGltZSBidWNrZXRzIHVzZS5cbi8vIC0gQW55dGhpbmcgZWxzZSBpcyBzaG93biBhcyBpdCBjYW1lLCBhbmQgc28gaXMgYSB2YWx1ZSB0aGF0IGhhcyB0aGUgc2hhcGVcbi8vICAgYnV0IG5hbWVzIG5vIHJlYWwgZGF5IChhIHplcm8gZGF0ZSAnMDAwMC0wMC0wMCcsIG9yICcyMDI2LTAyLTMwJyk6IG9uZVxuLy8gICBiYWQgY2VsbCBtdXN0IG5vdCB0aHJvdyBvdXQgb2YgYSBwaXBlIG9yIGFib3J0IGFuIGV4cG9ydC5cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlOiAnSmFuIDUsIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LlxuLy8gMjAyNicgaW4gZnItQ0EuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVwb3J0RGF0ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IFN0cmluZyh2YWx1ZSk7XG5cbiAgaWYgKERBVEVfT05MWV9QQVRURVJOLnRlc3QodGV4dCkpIHtcbiAgICBjb25zdCBkYXkgPSBwYXJzZUlTTyh0ZXh0KTtcblxuICAgIHJldHVybiBpc1ZhbGlkKGRheSkgPyBmb3JtYXRMb2NhbERhdGUoZGF5LCBsb2NhbGUsIERBWV9TSE9SVCkgOiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgZGF0ZVRpbWUgPSBEQVRFX1RJTUVfUEFUVEVSTi5leGVjKHRleHQpO1xuICBpZiAoIWRhdGVUaW1lKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBjb25zdCBpbnN0YW50ID0gcGFyc2VJU08oYCR7ZGF0ZVRpbWVbMV19VCR7ZGF0ZVRpbWVbMl19WmApO1xuXG4gIHJldHVybiBpc1ZhbGlkKGluc3RhbnQpID8gZm9ybWF0TG9jYWxEYXRlKGluc3RhbnQsIGxvY2FsZSwgREFZX1NIT1JULCB0aW1lem9uZSkgOiB0ZXh0O1xufVxuXG5cbi8vIFRoZSB0aW1lIG9mIGRheSBhbiBpbnN0YW50IGZhbGxzIGF0IGluIHRoZSByZXBvcnQncyB6b25lOiAnMjoyMyBQTScgaW5cbi8vIGVuLVVTLCAnMTQgaCAyMycgaW4gZnItQ0EuXG5leHBvcnQgY29uc3QgVElNRV9TSE9SVDogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfTtcblxuLy8gQSB3aW5kb3cncyBpbmNsdXNpdmUgZGF5cywgYXMgdGhlIHNlcnZlciBzZW5kcyB0aGVtOiAneXl5eS1NTS1kZCcgY2FsZW5kYXJcbi8vIGRheXMgYWxyZWFkeSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gTGlrZSBhIGRhdGUgY2VsbCB0aGV5IGFyZSByZWFkIGFzIGxvY2FsXG4vLyBtaWRuaWdodCBhbmQgd3JpdHRlbiB3aXRoIE5PIHpvbmUsIHNvIGEgdmlld2VyIGluIGFueSB6b25lIHNlZXMgdGhlIGRheXNcbi8vIHNlbnQuIEJvdGggZGF5czogSW50bCdzIHJhbmdlIGluIHRoZSBsb2NhbGUgKCdTZXAgMSDigJMgMzAsIDIwMjYnIGluIGVuLVVTLFxuLy8gJzHigJMzMCBzZXB0LiAyMDI2JyBpbiBmci1DQSwgb25lIGRhdGUgd2hlbiB0aGV5IGFyZSB0aGUgc2FtZSBkYXkpLiBPbmUgZGF5OlxuLy8gYW4gb3BlbiB3aW5kb3cgKCdTaW5jZSBTZXAgMSwgMjAyNicsICdUaHJvdWdoIFNlcCAzMCwgMjAyNicpLiBOZWl0aGVyLCBvclxuLy8gZGF5cyB0aGF0IGFyZSBub3QgcmVhbCBvbmVzOiAnJy5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXlSYW5nZShcbiAgc3RhcnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGVuZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0gREFZX1NIT1JULFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZmlyc3QgPSBwYXJzZURheShzdGFydCk7XG4gIGNvbnN0IGxhc3QgPSBwYXJzZURheShlbmQpO1xuXG4gIGlmIChmaXJzdCAmJiBsYXN0KSB7XG4gICAgcmV0dXJuIHdyaXRlRGF5UmFuZ2UoZmlyc3QsIGxhc3QsIGxvY2FsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAoZmlyc3QpIHtcbiAgICByZXR1cm4gYFNpbmNlICR7Zm9ybWF0TG9jYWxEYXRlKGZpcnN0LCBsb2NhbGUsIG9wdGlvbnMpfWA7XG4gIH1cblxuICByZXR1cm4gbGFzdCA/IGBUaHJvdWdoICR7Zm9ybWF0TG9jYWxEYXRlKGxhc3QsIGxvY2FsZSwgb3B0aW9ucyl9YCA6ICcnO1xufVxuXG4vLyBUaGUgdGltZSBhIHdpbmRvdyBlbmRpbmcgdG9kYXkgaXMgY3V0IGF0OiB0aGUgc2VydmVyJ3MgVVRDXG4vLyAneXl5eS1NTS1kZCBISDptbTpzcycgaW5zdGFudCwgYXMgYSB0aW1lIG9mIGRheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gJydcbi8vIGZvciBub25lLCBvciBmb3IgYSB2YWx1ZSBvZiBhbm90aGVyIHNoYXBlLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRocm91Z2hUaW1lKFxuICB0aHJvdWdoOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGVUaW1lID0gdGhyb3VnaCA/IERBVEVfVElNRV9QQVRURVJOLmV4ZWModGhyb3VnaCkgOiBudWxsO1xuICBjb25zdCBpbnN0YW50ID0gZGF0ZVRpbWUgPyBwYXJzZUlTTyhgJHtkYXRlVGltZVsxXX1UJHtkYXRlVGltZVsyXX1aYCkgOiBudWxsO1xuXG4gIHJldHVybiBpbnN0YW50ICYmIGlzVmFsaWQoaW5zdGFudCkgPyBmb3JtYXRMb2NhbERhdGUoaW5zdGFudCwgbG9jYWxlLCBUSU1FX1NIT1JULCB0aW1lem9uZSkgOiAnJztcbn1cblxuLy8gQSBjb21wYXJpc29uIG9yIHRpbWVmcmFtZSB3aW5kb3cgaW4gb25lIGxpbmU6IGl0cyBkYXlzLCBhbmQgdGhlIHRpbWUgaXQgaXNcbi8vIGN1dCBhdCB3aGVuIGl0IGVuZHMgdG9kYXkgb24gYSBkYXRlLWFuZC10aW1lIGNvbHVtbiAoJ09jdCAxIOKAkyAyLCAyMDI2LFxuLy8gdW50aWwgMjoyMyBQTScpLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERheVdpbmRvdyhcbiAgbWV0YTogeyBzdGFydDogc3RyaW5nIHwgbnVsbDsgZW5kOiBzdHJpbmcgfCBudWxsOyB0aHJvdWdoPzogc3RyaW5nIHwgbnVsbCB9LFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRheXMgPSBmb3JtYXREYXlSYW5nZShtZXRhLnN0YXJ0LCBtZXRhLmVuZCwgbG9jYWxlKTtcbiAgY29uc3QgdGltZSA9IGZvcm1hdFRocm91Z2hUaW1lKG1ldGEudGhyb3VnaCwgdGltZXpvbmUsIGxvY2FsZSk7XG5cbiAgcmV0dXJuIGRheXMgJiYgdGltZSA/IGAke2RheXN9LCB1bnRpbCAke3RpbWV9YCA6IGRheXM7XG59XG5cbi8vIFdoZXRoZXIgYSBjb21wYXJpc29uIGlzIHJlYWQgb24gb25lIGRheTogYSBjb21wYXJpc29uIG9mIHZhbHVlcyByZWFkIGF0XG4vLyB0aGUgZW5kIG9mIGVhY2ggcGVyaW9kLCB3aXRoIG5vIHRpbWUgYXhpcyBvZiBpdHMgb3duIChhIEtQSSwgYSBvbmUtcm93XG4vLyBsaXN0KSwgd2hvc2UgdmFsdWUgaXMgcmVhZCB0b2RheSBhbmQgd2hvc2UgcHJpb3IgaXMgcmVhZCBhdCB0aGUgZW5kIG9mXG4vLyB0aGUgcGVyaW9kIGJlZm9yZS4gSXRzIHR3byB3aW5kb3dzIGFyZSB0aG9zZSBwZXJpb2RzLCBiYWNrIHRvIGJhY2ssIGFuZFxuLy8gZWFjaCB2YWx1ZSBpcyByZWFkIG9uIGl0cyB3aW5kb3cncyBsYXN0IGRheSwgc28gdGhlIHdpbmRvd3MgYXJlIHdyaXR0ZW4gYXNcbi8vIHRob3NlIGRheXMgKGZvcm1hdFJlYWRpbmdEYXkpLiBBIHNwaW5lIG9mIHNldmVyYWwgcGVyaW9kcyBzZXRzIGVhY2ggcGVyaW9kXG4vLyBhZ2FpbnN0IGFuIGVhcmxpZXIgb25lLCBhbmQgaXRzIHdpbmRvd3MgYXJlIHNwYW5zIGxpa2UgYW55IG90aGVyXG4vLyBjb21wYXJpc29uJ3MuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkT25PbmVEYXkoY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IGNvbXBhcmlzb24/LmN1cnJlbnQ7XG4gIGNvbnN0IHByaW9yID0gY29tcGFyaXNvbj8ucHJpb3JzPy5bMF07XG5cbiAgaWYgKGNvbXBhcmlzb24/Lm1vZGUgIT09ICdwZXJpb2RfZW5kJyB8fCAhY3VycmVudCB8fCAhcHJpb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcmlvckVuZCA9IHBhcnNlRGF5KHByaW9yLmVuZCk7XG4gIGNvbnN0IGN1cnJlbnRTdGFydCA9IHBhcnNlRGF5KGN1cnJlbnQuc3RhcnQpO1xuXG4gIHJldHVybiAhIXByaW9yRW5kICYmICEhY3VycmVudFN0YXJ0ICYmIGFkZERheXMocHJpb3JFbmQsIDEpLmdldFRpbWUoKSA9PT0gY3VycmVudFN0YXJ0LmdldFRpbWUoKTtcbn1cblxuLy8gVGhlIGRheSBhIHZhbHVlIGlzIHJlYWQgb246ICdvbiBTZXAgMTUsIDIwMjYnICgnT24g4oCmJyB0byBvcGVuIGEgbGluZSksIGFzXG4vLyBhIGNoYXJ0J3MgdG9vbHRpcCBuYW1lcyBhIHByaW9yIHBvaW50IHJlYWQgYXQgdGhlIGVuZCBvZiBpdHMgcGVyaW9kLiAnJ1xuLy8gZm9yIGEgZGF5IHRoYXQgaXMgbm90IGEgcmVhbCBvbmUuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVhZGluZ0RheShcbiAgd2luZG93OiBQaWNrPENvbXBhcmlzb25XaW5kb3csICdlbmQnPixcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGxlYWQgPSBmYWxzZSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRheSA9IGZvcm1hdERheSh3aW5kb3cuZW5kLCBsb2NhbGUpO1xuXG4gIGlmICghZGF5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGxlYWQgPyBgT24gJHtkYXl9YCA6IGBvbiAke2RheX1gO1xufVxuXG4vLyBPbmUgJ3l5eXktTU0tZGQnIGRheSBpbiB0aGUgbG9jYWxlLCB3cml0dGVuIHdpdGggbm8gem9uZTogJ1NlcCAxLCAyMDI2Jy5cbmZ1bmN0aW9uIGZvcm1hdERheShkYXk6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBjb25zdCBkYXRlID0gcGFyc2VEYXkoZGF5KTtcblxuICByZXR1cm4gZGF0ZSA/IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCkgOiAnJztcbn1cblxuLy8gQSAneXl5eS1NTS1kZCcgZGF5IGFzIGxvY2FsIG1pZG5pZ2h0LCBvciBudWxsIHdoZW4gaXQgaXMgbm90IGEgcmVhbCBkYXkuXG5mdW5jdGlvbiBwYXJzZURheShkYXk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB7XG4gIGlmICghZGF5IHx8ICFEQVRFX09OTFlfUEFUVEVSTi50ZXN0KGRheSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBwYXJzZUlTTyhkYXkpO1xuXG4gIHJldHVybiBpc1ZhbGlkKGRhdGUpID8gZGF0ZSA6IG51bGw7XG59XG5cbi8vIEludGwncyByYW5nZSB3cml0ZXMgdGhlIHNoYXJlZCBtb250aCBhbmQgeWVhciBvbmNlLiBBIG1hbGZvcm1lZCBsb2NhbGVcbi8vIHJlYWRzIHRoZSBmYWxsYmFjazsgYSBydW50aW1lIHRoYXQgY2Fubm90IHdyaXRlIHJhbmdlcyBqb2lucyB0d28gZGF0ZXMuXG5mdW5jdGlvbiB3cml0ZURheVJhbmdlKGZpcnN0OiBEYXRlLCBsYXN0OiBEYXRlLCBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZywgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBbZnJvbSwgdG9dID0gZmlyc3QgPD0gbGFzdCA/IFtmaXJzdCwgbGFzdF0gOiBbbGFzdCwgZmlyc3RdO1xuXG4gIGZvciAoY29uc3QgdGFnIG9mIFtsb2NhbGUsIHJlc29sdmVSZXBvcnRMb2NhbGUobG9jYWxlKV0pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRhdGVGb3JtYXQodGFnLCBvcHRpb25zKS5mb3JtYXRSYW5nZShmcm9tLCB0byk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbmV4dCBsb2NhbGUsIHRoZW4gdGhlIGpvaW5lZCBkYXRlcy5cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYCR7Zm9ybWF0TG9jYWxEYXRlKGZyb20sIGxvY2FsZSwgb3B0aW9ucyl9IOKAkyAke2Zvcm1hdExvY2FsRGF0ZSh0bywgbG9jYWxlLCBvcHRpb25zKX1gO1xufVxuXG5cbi8vIEVuZ2xpc2ggbmFtZXMgZm9yIGEgbG9jYWxlIGFuZCBhIGN1cnJlbmN5LCBmb3IgdGhlIHNldHRpbmdzIHNlbGVjdHMuIFRoZVxuLy8gaW50ZXJmYWNlIHN0YXlzIEVuZ2xpc2ggd2hhdGV2ZXIgdGhlIHJlcG9ydCdzIGxvY2FsZTogJ2ZyLUNBJyByZWFkc1xuLy8gJ0NhbmFkaWFuIEZyZW5jaCcsICdDQUQnIHJlYWRzICdDYW5hZGlhbiBEb2xsYXInLiBBIHJ1bnRpbWUgd2l0aG91dCB0aGVcbi8vIG5hbWVzIHNob3dzIHRoZSBjb2RlLlxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsZU5hbWUodGFnOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICByZXR1cm4gZGlzcGxheU5hbWUoJ2xhbmd1YWdlJywgdGFnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbmN5TmFtZShjb2RlOiBSZXBvcnRDdXJyZW5jeUNvZGUpOiBzdHJpbmcge1xuICByZXR1cm4gZGlzcGxheU5hbWUoJ2N1cnJlbmN5JywgY29kZSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlOYW1lKHR5cGU6ICdsYW5ndWFnZScgfCAnY3VycmVuY3knLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgSW50bC5EaXNwbGF5TmFtZXMoWydlbiddLCB7IHR5cGUgfSkub2YoY29kZSkgPz8gY29kZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbn1cblxuXG4vLyBDb21wYXJpc29uLCB3aW5kb3cgYW5kIEtQSSB3b3JkaW5nLiBUaGUgc2VydmVyIHNlbmRzIGNvZGVzIGFuZCBmaWVsZHMsXG4vLyBuZXZlciBzZW50ZW5jZXMgKGEgd2luZG93J3MgZGVzY3JpcHRpb24gaXMgZm9yIHRoZSBhZ2VudCBhbmQgdGhlIGV4cG9ydHMnXG4vLyBub3Rlcywgbm90IHRoZSBzY3JlZW4pOyB0aGUgaW50ZXJmYWNlIHdvcmRzIHRoZW0gaGVyZSwgaW4gRW5nbGlzaCBsaWtlXG4vLyBldmVyeSBvdGhlciBsYWJlbCwgd2l0aCBhbnkgZGF5IHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cblxuY29uc3QgR1JBTlVMQVJJVFlfVU5JVFM6IFJlY29yZDxDaGFydEdyYW51bGFyaXR5LCB7IG9uZTogc3RyaW5nOyBtYW55OiBzdHJpbmcgfT4gPSB7XG4gIGRheTogeyBvbmU6ICdkYXknLCBtYW55OiAnZGF5cycgfSxcbiAgd2VlazogeyBvbmU6ICd3ZWVrJywgbWFueTogJ3dlZWtzJyB9LFxuICBtb250aDogeyBvbmU6ICdtb250aCcsIG1hbnk6ICdtb250aHMnIH0sXG4gIHF1YXJ0ZXI6IHsgb25lOiAncXVhcnRlcicsIG1hbnk6ICdxdWFydGVycycgfSxcbiAgeWVhcjogeyBvbmU6ICd5ZWFyJywgbWFueTogJ3llYXJzJyB9LFxufTtcblxuLy8gV2hhdCBhIHByaW9yIGxhbmUgaXMgY2FsbGVkOiBhbHdheXMgc28gZm9yIGEgbmFtZWQgcGVyaW9kLCBhbmQgZm9yIHRoZVxuLy8gcHJldmlvdXMgcGVyaW9kIHdoZW4gdGhlIHNlcnZlciBuYW1lcyBubyB1bml0IGZvciBpdC5cbmNvbnN0IEFHQUlOU1RfUEhSQVNFUzogUmVjb3JkPENvbXBhcmlzb25BZ2FpbnN0LCBzdHJpbmc+ID0ge1xuICBwcmV2aW91c19wZXJpb2Q6ICdwcmV2aW91cyBwZXJpb2QnLFxuICBwcmV2aW91c193ZWVrOiAncHJldmlvdXMgd2VlaycsXG4gIHByZXZpb3VzX21vbnRoOiAncHJldmlvdXMgbW9udGgnLFxuICBwcmV2aW91c19xdWFydGVyOiAncHJldmlvdXMgcXVhcnRlcicsXG4gIHByZXZpb3VzX3llYXI6ICdwcmV2aW91cyB5ZWFyJyxcbiAgcmFuZ2U6ICdjdXN0b20gcmFuZ2UnLFxufTtcblxuLy8gQSBwcmlvciBsYW5lJ3MgbGFiZWwsIGZyb20gaXRzIG9mZnNldCByYXRoZXIgdGhhbiBmcm9tIHRoZSBtZWFzdXJlLCBzbyBhXG4vLyBjaGFydCByZWdyb3VwZWQgYnkgdGhlIHZpZXdlciBzYXlzIHdoYXQgaXQgbm93IGNvbXBhcmVzLiBBIG5hbWVkIHBlcmlvZFxuLy8gcmVhZHMgYnkgaXRzIG5hbWUgd2hhdGV2ZXIgc2hpZnQgY2FycmllcyBpdCAoJ3ZzIHByZXZpb3VzIHF1YXJ0ZXInIGZvciAzXG4vLyBtb250aHMsICd2cyBwcmV2aW91cyB5ZWFyJyBmb3IgMzY0IGRheXMgb3IgNTIgd2Vla3MsICd2cyBjdXN0b20gcmFuZ2UnKS5cbi8vIE9ubHkgdGhlIHByZXZpb3VzIHBlcmlvZCBpcyB3b3JkZWQgZnJvbSBpdHMgdW5pdCBhbmQgY291bnQ6ICd2cyBwcmV2aW91c1xuLy8gd2VlaycsICd2cyBwcmV2aW91cyAzIG1vbnRocycsICd2cyBwcmV2aW91cyA4IGRheXMnIChhIGRheS1sZW5ndGggc2hpZnQpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmlzb25PZmZzZXRMYWJlbChvZmZzZXQ6IENvbXBhcmlzb25PZmZzZXQpOiBzdHJpbmcge1xuICByZXR1cm4gYHZzICR7b2Zmc2V0UGhyYXNlKG9mZnNldCl9YDtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0UGhyYXNlKG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCk6IHN0cmluZyB7XG4gIGlmIChvZmZzZXQuYWdhaW5zdCAhPT0gJ3ByZXZpb3VzX3BlcmlvZCcgfHwgIW9mZnNldC51bml0IHx8ICFvZmZzZXQuY291bnQpIHtcbiAgICByZXR1cm4gQUdBSU5TVF9QSFJBU0VTW29mZnNldC5hZ2FpbnN0XSA/PyBBR0FJTlNUX1BIUkFTRVMucHJldmlvdXNfcGVyaW9kO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldC5jb3VudCA9PT0gMVxuICAgID8gYHByZXZpb3VzICR7R1JBTlVMQVJJVFlfVU5JVFNbb2Zmc2V0LnVuaXRdLm9uZX1gXG4gICAgOiBgcHJldmlvdXMgJHtvZmZzZXQuY291bnR9ICR7R1JBTlVMQVJJVFlfVU5JVFNbb2Zmc2V0LnVuaXRdLm1hbnl9YDtcbn1cblxuLy8gT25lIGNvbXBhcmlzb24gbm90ZSBhcyBhIHNlbnRlbmNlLiBUaGUgY29tcGFyaXNvbiwgd2hlbiBnaXZlbiwgbmFtZXMgdGhlXG4vLyBwZXJpb2QgY29tcGFyZWQgd2l0aCAoaXRzIGZpcnN0IHByaW9yIGxhbmUpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmlzb25Ob3RlVGV4dChcbiAgY29kZTogQ29tcGFyaXNvbk5vdGVDb2RlLFxuICBjb21wYXJpc29uPzogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvZmZzZXQgPSBjb21wYXJpc29uPy5vZmZzZXRzPy5bMF0gPz8gbnVsbDtcbiAgY29uc3QgY29tcGFyZWQgPSBvZmZzZXQgPyBgQ29tcGFyZWQgd2l0aCB0aGUgJHtvZmZzZXRQaHJhc2Uob2Zmc2V0KX1gIDogbnVsbDtcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlICdub193aW5kb3cnOlxuICAgICAgcmV0dXJuICdQaWNrIGEgZGF0ZSByYW5nZSB0byBzZWUgdGhlIGNvbXBhcmlzb24uJztcbiAgICBjYXNlICd1bml0X2luZmVycmVkJzpcbiAgICAgIHJldHVybiBjb21wYXJlZFxuICAgICAgICA/IGAke2NvbXBhcmVkfSwganVkZ2VkIGZyb20gdGhlIGRhdGVzIHBpY2tlZC5gXG4gICAgICAgIDogJ1RoZSBwZXJpb2QgY29tcGFyZWQgd2l0aCB3YXMganVkZ2VkIGZyb20gdGhlIGRhdGVzIHBpY2tlZC4nO1xuICAgIGNhc2UgJ3dpbmRvd19pbl9mdXR1cmUnOlxuICAgICAgcmV0dXJuICdUaGUgZGF0ZSByYW5nZSBzdGFydHMgYWZ0ZXIgdG9kYXksIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB5ZXQuJztcbiAgICBjYXNlICdvdGhlcl9kYXRlX2ZpbHRlcic6XG4gICAgICByZXR1cm4gJ0EgZGF0ZSBmaWx0ZXIgb24gYW5vdGhlciBjb2x1bW4gYWxzbyBhcHBsaWVzIHRvIGJvdGggcGVyaW9kcy4nO1xuICAgIGNhc2UgJ2dyYWluX2ZvbGxvd2VkJzpcbiAgICAgIHJldHVybiBjb21wYXJlZFxuICAgICAgICA/IGAke2NvbXBhcmVkfSwgZm9sbG93aW5nIHRoZSBncm91cGluZyBwaWNrZWQuYFxuICAgICAgICA6ICdUaGUgY29tcGFyaXNvbiBmb2xsb3dzIHRoZSBncm91cGluZyBwaWNrZWQuJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8vIFdoYXQgYSB3aW5kb3dlZCB2YWx1ZSBpczogJ1JvbGxpbmcgMy1tb250aCB0b3RhbCcsICdNb250aC10by1kYXRlIHRvdGFsJyxcbi8vICdSdW5uaW5nIHRvdGFsIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgZGF0YScsIHRoZW4gaXRzIGRheXMgd2hlbiB0aGUgc2VydmVyXG4vLyBzZW5kcyB0aGVtICgnUm9sbGluZyA3LWRheSBhdmVyYWdlLCBTZXAgMjQg4oCTIDMwLCAyMDI2JykuIGdyYW51bGFyaXR5IGlzIHRoZVxuLy8gZ3JvdXBpbmcgdGhlIHJvd3MgYXJlIGRyYXduIGF0IChDb21wb25lbnREYXRhLmdyYW51bGFyaXR5KSwgd2hpY2ggbmFtZXMgYVxuLy8gcm9sbGluZyB3aW5kb3cgYXV0aG9yZWQgaW4gcGVyaW9kcyBvZiB0aGUgYXhpcy5cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dUZXh0KFxuICBtZXRhOiBXaW5kb3dNZXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZ3JhbnVsYXJpdHk/OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRheXMgPSBmb3JtYXREYXlSYW5nZShtZXRhLnN0YXJ0LCBtZXRhLmVuZCwgbG9jYWxlKTtcbiAgY29uc3QgcGhyYXNlID0gd2luZG93UGhyYXNlKG1ldGEsIGdyYW51bGFyaXR5ID8/IG51bGwpO1xuXG4gIHJldHVybiBkYXlzID8gYCR7cGhyYXNlfSwgJHtkYXlzfWAgOiBwaHJhc2U7XG59XG5cbmZ1bmN0aW9uIHdpbmRvd1BocmFzZShtZXRhOiBXaW5kb3dNZXRhLCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IG1ldGEuYXZlcmFnZSA/ICdhdmVyYWdlJyA6ICd0b3RhbCc7XG5cbiAgc3dpdGNoIChtZXRhLmtpbmQpIHtcbiAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgIHJldHVybiBtZXRhLmZyb21CZWdpbm5pbmcgPyBgUnVubmluZyAke3ZhbHVlfSBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIGRhdGFgIDogYFJ1bm5pbmcgJHt2YWx1ZX1gO1xuICAgIGNhc2UgJ3RvX2RhdGUnOiB7XG4gICAgICBjb25zdCByZXNldCA9IG1ldGEucmVzZXRFdmVyeSA/IEdSQU5VTEFSSVRZX1VOSVRTW21ldGEucmVzZXRFdmVyeV0ub25lIDogbnVsbDtcblxuICAgICAgcmV0dXJuIHJlc2V0ID8gYCR7Y2FwaXRhbGl6ZShyZXNldCl9LXRvLWRhdGUgJHt2YWx1ZX1gIDogYFRvLWRhdGUgJHt2YWx1ZX1gO1xuICAgIH1cbiAgICBjYXNlICdyb2xsaW5nJzoge1xuICAgICAgY29uc3QgdW5pdCA9IG1ldGEudW5pdCA/PyBncmFudWxhcml0eTtcbiAgICAgIGNvbnN0IHNwYW4gPSBtZXRhLnBlcmlvZHMgPyBgJHttZXRhLnBlcmlvZHN9LSR7dW5pdCA/IEdSQU5VTEFSSVRZX1VOSVRTW3VuaXRdLm9uZSA6ICdwZXJpb2QnfSBgIDogJyc7XG5cbiAgICAgIHJldHVybiBgUm9sbGluZyAke3NwYW59JHt2YWx1ZX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNhcGl0YWxpemUodmFsdWUpO1xuICB9XG59XG5cbi8vIE9uZSB3aW5kb3cgbm90ZSBhcyBhIHNlbnRlbmNlLlxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd05vdGVUZXh0KFxuICBjb2RlOiBXaW5kb3dOb3RlQ29kZSxcbiAgbWV0YTogV2luZG93TWV0YSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGdyYW51bGFyaXR5PzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlICdzbmFwcGVkX3N0YXJ0Jzoge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtZXRhLnN0YXJ0ID8gZm9ybWF0RGF5KG1ldGEuc3RhcnQsIGxvY2FsZSkgOiAnJztcblxuICAgICAgcmV0dXJuIHN0YXJ0XG4gICAgICAgID8gYFRoZSBzdGFydCB3YXMgbW92ZWQgdG8gJHtzdGFydH0sIHRoZSBzdGFydCBvZiBpdHMgcGVyaW9kLCBzbyB0aGUgZmlyc3QgcGVyaW9kIGlzIHdob2xlLmBcbiAgICAgICAgOiAnVGhlIHN0YXJ0IHdhcyBtb3ZlZCB0byB0aGUgc3RhcnQgb2YgaXRzIHBlcmlvZCwgc28gdGhlIGZpcnN0IHBlcmlvZCBpcyB3aG9sZS4nO1xuICAgIH1cbiAgICBjYXNlICdzcGFuX2NvbnZlcnRlZCc6XG4gICAgICByZXR1cm4gc3BhbkNvbnZlcnRlZFRleHQobWV0YSwgZ3JhbnVsYXJpdHkgPz8gbnVsbCk7XG4gICAgY2FzZSAnZ3JhaW5fdG9vX2NvYXJzZSc6XG4gICAgICByZXR1cm4gJ1RoZSBncm91cGluZyBpcyBjb2Fyc2VyIHRoYW4gdGhlIHdpbmRvdywgc28gaXQgaGFzIG5vIHZhbHVlcyBhdCB0aGlzIGdyb3VwaW5nLic7XG4gICAgY2FzZSAnZXF1YWxfZ3JhaW5fcGxhaW4nOlxuICAgICAgcmV0dXJuICdBdCB0aGlzIGdyb3VwaW5nIGVhY2ggd2luZG93IGlzIGEgc2luZ2xlIHBlcmlvZCwgc28gdGhlIHZhbHVlcyBhcmUgdGhlIHBsYWluIG9uZXMuJztcbiAgICBjYXNlICdvd25fZmlsdGVyX2NhcHNfbGVhZF9pbic6XG4gICAgICByZXR1cm4gJ1RoZSBxdWVyeVxcJ3Mgb3duIGRhdGUgY29uZGl0aW9uIHN0YXJ0cyB0aGUgd2luZG93LCBzbyBlYXJsaWVyIHJvd3MgYXJlIG5vdCBjb3VudGVkLic7XG4gICAgY2FzZSAnd2Vla19ieV9tb25kYXknOlxuICAgICAgcmV0dXJuICdBIHdlZWsgdGhhdCBzcGFucyB0d28gcGVyaW9kcyBjb3VudHMgdG93YXJkIHRoZSBwZXJpb2QgaXRzIE1vbmRheSBmYWxscyBpbi4nO1xuICAgIGNhc2UgJ2luY29tcGxldGVfaGVhZCc6XG4gICAgICByZXR1cm4gJ1RoZSBmaXJzdCBwZXJpb2RzIGFyZSBibGFuayBiZWNhdXNlIHRoZXJlIGFyZSBub3QgZW5vdWdoIGVhcmxpZXIgcm93cyB0byBmaWxsIGEgd2hvbGUgd2luZG93Lic7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vLyAnMyBtb250aHMgYXJlIHNob3duIGFzIDEzIHdlZWtzIGF0IHRoaXMgZ3JvdXBpbmcuJ1xuZnVuY3Rpb24gc3BhbkNvbnZlcnRlZFRleHQobWV0YTogV2luZG93TWV0YSwgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFtZXRhLnBlcmlvZHMgfHwgIW1ldGEudW5pdCB8fCAhbWV0YS5kcmF3blBlcmlvZHMpIHtcbiAgICByZXR1cm4gJ1RoZSB3aW5kb3dcXCdzIHNwYW4gd2FzIGNvbnZlcnRlZCB0byB0aGUgZ3JvdXBpbmcgc2hvd24uJztcbiAgfVxuXG4gIGNvbnN0IGF1dGhvcmVkID0gdW5pdENvdW50KG1ldGEucGVyaW9kcywgbWV0YS51bml0KTtcbiAgY29uc3QgZHJhd24gPSBncmFudWxhcml0eVxuICAgID8gdW5pdENvdW50KG1ldGEuZHJhd25QZXJpb2RzLCBncmFudWxhcml0eSlcbiAgICA6IGAke21ldGEuZHJhd25QZXJpb2RzfSAke21ldGEuZHJhd25QZXJpb2RzID09PSAxID8gJ3BlcmlvZCcgOiAncGVyaW9kcyd9YDtcblxuICByZXR1cm4gYCR7YXV0aG9yZWR9ICR7bWV0YS5wZXJpb2RzID09PSAxID8gJ2lzJyA6ICdhcmUnfSBzaG93biBhcyAke2RyYXdufSBhdCB0aGlzIGdyb3VwaW5nLmA7XG59XG5cbmZ1bmN0aW9uIHVuaXRDb3VudChjb3VudDogbnVtYmVyLCB1bml0OiBDaGFydEdyYW51bGFyaXR5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvdW50fSAke2NvdW50ID09PSAxID8gR1JBTlVMQVJJVFlfVU5JVFNbdW5pdF0ub25lIDogR1JBTlVMQVJJVFlfVU5JVFNbdW5pdF0ubWFueX1gO1xufVxuXG4vLyBXaHkgYSBLUEkncyBkZWx0YSByZWFkcyBhcyBpdCBkb2VzLCBhcyBhIHNlbnRlbmNlLiBUaGUgYmFzZWxpbmUgaXMgbmFtZWRcbi8vIGJ5IHdoYXQgdGhlIHZhbHVlIGlzIGNvbXBhcmVkIGFnYWluc3Q6IHRoZSBzYW1lIHBlcmlvZCBsYXN0IHllYXIgZm9yIGFcbi8vIHllYXItb24teWVhciBjb21wYXJpc29uLCBlbHNlIHRoZSBwZXJpb2QgYmVmb3JlLlxuZXhwb3J0IGZ1bmN0aW9uIGtwaU5vdGVUZXh0KGNvZGU6IEtwaU5vdGVDb2RlLCBhZ2FpbnN0PzogQ29tcGFyaXNvbkFnYWluc3QgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZWxpbmUgPSBrcGlCYXNlbGluZVRleHQoYWdhaW5zdCk7XG5cbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAnbm9fcHJpb3JfZGF0YSc6XG4gICAgICByZXR1cm4gYE5vIGJhc2VsaW5lOiAke2Jhc2VsaW5lfSBoYXMgbm8gZGF0YS5gO1xuICAgIGNhc2UgJ3VwX2Zyb21femVybyc6XG4gICAgICByZXR1cm4gYE5ldzogJHtiYXNlbGluZX0gd2FzIDAuYDtcbiAgICBjYXNlICdub19jaGFuZ2UnOlxuICAgICAgcmV0dXJuIGBObyBjaGFuZ2UgZnJvbSAke2Jhc2VsaW5lfS5gO1xuICAgIGNhc2UgJ25vX2RhdGFfZWl0aGVyJzpcbiAgICAgIHJldHVybiAnTm8gZGF0YSBpbiBlaXRoZXIgcGVyaW9kLic7XG4gICAgY2FzZSAnc2lnbl9jaGFuZ2UnOlxuICAgICAgcmV0dXJuICdUaGUgdmFsdWUgY3Jvc3NlZCB6ZXJvLCBzbyB0aGVyZSBpcyBubyBwZXJjZW50IGNoYW5nZS4nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLy8gVGhlIHdpbmRvdyBhIEtQSSdzIHZhbHVlIGlzIGNvbXBhcmVkIHdpdGgsIGFzIGEgbm91biBwaHJhc2UuIEFuIHVua25vd24gb3Jcbi8vIG1pc3NpbmcgY29tcGFyaXNvbiByZWFkcyBhcyBuZXV0cmFsIHdvcmRpbmcgcmF0aGVyIHRoYW4gYSB3cm9uZyBwZXJpb2QuXG5mdW5jdGlvbiBrcGlCYXNlbGluZVRleHQoYWdhaW5zdDogQ29tcGFyaXNvbkFnYWluc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgc3dpdGNoIChhZ2FpbnN0KSB7XG4gICAgY2FzZSAncHJldmlvdXNfcGVyaW9kJzpcbiAgICAgIHJldHVybiAndGhlIHByZXZpb3VzIHBlcmlvZCc7XG4gICAgY2FzZSAncHJldmlvdXNfd2Vlayc6XG4gICAgICByZXR1cm4gJ3RoZSBwcmV2aW91cyB3ZWVrJztcbiAgICBjYXNlICdwcmV2aW91c19tb250aCc6XG4gICAgICByZXR1cm4gJ3RoZSBwcmV2aW91cyBtb250aCc7XG4gICAgY2FzZSAncHJldmlvdXNfcXVhcnRlcic6XG4gICAgICByZXR1cm4gJ3RoZSBwcmV2aW91cyBxdWFydGVyJztcbiAgICBjYXNlICdwcmV2aW91c195ZWFyJzpcbiAgICAgIHJldHVybiAndGhlIHNhbWUgcGVyaW9kIGxhc3QgeWVhcic7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAndGhlIGNvbXBhcmlzb24gcGVyaW9kJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXBpdGFsaXplKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4dC5zbGljZSgxKTtcbn1cblxuXG4vLyBBIHNob3J0LCBodW1hbiBsYWJlbCBmb3IgYSB6b25lOiBpdHMgY2l0eSBwbHVzIHRoZSBjdXJyZW50IGFiYnJldmlhdGlvbixcbi8vIGUuZy4gJ0FtZXJpY2EvTmV3X1lvcmsnIHJlYWRzICdOZXcgWW9yayAoRURUKScuIFVUQyBzdGF5cyAnVVRDJywgYW5kIGFuXG4vLyB1bmtub3duIHpvbmUgaXMgc2hvd24gYXMgaXRzIGlkLiBBbiAnRXRjLycgem9uZSBuYW1lcyBubyBjaXR5LCBhbmQgaXRzIFBPU0lYXG4vLyBzaWduIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBvZmZzZXQgKCdFdGMvR01UKzUnIGlzIEdNVC01KSwgc28gaXQgcmVhZHMgYXMgdGhlXG4vLyBhYmJyZXZpYXRpb24gYWxvbmU6ICdFdGMvVVRDJyBpcyAnVVRDJywgJ0V0Yy9HTVQrNScgaXMgJ0dNVC01Jy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZUxhYmVsKHRpbWV6b25lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodGltZXpvbmUgPT09ICdVVEMnKSB7XG4gICAgcmV0dXJuIHRpbWV6b25lO1xuICB9XG5cbiAgY29uc3Qgc2VnbWVudHMgPSB0aW1lem9uZS5zcGxpdCgnLycpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYWJicmV2aWF0aW9uID0gZm9ybWF0SW5UaW1lWm9uZShuZXcgRGF0ZSgpLCB0aW1lem9uZSwgJ3p6eicpO1xuXG4gICAgcmV0dXJuIHNlZ21lbnRzWzBdID09PSAnRXRjJ1xuICAgICAgPyBhYmJyZXZpYXRpb25cbiAgICAgIDogYCR7c2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0ucmVwbGFjZSgvXy9nLCAnICcpfSAoJHthYmJyZXZpYXRpb259KWA7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0aW1lem9uZTtcbiAgfVxufVxuXG5cbi8vIFwiTm93XCIgYXMgYSBEYXRlIHdob3NlIGxvY2FsIGZpZWxkcyByZWFkIHRoZSB3YWxsIGNsb2NrIGluIHRoZSBnaXZlbiB6b25lLCBzb1xuLy8gZGF0ZS1mbnMgY2FsZW5kYXIgYXJpdGhtZXRpYyAoc3RhcnRPZldlZWssIHN0YXJ0T2ZNb250aCwgLi4uKSBhbmRcbi8vIGRhdGVCb3VuZFN0cmluZygpIGxhbmQgb24gdGhlIHpvbmUncyBjYWxlbmRhciBkYXkgcmF0aGVyIHRoYW4gdGhlIGJyb3dzZXIncy5cbi8vIEFuIHVua25vd24gem9uZSBmYWxscyBiYWNrIHRvIHRoZSBicm93c2VyJ3MgY2xvY2suXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9uZWROb3codGltZXpvbmU6IHN0cmluZyk6IERhdGUge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgem9uZWQgPSB0b1pvbmVkVGltZShub3csIHRpbWV6b25lKTtcblxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oem9uZWQuZ2V0VGltZSgpKSA/IG5vdyA6IHpvbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbm93O1xuICB9XG59XG4iXX0=
|
|
1028
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQXNCckUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW9CLE9BQU8sQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBdUIsS0FBSyxDQUFDO0FBRWxFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFrQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pGLE1BQU0sRUFBRSxzQkFBc0I7SUFDOUIsUUFBUSxFQUFFLHdCQUF3QjtJQUNsQyxZQUFZLEVBQUUsSUFBSTtDQUNuQixDQUFDLENBQUM7QUFFSCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLHNEQUFzRDtBQUN0RCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBOEI7SUFDaEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxzQkFBc0IsQ0FB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Q3JELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkRGF5cywgaXNWYWxpZCwgcGFyc2VJU08gfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB0b1pvbmVkVGltZSB9IGZyb20gJ2RhdGUtZm5zLXR6JztcblxuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtbnVtYmVyLXVuaXRzLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0VmFsdWVGb3JtYXQgfSBmcm9tICcuL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBDaGFydE1lYXN1cmUsXG4gIENvbXBhcmlzb25BZ2FpbnN0LFxuICBDb21wYXJpc29uTm90ZUNvZGUsXG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIEtwaU5vdGVDb2RlLFxuICBOdW1iZXJGb3JtYXRTcGVjLFxuICBPdXRwdXRNZXRhLFxuICBPdXRwdXRSb2xlLFxuICBSZXBvcnQsXG4gIFJlcG9ydEN1cnJlbmN5Q29kZSxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxuICBXaW5kb3dOb3RlQ29kZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoYXQgYSByZXBvcnQgcmVhZHMgd2hlbiB0aGUgc2VydmVyIG5hbWVzIG5vIHVzYWJsZSBsb2NhbGUgb3IgY3VycmVuY3k6IGFuXG4vLyBvbGRlciBzZXJ2ZXIgdGhhdCBzZW5kcyBuZWl0aGVyLCBvciBhIHZhbHVlIHRoaXMgYnJvd3NlcidzIEludGwgY2Fubm90IHVzZS5cbi8vIE5ldmVyIHRoZSBicm93c2VyJ3Mgb3duIGxvY2FsZSwgc28gZXZlcnkgdmlld2VyIG9mIGEgcmVwb3J0IHNlZXMgdGhlIHNhbWUgdGV4dC5cbmV4cG9ydCBjb25zdCBSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFOiBSZXBvcnRMb2NhbGVUYWcgPSAnZW4tVVMnO1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWTogUmVwb3J0Q3VycmVuY3lDb2RlID0gJ1VTRCc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUk1BVF9DT05URVhUOiBSZWFkb25seTxSZXBvcnRGb3JtYXRDb250ZXh0PiA9IE9iamVjdC5mcmVlemUoe1xuICBsb2NhbGU6IFJFUE9SVF9GQUxMQkFDS19MT0NBTEUsXG4gIGN1cnJlbmN5OiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1ksXG4gIHJhdGlvUGVyY2VudDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBDVVJSRU5DWV9QQVRURVJOID0gL15bQS1aXXszfSQvO1xuXG5cbi8vIFRoZSBzZXJ2ZXIncyByZXNvbHZlZCBsb2NhbGUgYXMgb25lIHRoaXMgYnJvd3NlciBjYW4gZm9ybWF0IGluLiBBIG1hbGZvcm1lZFxuLy8gdGFnICgnZW5fQ0EnKSBtYWtlcyBzdXBwb3J0ZWRMb2NhbGVzT2YgdGhyb3csIGFuZCBvbmUgSW50bCBoYXMgbm8gZGF0YSBmb3Jcbi8vICgneHgtWVknKSBjb21lcyBiYWNrIGVtcHR5OyBib3RoIHJlYWQgdGhlIGZhbGxiYWNrLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZXBvcnRMb2NhbGUodGFnOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0TG9jYWxlVGFnIHtcbiAgaWYgKCF0YWcpIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEludGwuTnVtYmVyRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihbdGFnXSlbMF0gPz8gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFJFUE9SVF9GQUxMQkFDS19MT0NBTEU7XG4gIH1cbn1cblxuLy8gVGhlIHNlcnZlcidzIHJlc29sdmVkIGN1cnJlbmN5IGFzIG9uZSBJbnRsIGNhbiBsYWJlbC4gVGhlIHNlcnZlciBkZWNpZGVzXG4vLyB3aGljaCBjb2RlcyBuYW1lIG1vbmV5OyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYSBjb2RlIEludGwgY2Fubm90IHRha2UgYXRcbi8vIGFsbC4gSXQgaXMgbmV2ZXIgY2hlY2tlZCBhZ2FpbnN0IHRoZSBydW50aW1lJ3Mgb3duIGN1cnJlbmN5IGxpc3QsIHdoaWNoXG4vLyBkaWZmZXJzIGJldHdlZW4gYnJvd3NlcnMgYW5kIGxlYXZlcyBvdXQgY29kZXMgdGhlIHNlcnZlciBvZmZlcnMgKFZFRiwgTVJPKSxcbi8vIHNvIGV2ZXJ5IHZpZXdlciBsYWJlbHMgYSByZXBvcnQncyBtb25leSB0aGUgc2FtZSB3YXkuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnRDdXJyZW5jeUNvZGUge1xuICBpZiAoIWNvZGUgfHwgIUNVUlJFTkNZX1BBVFRFUk4udGVzdChjb2RlKSkge1xuICAgIHJldHVybiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1k7XG4gIH1cblxuICB0cnkge1xuICAgIG51bWJlckZvcm1hdChSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogY29kZSB9KTtcblxuICAgIHJldHVybiBjb2RlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0NVUlJFTkNZO1xuICB9XG59XG5cbi8vIFRoZSBvbmUgcGxhY2UgYSByZXBvcnQncyBmb3JtYXQgY29udGV4dCBpcyBidWlsdDogdGhlIHNlcnZlcidzIGVmZmVjdGl2ZVxuLy8gbG9jYWxlIGFuZCBjdXJyZW5jeSAoYWJzZW50IG9uIGFuIG9sZGVyIHNlcnZlciwgd2hpY2ggdGhlbiByZWFkcyBlbi1VUy9VU0QpXG4vLyBhbmQgd2hldGhlciBpdHMgcGVyY2VudCBtZWFzdXJlcyBhcnJpdmUgYXMgMC0xIHJhdGlvcy5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm9ybWF0Q29udGV4dChcbiAgcmVwb3J0OiBQaWNrPFJlcG9ydCwgJ2VmZmVjdGl2ZUxvY2FsZScgfCAnZWZmZWN0aXZlQ3VycmVuY3knIHwgJ3BlcmNlbnRGb3JtYXQnPixcbik6IFJlcG9ydEZvcm1hdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGxvY2FsZTogcmVzb2x2ZVJlcG9ydExvY2FsZShyZXBvcnQuZWZmZWN0aXZlTG9jYWxlKSxcbiAgICBjdXJyZW5jeTogcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSksXG4gICAgcmF0aW9QZXJjZW50OiByZXBvcnQucGVyY2VudEZvcm1hdCA9PT0gJ3JhdGlvJyxcbiAgfTtcbn1cblxuXG4vLyBCdWlsZGluZyBhbiBJbnRsIGZvcm1hdHRlciBpcyBmYXIgc2xvd2VyIHRoYW4gdXNpbmcgb25lLCBhbmQgYSBjaGFydCBmb3JtYXRzXG4vLyBldmVyeSB0aWNrIGFuZCB0b29sdGlwIHZhbHVlLCBzbyBlYWNoIGRpc3RpbmN0IGxvY2FsZSArIG9wdGlvbnMgKCsgem9uZSkgaXNcbi8vIGJ1aWx0IG9uY2UgYW5kIHJldXNlZC5cbmNvbnN0IE5VTUJFUl9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuTnVtYmVyRm9ybWF0PigpO1xuY29uc3QgREFURV9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuRGF0ZVRpbWVGb3JtYXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGb3JtYXQobG9jYWxlOiBzdHJpbmcsIG9wdGlvbnM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyk6IEludGwuTnVtYmVyRm9ybWF0IHtcbiAgY29uc3Qga2V5ID0gYCR7bG9jYWxlfXwke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWA7XG4gIGxldCBmb3JtYXR0ZXIgPSBOVU1CRVJfRk9STUFUUy5nZXQoa2V5KTtcblxuICBpZiAoIWZvcm1hdHRlcikge1xuICAgIGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIG9wdGlvbnMpO1xuICAgIE5VTUJFUl9GT1JNQVRTLnNldChrZXksIGZvcm1hdHRlcik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVyO1xufVxuXG4vLyBObyB6b25lIGZvcm1hdHMgaW4gdGhlIGJyb3dzZXIncyBvd24gem9uZSwgd2hpY2ggaXMgcmlnaHQgZm9yIGEgY2FsZW5kYXIgZGF5XG4vLyBwYXJzZWQgYXMgbG9jYWwgbWlkbmlnaHQ6IHRoZSBkYXkgcHJpbnRlZCBpcyB0aGUgZGF5IHN0b3JlZC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRm9ybWF0KFxuICBsb2NhbGU6IHN0cmluZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gIHRpbWVab25lPzogc3RyaW5nLFxuKTogSW50bC5EYXRlVGltZUZvcm1hdCB7XG4gIGNvbnN0IGtleSA9IGAke2xvY2FsZX18JHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX18JHt0aW1lWm9uZSA/PyAnJ31gO1xuICBsZXQgZm9ybWF0dGVyID0gREFURV9GT1JNQVRTLmdldChrZXkpO1xuXG4gIGlmICghZm9ybWF0dGVyKSB7XG4gICAgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IC4uLm9wdGlvbnMsIHRpbWVab25lIH0pO1xuICAgIERBVEVfRk9STUFUUy5zZXQoa2V5LCBmb3JtYXR0ZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlcjtcbn1cblxuXG4vLyBOdW1iZXIgZm9ybWF0dGluZzogdGhlIG9uZSBlbmdpbmUgYmVoaW5kIGV2ZXJ5IG51bWVyaWMgc2xvdCAoYSBjaGFydFxuLy8gbWVhc3VyZSwgYSBLUEkgbWVhc3VyZSwgYSBsaXN0IGNvbHVtbiwgYSBjcm9zcy10YWIncyBjZWxscyksIHNvIGEgZm9ybWF0XG4vLyBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiBzY3JlZW4sIGluIHRoZSBQREYgYW5kIGluIFBvd2VyUG9pbnQuIFRoZSBkYXRhIHN0YXlzXG4vLyByYXc7IG9ubHkgd2hhdCBpcyBzaG93biBjaGFuZ2VzLiBUaGUgcnVsZXM6XG4vLyAtIEVtcHR5OiBudWxsLCB1bmRlZmluZWQsICcnLCAnLScgYW5kIGEgbm9uLWZpbml0ZSBudW1iZXIgcHJpbnQgdGhlIGNhbGxlcidzXG4vLyAgIGBlbXB0eWAgKCfigJQnIHVubGVzcyBpdCBuYW1lcyBhbm90aGVyKS5cbi8vIC0gTnVtZXJpYzogYSBmaW5pdGUgbnVtYmVyLCBvciBhIHN0cmluZyB0aGF0IHNwZWxscyBvbmUgcGxhaW5seSAoJzEyMzQuNTAnLFxuLy8gICAnLTNlMicpLiBBbnl0aGluZyBlbHNlICgnJDEsMjM0JywgYW4gaWQgd2l0aCBsZXR0ZXJzLCAnICcpIHByaW50cyBhcyBpdFxuLy8gICBjYW1lLCBzaW5jZSBhIGNvbHVtbiB0aGUgU1FMIGFscmVhZHkgZm9ybWF0dGVkIGlzIHRleHQuXG4vLyAtIFN0eWxlczogbnVtYmVyIGlzIGEgcGxhaW4gZGVjaW1hbDsgY3VycmVuY3kgaXMgdGhlIHJlcG9ydCdzIGN1cnJlbmN5XG4vLyAgIHdyaXR0ZW4gaW4gaXRzIGxvY2FsZSB3aXRoIGl0cyBzeW1ib2wgKFVTRCByZWFkcyAnJDEsMjM1JyBpbiBlbi1VUyBhbmRcbi8vICAgJ1VTJDEsMjM1JyBpbiBlbi1DQTsgRVVSIHJlYWRzICcxIDIzNSDigqwnIGluIGZyLUZSKTsgcGVyY2VudCB0YWtlcyBhIDAtMVxuLy8gICByYXRpbyAoMC4zIHJlYWRzIDMwJSksIG9yLCBmcm9tIGFuIG9sZGVyIHNlcnZlciB0aGF0IHNlbmRzIHBlcmNlbnQgdmFsdWVzXG4vLyAgIGFscmVhZHkgeDEwMCwgYSBkZWNpbWFsIHdpdGggYSAlIHNpZ24uIFByZWNpc2lvbiBvciB1bml0cyB3aXRob3V0IGEgZm9ybWF0XG4vLyAgIG1lYW4gbnVtYmVyLlxuLy8gLSBEZWNpbWFsczogYSBwcmVjaXNpb24gcGlucyBib3RoIHRoZSBtaW5pbXVtIGFuZCB0aGUgbWF4aW11bSwgc28gYSBjb2x1bW5cbi8vICAgb2YgcmF0ZXMgbGluZXMgdXAuIFdpdGhvdXQgb25lOiBhdCBtb3N0IG9uZSBmb3IgYSBwZXJjZW50IGFuZCBmb3IgYW5cbi8vICAgYWJicmV2aWF0ZWQgdmFsdWUgKDEuMkspLCB3aG9sZSB1bml0cyBmb3IgY3VycmVuY3ksIHRoZSBsb2NhbGUncyBkZWZhdWx0XG4vLyAgIGZvciBhIG51bWJlci5cbi8vIC0gVW5pdHM6IHRob3VzYW5kcyBhbmQgbWlsbGlvbnMgZGl2aWRlIGFuZCBhZGQgYSBLIG9yIE0gYWZ0ZXIgdGhlIGRpZ2l0c1xuLy8gICAoJyQxLjJLJywgJzEsMksgJCcpOyBhdXRvIHBpY2tzIHBlciB2YWx1ZSBieSBzaXplLCBhbmQgYSB2YWx1ZSB0aGF0IHdvdWxkXG4vLyAgIHJvdW5kIHRvIDEwMDBLIHJlYWRzIDFNLiBVbml0cyBuZXZlciBhcHBseSB0byBhIHBlcmNlbnQuXG4vLyAtIE5lZ2F0aXZlcyBrZWVwIHRoZSBsb2NhbGUncyBsZWFkaW5nIG1pbnVzLiBBIG5lZ2F0aXZlIHRoYXQgcm91bmRzIHRvIHplcm9cbi8vICAgcHJpbnRzIGFzIHplcm8sIG5ldmVyICctMCcuXG4vLyAtIFJvdW5kaW5nIGlzIEludGwncywgb24gdGhlIGRpZ2l0cyBzaG93bi4gRXZlcnkgdmFsdWUgaXMgd3JpdHRlbiBpbiB0aGVcbi8vICAgY29udGV4dCdzIGxvY2FsZSwgbmV2ZXIgdGhlIGJyb3dzZXIncy5cblxuLy8gVGhlIG1vc3QgZGVjaW1hbHMgYSBwcmVjaXNpb24gcGluczogdGhlIHNlcnZlcidzIHNjaGVtYSBib3VuZC5cbmNvbnN0IE1BWF9QUkVDSVNJT04gPSA2O1xuLy8gQXQgbW9zdCBvbmUgZGVjaW1hbCBmb3IgYSBwZXJjZW50LCBhbmQgZm9yIGFuIGFiYnJldmlhdGVkIHZhbHVlICgxLjJLKS5cbmNvbnN0IFBFUkNFTlRfREVDSU1BTFMgPSAxO1xuY29uc3QgU0NBTEVEX0RFQ0lNQUxTID0gMTtcbi8vIE1vbmV5IHNob3dzIHdob2xlIHVuaXRzIHVubGVzcyBhIHByZWNpc2lvbiBhc2tzIGZvciBkZWNpbWFscy5cbmNvbnN0IENVUlJFTkNZX0RFQ0lNQUxTID0gMDtcbi8vIEEgY3VycmVuY3kgYXhpcyB3aG9zZSB0aWNrcyBuZWVkIGRlY2ltYWxzIHNob3dzIGNlbnRzLCBub3QgdGVudGhzLlxuY29uc3QgQ1VSUkVOQ1lfQVhJU19ERUNJTUFMUyA9IDI7XG4vLyBXaGF0IGEgbWlzc2luZyB2YWx1ZSBwcmludHMgdW5sZXNzIHRoZSBjYWxsZXIgbmFtZXMgaXRzIG93bi5cbmNvbnN0IEVNUFRZX1ZBTFVFID0gJ+KAlCc7XG4vLyBUaGUgdGljayBjb3VudCBhIHZhbHVlIGF4aXMgYWltcyBmb3IsIGFzIEVDaGFydHMnIHNwbGl0TnVtYmVyIGRlZmF1bHQuXG5jb25zdCBBWElTX1RJQ0tTID0gNTtcblxuLy8gQSBjaGFuZ2UncyBzaWduOiBhIHBsdXMgb24gYSBwb3NpdGl2ZSB2YWx1ZSwgbm90aGluZyBvbiB6ZXJvLlxuY29uc3QgU0lHTkVEOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7IHNpZ25EaXNwbGF5OiAnZXhjZXB0WmVybycgfTtcblxuY29uc3QgTlVNRVJJQ19QQVRURVJOID0gL15cXHMqWy0rXT8oXFxkK1xcLj9cXGQqfFxcLlxcZCspKFtlRV1bLStdP1xcZCspP1xccyokLztcbi8vIFRoZSBmb3JtYXRUb1BhcnRzIHR5cGVzIHRoYXQgY2FycnkgYSBudW1iZXIncyBkaWdpdHMgYW5kIHNlcGFyYXRvcnMuXG5jb25zdCBOVU1CRVJfUEFSVFMgPSBuZXcgU2V0PEludGwuTnVtYmVyRm9ybWF0UGFydFR5cGVzPihbJ2ludGVnZXInLCAnZ3JvdXAnLCAnZGVjaW1hbCcsICdmcmFjdGlvbiddKTtcbmNvbnN0IERJR0lUX1BBUlRTID0gbmV3IFNldDxJbnRsLk51bWJlckZvcm1hdFBhcnRUeXBlcz4oWydpbnRlZ2VyJywgJ2ZyYWN0aW9uJ10pO1xuXG4vLyBBIG51bWVyaWMgZm9ybWF0J3MgdW5pdHMgb25jZSBkZWNpZGVkOiBhdXRvIGlzIHJlc29sdmVkIHRvIG9uZSBvZiB0aGVzZS5cbmV4cG9ydCB0eXBlIFJlc29sdmVkVW5pdHMgPSBSZXBvcnROdW1iZXJVbml0cy5Ob25lIHwgUmVwb3J0TnVtYmVyVW5pdHMuVGhvdXNhbmRzIHwgUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnM7XG5cbmludGVyZmFjZSBVbml0U2NhbGUge1xuICBkaXZpc29yOiBudW1iZXI7XG4gIHN1ZmZpeDogc3RyaW5nO1xuICAvLyBUaGUgUG93ZXJQb2ludC9FeGNlbCBzY2FsaW5nIGNvbW1hczogZWFjaCBvbmUgZGl2aWRlcyBieSAxLDAwMC5cbiAgY29tbWFzOiBzdHJpbmc7XG59XG5cbmNvbnN0IFVOSVRfU0NBTEVTID0gbmV3IE1hcDxSZXNvbHZlZFVuaXRzLCBVbml0U2NhbGU+KFtcbiAgW1JlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcywgeyBkaXZpc29yOiAxZTMsIHN1ZmZpeDogJ0snLCBjb21tYXM6ICcsJyB9XSxcbiAgW1JlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zLCB7IGRpdmlzb3I6IDFlNiwgc3VmZml4OiAnTScsIGNvbW1hczogJywsJyB9XSxcbl0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE51bWJlck9wdGlvbnMge1xuICAvLyBXaGF0IGFuIGVtcHR5IHZhbHVlIHByaW50czogJ+KAlCcgZm9yIGEgS1BJIG9yIGEgdG9vbHRpcCwgJycgZm9yIGEgY2VsbC5cbiAgZW1wdHk/OiBzdHJpbmc7XG4gIC8vIFVuaXRzIGFscmVhZHkgZGVjaWRlZCBmb3IgdGhlIHdob2xlIGNoYXJ0LCBpbiBwbGFjZSBvZiB0aGUgc3BlYydzIG93bi5cbiAgdW5pdHM/OiBSZXNvbHZlZFVuaXRzO1xuICAvLyBEZWNpbWFscyBhbHJlYWR5IGRlY2lkZWQgZm9yIHRoZSB3aG9sZSBjaGFydCwgcGlubmVkIGFzIG1pbiBhbmQgbWF4LiBudWxsXG4gIC8vIGxlYXZlcyB0aGUgc3BlYydzIG93bi5cbiAgZGVjaW1hbHM/OiBudW1iZXIgfCBudWxsO1xuICAvLyBXcml0ZXMgYSBwbHVzIGJlZm9yZSBhIHBvc2l0aXZlIHZhbHVlLCBhcyBhIGNoYW5nZSByZWFkcyAoJysxMiUnKS4gWmVybyxcbiAgLy8gYW5kIGEgdmFsdWUgd2hvc2Ugc2hvd24gZGlnaXRzIGFyZSBhbGwgemVybywgc3RheXMgdW5zaWduZWQuXG4gIHNpZ25lZD86IGJvb2xlYW47XG59XG5cbi8vIEhvdyBhIGNoYXJ0J3MgdmFsdWUgYXhpcyB3cml0ZXMgaXRzIHRpY2tzLCBkZWNpZGVkIG9uY2UgcGVyIGNoYXJ0LlxuZXhwb3J0IGludGVyZmFjZSBDaGFydE51bWJlckZvcm1hdCB7XG4gIHVuaXRzOiBSZXNvbHZlZFVuaXRzO1xuICAvLyBQaW5uZWQgZGVjaW1hbHMsIG9yIG51bGwgZm9yIGEgcGxhaW4gbnVtYmVyIHdob3NlIHRpY2tzIGtlZXAgdGhlaXIgb3duLlxuICBkZWNpbWFsczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLy8gVGhlIHZhbHVlIGFzIGEgZmluaXRlIG51bWJlciB3aGVuIGl0IGlzIG9uZSBvciBwbGFpbmx5IHNwZWxscyBvbmUsIGVsc2Vcbi8vIG51bGwuXG5leHBvcnQgZnVuY3Rpb24gdG9GaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICFOVU1FUklDX1BBVFRFUk4udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIodmFsdWUpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykgPyBudW1lcmljIDogbnVsbDtcbn1cblxuLy8gV2hldGhlciBhIHNsb3QgYXNrcyB0byBiZSBmb3JtYXR0ZWQgYXQgYWxsLiBBIHNsb3Qgd2l0aG91dCB0aGVzZSBrZXlzLCBvciBhXG4vLyBsaXN0IGNvbHVtbiB3aG9zZSBmb3JtYXQgaXMgZGF0ZSwga2VlcHMgaXRzIG93biByZW5kZXJpbmcuIFVuaXRzIG5vbmUgaXMgdGhlXG4vLyBzYW1lIGFzIG5vIHVuaXRzIGtleSwgYXMgaXQgaXMgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBmdW5jdGlvbiBoYXNOdW1iZXJGb3JtYXQoc3BlYz86IE51bWJlckZvcm1hdFNwZWMgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYyB8fCBzcGVjLmZvcm1hdCA9PT0gUmVwb3J0TGlzdENvbHVtbkZvcm1hdC5EYXRlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlRm9ybWF0KHNwZWMpICE9PSBudWxsXG4gICAgfHwgKHNwZWMucHJlY2lzaW9uID8/IG51bGwpICE9PSBudWxsXG4gICAgfHwgKChzcGVjLnVuaXRzID8/IFJlcG9ydE51bWJlclVuaXRzLk5vbmUpICE9PSBSZXBvcnROdW1iZXJVbml0cy5Ob25lKTtcbn1cblxuLy8gVGhlIHVuaXRzIGEgdmFsdWUgaXMgd3JpdHRlbiBpbi4gYXV0byBkZWNpZGVzIGJ5IHRoZSBtYWduaXR1ZGU6IGEgbWlsbGlvblxuLy8gYW5kIHVwIHJlYWRzIE0sIGEgdGhvdXNhbmQgYW5kIHVwIEssIHVubGVzcyB0aGUgdmFsdWUgd291bGQgdGhlbiByb3VuZCB0b1xuLy8gMTAwMEsgYXQgdGhlc2UgZGVjaW1hbHMsIHdoaWNoIHJlYWRzIDFNIGluc3RlYWQuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVuaXRzKFxuICB1bml0czogUmVwb3J0TnVtYmVyVW5pdHMgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBtYWduaXR1ZGU6IG51bWJlcixcbiAgZGVjaW1hbHM6IG51bWJlcixcbik6IFJlc29sdmVkVW5pdHMge1xuICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHM6XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9uczpcbiAgICAgIHJldHVybiB1bml0cztcbiAgICBjYXNlIFJlcG9ydE51bWJlclVuaXRzLkF1dG86XG4gICAgICByZXR1cm4gYXV0b1VuaXRzKE1hdGguYWJzKG1hZ25pdHVkZSksIGRlY2ltYWxzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJlcG9ydE51bWJlclVuaXRzLk5vbmU7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0b1VuaXRzKG1hZ25pdHVkZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogUmVzb2x2ZWRVbml0cyB7XG4gIGlmIChtYWduaXR1ZGUgPj0gMWU2KSB7XG4gICAgcmV0dXJuIFJlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zO1xuICB9XG5cbiAgaWYgKG1hZ25pdHVkZSA8IDFlMykge1xuICAgIHJldHVybiBSZXBvcnROdW1iZXJVbml0cy5Ob25lO1xuICB9XG5cbiAgcmV0dXJuIHJvdW5kVG8obWFnbml0dWRlIC8gMWUzLCBkZWNpbWFscykgPj0gMTAwMFxuICAgID8gUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnNcbiAgICA6IFJlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcztcbn1cblxuLy8gVGhlIHZhbHVlIHJvdW5kZWQgYXMgSW50bCByb3VuZHMgaXQgZm9yIGRpc3BsYXksIHNvIHRoZSBLLXRvLU0gcHJvbW90aW9uXG4vLyBhZ3JlZXMgd2l0aCB0aGUgZGlnaXRzIGFjdHVhbGx5IHNob3duLlxuZnVuY3Rpb24gcm91bmRUbyh2YWx1ZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZGlnaXRzID0gY2xhbXBEZWNpbWFscyhkZWNpbWFscykgPz8gMDtcblxuICAvLyBBIGZpeGVkIGxvY2FsZSBvbmx5IHNvIE51bWJlcigpIGNhbiBwYXJzZSB0aGUgcm91bmRlZCBkaWdpdHMgYmFjay5cbiAgcmV0dXJuIE51bWJlcihudW1iZXJGb3JtYXQoUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRSwge1xuICAgIHVzZUdyb3VwaW5nOiBmYWxzZSxcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkaWdpdHMsXG4gIH0pLmZvcm1hdCh2YWx1ZSkpO1xufVxuXG4vLyBPbmUgdmFsdWUsIHdyaXR0ZW4gYnkgdGhlIHJ1bGVzIGFib3ZlLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBvcHRpb25zOiBGb3JtYXROdW1iZXJPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgIHJldHVybiBvcHRpb25zLmVtcHR5ID8/IEVNUFRZX1ZBTFVFO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IHRvRmluaXRlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlKHNwZWMpO1xuICBjb25zdCBwcmVjaXNpb24gPSBjbGFtcERlY2ltYWxzKHNwZWM/LnByZWNpc2lvbik7XG4gIGNvbnN0IHVuaXRzID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnRcbiAgICA/IFJlcG9ydE51bWJlclVuaXRzLk5vbmVcbiAgICA6IG9wdGlvbnMudW5pdHMgPz8gcmVzb2x2ZVVuaXRzKHNwZWM/LnVuaXRzLCBudW1lcmljLCBwcmVjaXNpb24gPz8gU0NBTEVEX0RFQ0lNQUxTKTtcbiAgY29uc3Qgc2NhbGUgPSBVTklUX1NDQUxFUy5nZXQodW5pdHMpO1xuICBjb25zdCBkZWNpbWFscyA9IGNsYW1wRGVjaW1hbHMob3B0aW9ucy5kZWNpbWFscykgPz8gcHJlY2lzaW9uO1xuICBjb25zdCBmb3JtYXR0ZXIgPSBudW1iZXJGb3JtYXQoY29udGV4dC5sb2NhbGUsIHtcbiAgICAuLi5zdHlsZU9wdGlvbnMoc3R5bGUsIGNvbnRleHQsIGRlY2ltYWxzLCAhIXNjYWxlKSxcbiAgICAuLi4ob3B0aW9ucy5zaWduZWQgPyBTSUdORUQgOiB7fSksXG4gIH0pO1xuICBjb25zdCB0ZXh0ID0gd3JpdGVOdW1iZXIoZm9ybWF0dGVyLCAobnVtZXJpYyA9PT0gMCA/IDAgOiBudW1lcmljKSAvIChzY2FsZT8uZGl2aXNvciA/PyAxKSwgc2NhbGU/LnN1ZmZpeCk7XG5cbiAgcmV0dXJuIHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50ICYmICFjb250ZXh0LnJhdGlvUGVyY2VudCA/IGAke3RleHR9JWAgOiB0ZXh0O1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgIHx8IHZhbHVlID09PSAnJ1xuICAgIHx8IHZhbHVlID09PSAnLSdcbiAgICB8fCAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG59XG5cbi8vIFRoZSB2YWx1ZSBmb3JtYXQgYSBzbG90IG5hbWVzLCBvciBudWxsIHdoZW4gaXQgbmFtZXMgbm9uZSAob3Igb25seSBkYXRlKS5cbmZ1bmN0aW9uIHZhbHVlRm9ybWF0KHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0VmFsdWVGb3JtYXQgfCBudWxsIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUmVwb3J0VmFsdWVGb3JtYXQpLmZpbmQoKGZvcm1hdCkgPT4gZm9ybWF0ID09PSBzcGVjPy5mb3JtYXQpID8/IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZShzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFJlcG9ydFZhbHVlRm9ybWF0IHtcbiAgcmV0dXJuIHZhbHVlRm9ybWF0KHNwZWMpID8/IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlcjtcbn1cblxuLy8gQSB1c2FibGUgZGVjaW1hbCBjb3VudCwgb3IgbnVsbC4gQSBzdG9yZWQgdmFsdWUgb3V0c2lkZSB0aGUgc2NoZW1hJ3MgYm91bmRzXG4vLyBpcyBicm91Z2h0IGluc2lkZSB0aGVtIHJhdGhlciB0aGFuIHRocm93biBvbiBieSBJbnRsLlxuZnVuY3Rpb24gY2xhbXBEZWNpbWFscyhkZWNpbWFsczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIGRlY2ltYWxzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZGVjaW1hbHMpXG4gICAgPyBNYXRoLm1pbihNQVhfUFJFQ0lTSU9OLCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGRlY2ltYWxzKSkpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBzdHlsZU9wdGlvbnMoXG4gIHN0eWxlOiBSZXBvcnRWYWx1ZUZvcm1hdCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgZGVjaW1hbHM6IG51bWJlciB8IG51bGwsXG4gIHNjYWxlZDogYm9vbGVhbixcbik6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIGNvbnN0IGZyYWN0aW9uRGlnaXRzID0gZnJhY3Rpb25EaWdpdE9wdGlvbnMoZGVjaW1hbHMsIGRlZmF1bHREZWNpbWFscyhzdHlsZSwgc2NhbGVkKSk7XG5cbiAgc3dpdGNoIChzdHlsZSkge1xuICAgIGNhc2UgUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3k6XG4gICAgICByZXR1cm4geyAuLi5jdXJyZW5jeU9wdGlvbnMoY29udGV4dC5jdXJyZW5jeSksIC4uLmZyYWN0aW9uRGlnaXRzIH07XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50OlxuICAgICAgcmV0dXJuIGNvbnRleHQucmF0aW9QZXJjZW50ID8geyBzdHlsZTogJ3BlcmNlbnQnLCAuLi5mcmFjdGlvbkRpZ2l0cyB9IDogZnJhY3Rpb25EaWdpdHM7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmcmFjdGlvbkRpZ2l0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeU9wdGlvbnMoY3VycmVuY3k6IFJlcG9ydEN1cnJlbmN5Q29kZSk6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIHJldHVybiB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeSwgY3VycmVuY3lEaXNwbGF5OiAnc3ltYm9sJyB9O1xufVxuXG4vLyBUaGUgbW9zdCBkZWNpbWFscyBhIHN0eWxlIHNob3dzIHdoZW4gbm90aGluZyBwaW5zIHRoZW07IG51bGwgbGVhdmVzIEludGwnc1xuLy8gb3duIGRlZmF1bHQuXG5mdW5jdGlvbiBkZWZhdWx0RGVjaW1hbHMoc3R5bGU6IFJlcG9ydFZhbHVlRm9ybWF0LCBzY2FsZWQ6IGJvb2xlYW4pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHNjYWxlZCkge1xuICAgIHJldHVybiBTQ0FMRURfREVDSU1BTFM7XG4gIH1cblxuICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50OlxuICAgICAgcmV0dXJuIFBFUkNFTlRfREVDSU1BTFM7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeTpcbiAgICAgIHJldHVybiBDVVJSRU5DWV9ERUNJTUFMUztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gUGlubmVkIGRlY2ltYWxzIHNldCBib3RoIGJvdW5kcy4gT3RoZXJ3aXNlIGEgbWF4aW11bSBhbHNvIHNldHMgdGhlIG1pbmltdW1cbi8vIHRvIHplcm8sIHNvIG5vIGVuZ2luZSB0aHJvd3Mgb24gYSBtYXhpbXVtIGJlbG93IGEgY3VycmVuY3kncyBvd24gbWluaW11bS5cbmZ1bmN0aW9uIGZyYWN0aW9uRGlnaXRPcHRpb25zKHBpbm5lZDogbnVtYmVyIHwgbnVsbCwgbWF4aW11bTogbnVtYmVyIHwgbnVsbCk6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIGlmIChwaW5uZWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4geyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IHBpbm5lZCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBwaW5uZWQgfTtcbiAgfVxuXG4gIHJldHVybiBtYXhpbXVtID09PSBudWxsID8ge30gOiB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtIH07XG59XG5cbi8vIFRoZSBmb3JtYXR0ZWQgdmFsdWUsIHdpdGggdGhlIHVuaXRzIGxldHRlciBhZnRlciBpdHMgZGlnaXRzLiBBIG5lZ2F0aXZlXG4vLyB3aG9zZSBzaG93biBkaWdpdHMgYXJlIGFsbCB6ZXJvIGlzIHdyaXR0ZW4gYXMgemVybywgc28gbm8gJy0wJyBhcHBlYXJzLlxuZnVuY3Rpb24gd3JpdGVOdW1iZXIoZm9ybWF0dGVyOiBJbnRsLk51bWJlckZvcm1hdCwgdmFsdWU6IG51bWJlciwgc3VmZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID49IDAgJiYgIXN1ZmZpeCkge1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHModmFsdWUpO1xuXG4gIGlmICh2YWx1ZSA8IDAgJiYgIWhhc05vblplcm9EaWdpdChmb3JtYXR0ZXIsIHBhcnRzKSkge1xuICAgIHJldHVybiB3cml0ZU51bWJlcihmb3JtYXR0ZXIsIDAsIHN1ZmZpeCk7XG4gIH1cblxuICBpZiAoIXN1ZmZpeCkge1xuICAgIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgbGFzdCA9IHBhcnRzLnJlZHVjZSgoZm91bmQsIHBhcnQsIGluZGV4KSA9PiBOVU1CRVJfUEFSVFMuaGFzKHBhcnQudHlwZSkgPyBpbmRleCA6IGZvdW5kLCAtMSk7XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5wYXJ0cy5zbGljZSgwLCBsYXN0ICsgMSkubWFwKChwYXJ0KSA9PiBwYXJ0LnZhbHVlKSxcbiAgICBzdWZmaXgsXG4gICAgLi4ucGFydHMuc2xpY2UobGFzdCArIDEpLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSksXG4gIF0uam9pbignJyk7XG59XG5cbi8vIENvbXBhcmVkIHdpdGggdGhlIGxvY2FsZSdzIG93biB6ZXJvLCBzbyBhIG51bWJlcmluZyBzeXN0ZW0gb3RoZXIgdGhhblxuLy8gMC05IGlzIHJlYWQgY29ycmVjdGx5LlxuZnVuY3Rpb24gaGFzTm9uWmVyb0RpZ2l0KGZvcm1hdHRlcjogSW50bC5OdW1iZXJGb3JtYXQsIHBhcnRzOiBJbnRsLk51bWJlckZvcm1hdFBhcnRbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB6ZXJvID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoMCkuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnaW50ZWdlcicpPy52YWx1ZSA/PyAnMCc7XG5cbiAgcmV0dXJuIHBhcnRzLnNvbWUoKHBhcnQpID0+IERJR0lUX1BBUlRTLmhhcyhwYXJ0LnR5cGUpXG4gICAgJiYgQXJyYXkuZnJvbShwYXJ0LnZhbHVlKS5zb21lKChjaGFyYWN0ZXIpID0+IGNoYXJhY3RlciAhPT0gemVybykpO1xufVxuXG5cbi8vIE91dHB1dCB2YWx1ZXM6IGEgY29sdW1uIHRoZSBzZXJ2ZXIgbWFya3MgaW4gQ29tcG9uZW50RGF0YS5vdXRwdXRzIChhXG4vLyBjb21wYXJlZCB2YWx1ZSwgYSByYW5rLCBhIHNoYXJlKSB3cml0dGVuIGJ5IHdoYXQgaXQgaXMuIFRoZSBkYXRhIHN0YXlzIHJhdztcbi8vIGV2ZXJ5IG51bWJlciBzdGlsbCBnb2VzIHRocm91Z2ggZm9ybWF0TnVtYmVyLiBUaGUgcnVsZXM6XG4vLyAtIFRoZSBmb3JtYXQ6IGEgc2xvdCdzIG93biBleHBsaWNpdCBmb3JtYXQgYWx3YXlzIHdpbnMuIE90aGVyd2lzZSBhIGN1cnJlbnQsXG4vLyAgIHByaW9yIG9yIGNoYW5nZSBjb2x1bW4gdGFrZXMgaXRzIHNvdXJjZSBtZWFzdXJlJ3MgZm9ybWF0OyBhIHBlcmNlbnQgY2hhbmdlXG4vLyAgIGlzIGEgcGVyY2VudDsgYSByYW5rIGlzIGEgd2hvbGUgbnVtYmVyOyBhIHNoYXJlIGlzIGEgcGVyY2VudCB0byAxIGRlY2ltYWwuXG4vLyAgIEFuIG93biBwcmVjaXNpb24gb3IgdW5pdHMgc3RpbGwgYXBwbGllcyBvdmVyIHRob3NlIGRlZmF1bHRzLlxuLy8gLSBTaWduczogYSBjaGFuZ2UgYW5kIGEgcGVyY2VudCBjaGFuZ2UgYXJlIHNpZ25lZCAoJys1NzknLCAnLTMxLjElJyksXG4vLyAgIHVubGVzcyB0aGUgY2FsbGVyJ3MgYHNpZ25lZGAgc2F5cyBvdGhlcndpc2UuXG4vLyAtIFBvaW50czogYSBjaGFuZ2Ugb2YgYSBwZXJjZW50LWZvcm1hdCB2YWx1ZSwgYW5kIGFueSBzaGFyZSBjaGFuZ2UsIGlzIGFcbi8vICAgZGlmZmVyZW5jZSBvZiB0d28gcmF0ZXMsIHNvIGl0IHByaW50cyBpbiBwZXJjZW50YWdlIHBvaW50cywgc2lnbmVkIGFuZCB0b1xuLy8gICAxIGRlY2ltYWwgdW5sZXNzIGEgcHJlY2lzaW9uIHBpbnMgb3RoZXJzOiAwLjEgcmVhZHMgJysxMC4wIHBwJyAoJysxMC4wJ1xuLy8gICB3aGVuIHRoZSBjYWxsZXIncyBgcG9pbnRzVW5pdGAgaXMgZmFsc2UpLlxuLy8gLSBNaXNzaW5nOiBhIG1pc3NpbmcgcHJpb3IsIG9yIGEgY2hhbmdlIG9yIHBlcmNlbnQgY2hhbmdlIGxlZnQgZW1wdHkgYnlcbi8vICAgb25lLCBwcmludHMgJ+KAlCcgdGl0bGVkIHdpdGggdGhlIGZsb29yICgnTm8gYmFzZWxpbmU6IG5vIGRhdGEgYmVmb3JlXG4vLyAgIE1hciAzLCAyMDI2JyksIG9yIGZvciBhIHJhbmsgb3IgYSBzaGFyZSB3aXRoIHRoZSBwZXJpb2QgdGhlIHJvdyB3YXNcbi8vICAgYWJzZW50IGZyb20gKCdObyByYW5rIGluIHRoZSBwcmlvciBwZXJpb2QnKTsgYSBwZXJjZW50IGNoYW5nZSBvdmVyIGEgcHJpb3Igb2YgMCBwcmludHMgJ24vYScgdGl0bGVkXG4vLyAgICdQcmlvciB3YXMgMCcuIEFueSBvdGhlciBtaXNzaW5nIHZhbHVlIHByaW50cyAn4oCUJyAob3IgdGhlIGNhbGxlcidzIGVtcHR5KS5cbi8vIC0gUmFuayBjaGFuZ2U6IHByaW9yIG1pbnVzIGN1cnJlbnQsIHNvIGEgcmlzZSBpcyBwb3NpdGl2ZTogJ+KWsiAyJywgJ+KWvCAxJyxcbi8vICAgJ+KAkycgZm9yIG5vbmUsIGFuZCAnbmV3JyBmb3IgYW4gZW1wdHkgY2hhbmdlIHdob3NlIHByaW9yIHJhbmsgaXMgbWlzc2luZ1xuLy8gICBvciBub3QgcGFzc2VkIChhIHJvdyBhbHdheXMgaGFzIGEgY3VycmVudCByYW5rLCBzbyBvbmx5IHRoZSBwcmlvciBsYWNrcykuXG4vLyBBIHBlcmNlbnQgY2hhbmdlIGFuZCBhIHNoYXJlIGFyZSAwLTEgZnJhY3Rpb25zIHdoYXRldmVyIHRoZSByZXBvcnQnc1xuLy8gcGVyY2VudEZvcm1hdDogdGhlIHNlcnZlciBjb21wdXRlcyB0aGVtLCBuZXZlciBhIHN0b3JlZCB2YWx1ZS5cblxuLy8gQSBtaXNzaW5nIGNvbXBhcmlzb24gdmFsdWUgcHJpbnRzIEVNUFRZX1ZBTFVFIHdoYXRldmVyIHRoZSBjYWxsZXIncyBlbXB0eS5cbmNvbnN0IE5PVF9BUFBMSUNBQkxFX1ZBTFVFID0gJ24vYSc7XG5jb25zdCBORVdfUkFOS19WQUxVRSA9ICduZXcnO1xuY29uc3QgUkFOS19VTkNIQU5HRURfVkFMVUUgPSAn4oCTJztcbmNvbnN0IFJBTktfVVBfTUFSSyA9ICfilrInO1xuY29uc3QgUkFOS19ET1dOX01BUksgPSAn4pa8JztcbmNvbnN0IFBPSU5UU19TVUZGSVggPSAncHAnO1xuY29uc3QgTk9fUFJJT1JfUkFOS19USVRMRSA9ICdObyByYW5rIGluIHRoZSBwcmlvciBwZXJpb2QnO1xuY29uc3QgTk9fUFJJT1JfU0hBUkVfVElUTEUgPSAnTm8gc2hhcmUgaW4gdGhlIHByaW9yIHBlcmlvZCc7XG4vLyBQZXJjZW50YWdlIHBvaW50cyBhbmQgYSBzaGFyZSBhcmUgd3JpdHRlbiB0byBvbmUgZGVjaW1hbCB1bmxlc3MgcGlubmVkLlxuY29uc3QgUE9JTlRTX0RFQ0lNQUxTID0gMTtcbmNvbnN0IFNIQVJFX0RFQ0lNQUxTID0gMTtcblxuY29uc3QgUkFOS19ERUZBVUxUX1NQRUM6IFJlYWRvbmx5PE51bWJlckZvcm1hdFNwZWM+ID0gT2JqZWN0LmZyZWV6ZSh7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLCBwcmVjaXNpb246IDAgfSk7XG5jb25zdCBTSEFSRV9ERUZBVUxUX1NQRUM6IFJlYWRvbmx5PE51bWJlckZvcm1hdFNwZWM+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCxcbiAgcHJlY2lzaW9uOiBTSEFSRV9ERUNJTUFMUyxcbn0pO1xuY29uc3QgUEVSQ0VOVF9DSEFOR0VfREVGQVVMVF9TUEVDOiBSZWFkb25seTxOdW1iZXJGb3JtYXRTcGVjPiA9IE9iamVjdC5mcmVlemUoeyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQgfSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0VmFsdWVPcHRpb25zIHtcbiAgLy8gVGhlIHNvdXJjZSBtZWFzdXJlJ3MgZm9ybWF0IChPdXRwdXRNZXRhLm1lYXN1cmUncyBzbG90KSwgd2hpY2ggYSBjdXJyZW50LFxuICAvLyBwcmlvciBvciBjaGFuZ2UgY29sdW1uIHRha2VzIHdoZW4gaXRzIG93biBzbG90IG5hbWVzIG5vbmUuXG4gIG1lYXN1cmVTcGVjPzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGw7XG4gIC8vIFRoZSByb3cncyBwcmlvciB2YWx1ZSBpbiB0aGUgc2FtZSBsYW5lIChzZWUgbGFuZU91dHB1dEFsaWFzKSwgZm9yIGEgY2hhbmdlXG4gIC8vIG9yIGEgcGVyY2VudCBjaGFuZ2U6IGl0IHRlbGxzIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIGZyb20gYSB6ZXJvIG9uZVxuICAvLyAoJ24vYScpLCBhbmQgYSBuZXcgcmFuayBmcm9tIGFuIHVucmFua2VkIHJvdy4gTGVhdmUgaXQgb3V0IHdoZW4gdW5rbm93bi5cbiAgcHJpb3I/OiB1bmtub3duO1xuICAvLyBDb21wb25lbnREYXRhLmNvbXBhcmlzb24uZmxvb3I6IHRoZSBmaXJzdCBkYXkgd2l0aCBkYXRhLCBuYW1lZCBpbiB0aGVcbiAgLy8gbm8tYmFzZWxpbmUgdGl0bGUuXG4gIGZsb29yPzogc3RyaW5nIHwgbnVsbDtcbiAgLy8gV2hhdCBhIG1pc3NpbmcgY3VycmVudCBvciBwbGFpbiB2YWx1ZSBwcmludHMgKCcnIGZvciBhIGNlbGwpLiBBIG1pc3NpbmdcbiAgLy8gY29tcGFyaXNvbiB2YWx1ZSBhbHdheXMgcHJpbnRzICfigJQnLlxuICBlbXB0eT86IHN0cmluZztcbiAgLy8gV2hldGhlciB0aGUgdmFsdWUgcHJpbnRzIGEgcGx1cyB3aGVuIHBvc2l0aXZlLCBvdmVyIGl0cyByb2xlJ3MgZGVmYXVsdCAoYVxuICAvLyBjaGFuZ2UgYW5kIGEgcGVyY2VudCBjaGFuZ2UgYXJlIHNpZ25lZCwgbm90aGluZyBlbHNlIGlzKS4gQSBmb3JtdWxhIHZhbHVlXG4gIC8vIHNldHMgaXQgZnJvbSBpdHMgb3duIGBzaWduZWRgLCBzbyBpdCBjYW4gZHJvcCBhIGNoYW5nZSdzIHNpZ24gb3IgYXNrIGFcbiAgLy8gcGxhaW4gb3V0cHV0IGZvciBvbmUuXG4gIHNpZ25lZD86IGJvb2xlYW47XG4gIC8vIFdoZXRoZXIgYSBjaGFuZ2UgaW4gcGVyY2VudGFnZSBwb2ludHMgZW5kcyBpbiAnIHBwJy4gT21pdHRlZCByZWFkcyB0cnVlLlxuICAvLyBBIHZhbHVlIGluc2lkZSB0ZXh0IHBhc3NlcyBmYWxzZTogdGhlIHdvcmRzIGFyb3VuZCBpdHMgdG9rZW4gY2FycnkgdGhlXG4gIC8vIHVuaXQgKCdwdHMnLCAnZGF5cyBmYXN0ZXInKS5cbiAgcG9pbnRzVW5pdD86IGJvb2xlYW47XG59XG5cbi8vIEFuIG91dHB1dCB2YWx1ZSBhcyBzaG93biwgYW5kIHdoeSBpdCByZWFkcyBzbyB3aGVuIHRoYXQgaXMgbm90IG9idmlvdXNcbi8vIChudWxsIG90aGVyd2lzZSk6IGZvciBhIHRvb2x0aXAgb3IgYSB0aXRsZSBhdHRyaWJ1dGUuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgdGV4dDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gT25lIG91dHB1dCB2YWx1ZSwgd3JpdHRlbiBieSB0aGUgcnVsZXMgYWJvdmUuIFdpdGhvdXQgb3V0cHV0IG1ldGFkYXRhIChhXG4vLyBwbGFpbiBtZWFzdXJlIGNvbHVtbiwgYW4gb2xkZXIgc2VydmVyKSBpdCBpcyBmb3JtYXROdW1iZXIgd2l0aCB0aGUgc2xvdCdzXG4vLyBvd24gZm9ybWF0LlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE91dHB1dFZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgb3V0cHV0OiBPdXRwdXRNZXRhIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIG9wdGlvbnM6IE91dHB1dFZhbHVlT3B0aW9ucyA9IHt9LFxuKTogRm9ybWF0dGVkT3V0cHV0VmFsdWUge1xuICBpZiAoIW91dHB1dCkge1xuICAgIHJldHVybiBwbGFpbk91dHB1dChmb3JtYXROdW1iZXIodmFsdWUsIHNwZWMsIGNvbnRleHQsIHsgZW1wdHk6IG9wdGlvbnMuZW1wdHkgfSkpO1xuICB9XG5cbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycgJiYgb3V0cHV0LnJvbGUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGZvcm1hdFJhbmtDaGFuZ2UodmFsdWUsIHNwZWMsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3Qgcm9sZSA9IG91dHB1dC5yb2xlO1xuICBjb25zdCBlZmZlY3RpdmUgPSBvdXRwdXRGb3JtYXRTcGVjKG91dHB1dCwgc3BlYywgb3B0aW9ucy5tZWFzdXJlU3BlYyk7XG5cbiAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbWlzc2luZ091dHB1dChvdXRwdXQsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3Qgc2lnbmVkID0gb3B0aW9ucy5zaWduZWQgPz8gKHJvbGUgPT09ICdjaGFuZ2UnIHx8IHJvbGUgPT09ICdwZXJjZW50X2NoYW5nZScpO1xuXG4gIGlmIChyb2xlID09PSAnY2hhbmdlJyAmJiBpc1BvaW50c0NoYW5nZShvdXRwdXQsIGVmZmVjdGl2ZSkpIHtcbiAgICByZXR1cm4gcGxhaW5PdXRwdXQoZm9ybWF0UG9pbnRzKHZhbHVlLCBvdXRwdXQsIGVmZmVjdGl2ZSwgY29udGV4dCwgb3B0aW9ucy5wb2ludHNVbml0ID8/IHRydWUsIHNpZ25lZCkpO1xuICB9XG5cbiAgY29uc3QgcmF0aW9Db250ZXh0ID0gcm9sZSA9PT0gJ3BlcmNlbnRfY2hhbmdlJyB8fCBvdXRwdXQua2luZCA9PT0gJ3NoYXJlJ1xuICAgID8geyAuLi5jb250ZXh0LCByYXRpb1BlcmNlbnQ6IHRydWUgfVxuICAgIDogY29udGV4dDtcblxuICByZXR1cm4gcGxhaW5PdXRwdXQoZm9ybWF0TnVtYmVyKHZhbHVlLCBlZmZlY3RpdmUsIHJhdGlvQ29udGV4dCwgeyBzaWduZWQgfSkpO1xufVxuXG4vLyBUaGUgYWxpYXMgb2YgdGhlIG91dHB1dCB0aGF0IHBsYXlzIGByb2xlYCBpbiB0aGUgc2FtZSBsYW5lIGFzIGBhbGlhc2A6IHRoZVxuLy8gc2FtZSBtZWFzdXJlIGFuZCBraW5kLCBhbmQgKGZvciBhIHByaW9yLCBjaGFuZ2Ugb3IgcGVyY2VudCBjaGFuZ2UpIHRoZSBzYW1lXG4vLyBwcmlvciBsYW5lLiBBIG1lYXN1cmUgY29tcGFyZXMgYWdhaW5zdCBvbmUgbGFuZSBvbmx5ICh0d28gY29tcGFyZXMgb24gb25lXG4vLyB2YWx1ZSBhcmUgdHdvIG1lYXN1cmVzKSwgc28gYSBjdXJyZW50IHZhbHVlJ3MgbGFuZSBpcyB3aGljaGV2ZXIgb25lIGl0c1xuLy8gbWVhc3VyZSdzIHByaW9yIGNvbHVtbnMgY2FycnksIGxhbmUgMiBhcyByZWFkaWx5IGFzIGxhbmUgMS4gQSBjaGFuZ2UgY29sdW1uXG4vLyBmaW5kcyBpdHMgcHJpb3IgdGhpcyB3YXkgdG8gcGFzcyBhcyBPdXRwdXRWYWx1ZU9wdGlvbnMucHJpb3IuIG51bGwgd2hlbiB0aGVcbi8vIHNlcnZlciBzZW5kcyBubyBzdWNoIGNvbHVtbi5cbmV4cG9ydCBmdW5jdGlvbiBsYW5lT3V0cHV0QWxpYXMoXG4gIG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIE91dHB1dE1ldGE+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYWxpYXM6IHN0cmluZyxcbiAgcm9sZTogT3V0cHV0Um9sZSxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBzb3VyY2UgPSBvdXRwdXRzPy5bYWxpYXNdO1xuXG4gIGlmICghc291cmNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhbnlMYW5lID0gc291cmNlLnJvbGUgPT09ICdjdXJyZW50JyB8fCBzb3VyY2Uub2Zmc2V0ID09PSBudWxsO1xuICBjb25zdCBmb3VuZCA9IE9iamVjdC5lbnRyaWVzKG91dHB1dHMgPz8ge30pLmZpbmQoKFssIG1ldGFdKSA9PiBtZXRhLm1lYXN1cmUgPT09IHNvdXJjZS5tZWFzdXJlXG4gICAgJiYgbWV0YS5raW5kID09PSBzb3VyY2Uua2luZFxuICAgICYmIG1ldGEucm9sZSA9PT0gcm9sZVxuICAgICYmIChyb2xlID09PSAnY3VycmVudCcgfHwgKGFueUxhbmUgPyBtZXRhLm9mZnNldCAhPT0gbnVsbCA6IG1ldGEub2Zmc2V0ID09PSBzb3VyY2Uub2Zmc2V0KSkpO1xuXG4gIHJldHVybiBmb3VuZCA/IGZvdW5kWzBdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcGxhaW5PdXRwdXQodGV4dDogc3RyaW5nKTogRm9ybWF0dGVkT3V0cHV0VmFsdWUge1xuICByZXR1cm4geyB0ZXh0LCB0aXRsZTogbnVsbCB9O1xufVxuXG4vLyBUaGUgZm9ybWF0IGFuIG91dHB1dCBpcyB3cml0dGVuIGluOiB0aGUgc2xvdCdzIG93biBleHBsaWNpdCBmb3JtYXQsIGVsc2Vcbi8vIHRoZSBkZWZhdWx0IGZvciB3aGF0IGl0IGhvbGRzLCB3aXRoIGFueSBvd24gcHJlY2lzaW9uIG9yIHVuaXRzIG92ZXIgaXQuXG5mdW5jdGlvbiBvdXRwdXRGb3JtYXRTcGVjKFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIG93bjogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG1lYXN1cmVTcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHtcbiAgaWYgKHZhbHVlRm9ybWF0KG93bikgIT09IG51bGwpIHtcbiAgICByZXR1cm4gb3duO1xuICB9XG5cbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycpIHtcbiAgICByZXR1cm4gd2l0aE93bkRpZ2l0cyhSQU5LX0RFRkFVTFRfU1BFQywgb3duKTtcbiAgfVxuXG4gIGlmIChvdXRwdXQua2luZCA9PT0gJ3NoYXJlJykge1xuICAgIHJldHVybiB3aXRoT3duRGlnaXRzKFNIQVJFX0RFRkFVTFRfU1BFQywgb3duKTtcbiAgfVxuXG4gIGlmIChvdXRwdXQucm9sZSA9PT0gJ3BlcmNlbnRfY2hhbmdlJykge1xuICAgIHJldHVybiB3aXRoT3duRGlnaXRzKFBFUkNFTlRfQ0hBTkdFX0RFRkFVTFRfU1BFQywgb3duKTtcbiAgfVxuXG4gIHJldHVybiBtZWFzdXJlU3BlYyA/IHdpdGhPd25EaWdpdHMobWVhc3VyZVNwZWMsIG93bikgOiBvd24gPz8gbnVsbDtcbn1cblxuLy8gVGhlIGJhc2UgZm9ybWF0IHdpdGggdGhlIHNsb3QncyBvd24gcHJlY2lzaW9uIGFuZCB1bml0cyBvdmVyIGl0LlxuZnVuY3Rpb24gd2l0aE93bkRpZ2l0cyhiYXNlOiBOdW1iZXJGb3JtYXRTcGVjLCBvd246IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkKTogTnVtYmVyRm9ybWF0U3BlYyB7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZSxcbiAgICAuLi4oKG93bj8ucHJlY2lzaW9uID8/IG51bGwpICE9PSBudWxsID8geyBwcmVjaXNpb246IG93bi5wcmVjaXNpb24gfSA6IHt9KSxcbiAgICAuLi4oKG93bj8udW5pdHMgPz8gbnVsbCkgIT09IG51bGwgPyB7IHVuaXRzOiBvd24udW5pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gQSBjaGFuZ2UgYmV0d2VlbiB0d28gcmF0ZXM6IGEgc2hhcmUncywgb3IgYSBwZXJjZW50LWZvcm1hdCB2YWx1ZSdzLlxuZnVuY3Rpb24gaXNQb2ludHNDaGFuZ2Uob3V0cHV0OiBPdXRwdXRNZXRhLCBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgfHwgcmVzb2x2ZVN0eWxlKHNwZWMpID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50O1xufVxuXG4vLyBBIHJhdGUgY2hhbmdlIGluIHBlcmNlbnRhZ2UgcG9pbnRzLiBBIHNoYXJlIGFuZCBhIDAtMSBwZXJjZW50IGFyZSBzY2FsZWRcbi8vIHgxMDA7IGFuIG9sZGVyIHNlcnZlcidzIHBlcmNlbnQgdmFsdWVzIGFscmVhZHkgYXJlLiBgdW5pdGAgd3JpdGVzIHRoZSAnIHBwJ1xuLy8gYWZ0ZXIgdGhlIGRpZ2l0cywgYW5kIGBzaWduZWRgIHRoZSBwbHVzIGJlZm9yZSBhIHJpc2UuXG5mdW5jdGlvbiBmb3JtYXRQb2ludHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICB1bml0OiBib29sZWFuLFxuICBzaWduZWQ6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBudW1lcmljID0gdG9GaW5pdGVOdW1iZXIodmFsdWUpO1xuICBpZiAobnVtZXJpYyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgY29uc3QgcG9pbnRzID0gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgfHwgY29udGV4dC5yYXRpb1BlcmNlbnQgPyBudW1lcmljICogMTAwIDogbnVtZXJpYztcbiAgY29uc3QgZGVjaW1hbHMgPSBjbGFtcERlY2ltYWxzKHNwZWM/LnByZWNpc2lvbikgPz8gUE9JTlRTX0RFQ0lNQUxTO1xuICBjb25zdCB0ZXh0ID0gZm9ybWF0TnVtYmVyKHBvaW50cywgeyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlciB9LCBjb250ZXh0LCB7IGRlY2ltYWxzLCBzaWduZWQgfSk7XG5cbiAgcmV0dXJuIHVuaXQgPyBgJHt0ZXh0fSAke1BPSU5UU19TVUZGSVh9YCA6IHRleHQ7XG59XG5cbi8vIEEgbWlzc2luZyBvdXRwdXQgdmFsdWUuIEEgbWlzc2luZyBwcmlvciwgb3IgYSBkZWx0YSBhIG1pc3NpbmcgcHJpb3IgbGVmdFxuLy8gZW1wdHksIGhhcyBubyBiYXNlbGluZTsgYSBwZXJjZW50IGNoYW5nZSBvdmVyIGEgemVybyBwcmlvciBoYXMgbm9uZSB0b1xuLy8gZGl2aWRlIGJ5LlxuZnVuY3Rpb24gbWlzc2luZ091dHB1dChcbiAgb3V0cHV0OiBPdXRwdXRNZXRhLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBvcHRpb25zOiBPdXRwdXRWYWx1ZU9wdGlvbnMsXG4pOiBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSB7XG4gIGNvbnN0IHJvbGUgPSBvdXRwdXQucm9sZTtcblxuICBpZiAocm9sZSA9PT0gJ3ByaW9yJykge1xuICAgIHJldHVybiB7IHRleHQ6IEVNUFRZX1ZBTFVFLCB0aXRsZTogbWlzc2luZ1ByaW9yVGl0bGUob3V0cHV0LCBvcHRpb25zLmZsb29yLCBjb250ZXh0LmxvY2FsZSkgfTtcbiAgfVxuXG4gIGlmIChyb2xlID09PSAnY2hhbmdlJyB8fCByb2xlID09PSAncGVyY2VudF9jaGFuZ2UnKSB7XG4gICAgY29uc3QgcHJpb3IgPSBvcHRpb25zLnByaW9yO1xuXG4gICAgaWYgKHJvbGUgPT09ICdwZXJjZW50X2NoYW5nZScgJiYgdG9GaW5pdGVOdW1iZXIocHJpb3IpID09PSAwKSB7XG4gICAgICByZXR1cm4geyB0ZXh0OiBOT1RfQVBQTElDQUJMRV9WQUxVRSwgdGl0bGU6ICdQcmlvciB3YXMgMCcgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogRU1QVFlfVkFMVUUsXG4gICAgICB0aXRsZTogcHJpb3IgIT09IHVuZGVmaW5lZCAmJiBpc0VtcHR5VmFsdWUocHJpb3IpXG4gICAgICAgID8gbWlzc2luZ1ByaW9yVGl0bGUob3V0cHV0LCBvcHRpb25zLmZsb29yLCBjb250ZXh0LmxvY2FsZSlcbiAgICAgICAgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gcGxhaW5PdXRwdXQob3B0aW9ucy5lbXB0eSA/PyBFTVBUWV9WQUxVRSk7XG59XG5cbi8vIFdoeSBhIHByaW9yIGlzIG1pc3NpbmcuIEEgdmFsdWUncyBwcmlvciBpcyBtaXNzaW5nIHdoZW4gaXRzIHdpbmRvdyBlbmRzXG4vLyBiZWZvcmUgdGhlIGRhdGEgc3RhcnRzLiBBIHJhbmsncyBvciBhIHNoYXJlJ3MgaXMgbWlzc2luZyB3aGVuIHRoZSByb3cgaGFkXG4vLyBubyByYW5rIG9yIHNoYXJlIGluIHRoZSBwcmlvciBwZXJpb2QsIHdoYXRldmVyIHRoZSBmbG9vci5cbmZ1bmN0aW9uIG1pc3NpbmdQcmlvclRpdGxlKFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIGZsb29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGlmIChvdXRwdXQua2luZCA9PT0gJ3JhbmsnKSB7XG4gICAgcmV0dXJuIE5PX1BSSU9SX1JBTktfVElUTEU7XG4gIH1cblxuICBpZiAob3V0cHV0LmtpbmQgPT09ICdzaGFyZScpIHtcbiAgICByZXR1cm4gTk9fUFJJT1JfU0hBUkVfVElUTEU7XG4gIH1cblxuICByZXR1cm4gbm9CYXNlbGluZVRpdGxlKGZsb29yLCBsb2NhbGUpO1xufVxuXG5mdW5jdGlvbiBub0Jhc2VsaW5lVGl0bGUoZmxvb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgY29uc3QgZGF5ID0gZmxvb3IgPyBmb3JtYXREYXkoZmxvb3IsIGxvY2FsZSkgOiAnJztcblxuICByZXR1cm4gZGF5ID8gYE5vIGJhc2VsaW5lOiBubyBkYXRhIGJlZm9yZSAke2RheX1gIDogJ05vIGJhc2VsaW5lJztcbn1cblxuLy8gQSByYW5rIGNoYW5nZTogcHJpb3IgcmFuayBtaW51cyBjdXJyZW50LCBzbyBtb3ZpbmcgdXAgaXMgcG9zaXRpdmUuXG5mdW5jdGlvbiBmb3JtYXRSYW5rQ2hhbmdlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIG9wdGlvbnM6IE91dHB1dFZhbHVlT3B0aW9ucyxcbik6IEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaXNFbXB0eVZhbHVlKG9wdGlvbnMucHJpb3IpXG4gICAgICA/IHsgdGV4dDogTkVXX1JBTktfVkFMVUUsIHRpdGxlOiBOT19QUklPUl9SQU5LX1RJVExFIH1cbiAgICAgIDogcGxhaW5PdXRwdXQoRU1QVFlfVkFMVUUpO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IHRvRmluaXRlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gcGxhaW5PdXRwdXQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cblxuICBjb25zdCByYW5rU3BlYyA9IHZhbHVlRm9ybWF0KHNwZWMpICE9PSBudWxsID8gc3BlYyA6IHdpdGhPd25EaWdpdHMoUkFOS19ERUZBVUxUX1NQRUMsIHNwZWMpO1xuICBjb25zdCBwbGFjZXMgPSBmb3JtYXROdW1iZXIoTWF0aC5hYnMobnVtZXJpYyksIHJhbmtTcGVjLCBjb250ZXh0KTtcblxuICBpZiAocGxhY2VzID09PSBmb3JtYXROdW1iZXIoMCwgcmFua1NwZWMsIGNvbnRleHQpKSB7XG4gICAgcmV0dXJuIHBsYWluT3V0cHV0KFJBTktfVU5DSEFOR0VEX1ZBTFVFKTtcbiAgfVxuXG4gIHJldHVybiBwbGFpbk91dHB1dChgJHtudW1lcmljID4gMCA/IFJBTktfVVBfTUFSSyA6IFJBTktfRE9XTl9NQVJLfSAke3BsYWNlc31gKTtcbn1cblxuXG4vLyBBIGNoYXJ0J3MgdmFsdWUgYXhpcyB0YWtlcyBhIGZvcm1hdCBvbmx5IHdoZW4gZXZlcnkgbWVhc3VyZSBvbiBpdCBhZ3JlZXMgb25cbi8vIHRoZSBzdHlsZSAoZWFjaCBtZWFzdXJlJ3MgZm9ybWF0LCBudW1iZXIgd2hlbiBpdCBuYW1lcyBub25lKSBhbmQgYXQgbGVhc3Rcbi8vIG9uZSBvZiB0aGVtIG5hbWVzIGEgZm9ybWF0LiBUaGUgZmlyc3QgbWVhc3VyZSB0aGF0IGRvZXMgZ2l2ZXMgdGhlIGF4aXMgaXRzXG4vLyBwcmVjaXNpb24gYW5kIHVuaXRzLiBPdGhlcndpc2UgbnVsbDogdGhlIGF4aXMga2VlcHMgaXRzIGRlZmF1bHQgdGlja3Mgb25cbi8vIHNjcmVlbiBhbmQgaW4gUG93ZXJQb2ludCwgYW5kIGVhY2ggc2VyaWVzIHN0aWxsIGZvcm1hdHMgaXRzIG93biB0b29sdGlwcy5cbmV4cG9ydCBmdW5jdGlvbiBheGlzTnVtYmVyRm9ybWF0KG1lYXN1cmVzOiBDaGFydE1lYXN1cmVbXSk6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHtcbiAgY29uc3Qgc3R5bGUgPSBtZWFzdXJlcy5sZW5ndGggPyByZXNvbHZlU3R5bGUobWVhc3VyZXNbMF0pIDogbnVsbDtcblxuICBpZiAoc3R5bGUgPT09IG51bGwgfHwgbWVhc3VyZXMuc29tZSgobWVhc3VyZSkgPT4gcmVzb2x2ZVN0eWxlKG1lYXN1cmUpICE9PSBzdHlsZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IG1lYXN1cmVzLmZpbmQoKG1lYXN1cmUpID0+IGhhc051bWJlckZvcm1hdChtZWFzdXJlKSk7XG5cbiAgcmV0dXJuIGZvcm1hdHRlZCA/IG51bWJlckZvcm1hdFNwZWMoZm9ybWF0dGVkKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG51bWJlckZvcm1hdFNwZWMoc3BlYzogTnVtYmVyRm9ybWF0U3BlYyk6IE51bWJlckZvcm1hdFNwZWMge1xuICByZXR1cm4ge1xuICAgIC4uLihzcGVjLmZvcm1hdCAhPT0gdW5kZWZpbmVkID8geyBmb3JtYXQ6IHNwZWMuZm9ybWF0IH0gOiB7fSksXG4gICAgLi4uKHNwZWMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyB7IHByZWNpc2lvbjogc3BlYy5wcmVjaXNpb24gfSA6IHt9KSxcbiAgICAuLi4oc3BlYy51bml0cyAhPT0gdW5kZWZpbmVkID8geyB1bml0czogc3BlYy51bml0cyB9IDoge30pLFxuICB9O1xufVxuXG4vLyBIb3cgYSBjaGFydCdzIHZhbHVlIGF4aXMgd3JpdGVzIGl0cyB0aWNrczogdGhlIHVuaXRzIGRlY2lkZWQgb25jZSBmcm9tIHRoZVxuLy8gYXhpcyBwZWFrLCBhbmQgdGhlIGRlY2ltYWxzIHRoZSBwcmVjaXNpb24gcGlucywgZWxzZSBhcyBtYW55IGFzIHRoZSBheGlzJ3Ncbi8vIHRpY2sgc3RlcCBuZWVkcyAoYSBwZXJjZW50IGF4aXMgdXAgdG8gMC4xMiUgc3RlcHMgYnkgMC4wMiUsIHR3byBkZWNpbWFscykuXG4vLyBQaW5uZWQgZGVjaW1hbHMga2VlcCB0aGUgdGlja3MgZGlzdGluY3QsIGFuZCBQb3dlclBvaW50IGNhbiBvbmx5IHBpbiB0aGVtLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDaGFydE51bWJlckZvcm1hdChcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyxcbiAgcGVhazogbnVtYmVyLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogQ2hhcnROdW1iZXJGb3JtYXQge1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZShzcGVjKTtcbiAgY29uc3QgcHJlY2lzaW9uID0gY2xhbXBEZWNpbWFscyhzcGVjLnByZWNpc2lvbik7XG4gIGNvbnN0IHVuaXRzID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnRcbiAgICA/IFJlcG9ydE51bWJlclVuaXRzLk5vbmVcbiAgICA6IHJlc29sdmVVbml0cyhzcGVjLnVuaXRzLCBwZWFrLCBwcmVjaXNpb24gPz8gU0NBTEVEX0RFQ0lNQUxTKTtcblxuICByZXR1cm4geyB1bml0cywgZGVjaW1hbHM6IHByZWNpc2lvbiA/PyBheGlzRGVjaW1hbHMoc3R5bGUsIHVuaXRzLCBwZWFrLCBjb250ZXh0KSB9O1xufVxuXG4vLyBUaGUgZGVjaW1hbHMgdGhlIGF4aXMncyBuaWNlIHRpY2sgc3RlcCBuZWVkcy4gQSBwbGFpbiwgdW5hYmJyZXZpYXRlZCBudW1iZXJcbi8vIHBpbnMgbm9uZSAobnVsbCk6IGl0cyB0aWNrcyBrZWVwIHRoZWlyIG93biBkZWNpbWFscy4gQW4gdW5zY2FsZWQgY3VycmVuY3lcbi8vIGF4aXMgdGhhdCBuZWVkcyBkZWNpbWFscyBzaG93cyBjZW50cywgYW5kIGEgSy9NIGF4aXMga2VlcHMgaXRzIHN0ZXAnc1xuLy8gZGVjaW1hbHMgKCckMC41TScsIG5vdCAnJDAuNTBNJykuXG5mdW5jdGlvbiBheGlzRGVjaW1hbHMoXG4gIHN0eWxlOiBSZXBvcnRWYWx1ZUZvcm1hdCxcbiAgdW5pdHM6IFJlc29sdmVkVW5pdHMsXG4gIHBlYWs6IG51bWJlcixcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBzY2FsZSA9IFVOSVRfU0NBTEVTLmdldCh1bml0cyk7XG5cbiAgaWYgKHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIgJiYgIXNjYWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzaG93blBlYWsgPSBzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCAmJiBjb250ZXh0LnJhdGlvUGVyY2VudFxuICAgID8gTWF0aC5hYnMocGVhaykgKiAxMDBcbiAgICA6IE1hdGguYWJzKHBlYWspIC8gKHNjYWxlPy5kaXZpc29yID8/IDEpO1xuICBjb25zdCBzdGVwID0gbmljZVN0ZXAoc2hvd25QZWFrIC8gQVhJU19USUNLUyk7XG4gIGNvbnN0IGRlY2ltYWxzID0gc3RlcCA+IDAgPyBjbGFtcERlY2ltYWxzKC1NYXRoLmZsb29yKE1hdGgubG9nMTAoc3RlcCkpKSA/PyAwIDogMDtcblxuICByZXR1cm4gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5ICYmIGRlY2ltYWxzID4gMCAmJiAhc2NhbGUgPyBDVVJSRU5DWV9BWElTX0RFQ0lNQUxTIDogZGVjaW1hbHM7XG59XG5cbi8vIEVDaGFydHMnIG5pY2UoKTogdGhlIHJvdW5kIG51bWJlciAoMSwgMiwgMywgNSBvciAxMCB0aW1lcyBhIHBvd2VyIG9mIHRlbikgYVxuLy8gcm91Z2ggdGljayBzdGVwIHNuYXBzIHRvLlxuZnVuY3Rpb24gbmljZVN0ZXAocm91Z2g6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghKHJvdWdoID4gMCkgfHwgIU51bWJlci5pc0Zpbml0ZShyb3VnaCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IGV4cG9uZW50ID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKHJvdWdoKSk7XG4gIGNvbnN0IHBvd2VyID0gTWF0aC5wb3coMTAsIGV4cG9uZW50KTtcbiAgY29uc3QgZnJhY3Rpb24gPSByb3VnaCAvIHBvd2VyO1xuICBsZXQgbmljZSA9IDEwO1xuICBpZiAoZnJhY3Rpb24gPCAxLjUpIHtcbiAgICBuaWNlID0gMTtcbiAgfSBlbHNlIGlmIChmcmFjdGlvbiA8IDIuNSkge1xuICAgIG5pY2UgPSAyO1xuICB9IGVsc2UgaWYgKGZyYWN0aW9uIDwgNCkge1xuICAgIG5pY2UgPSAzO1xuICB9IGVsc2UgaWYgKGZyYWN0aW9uIDwgNykge1xuICAgIG5pY2UgPSA1O1xuICB9XG5cbiAgcmV0dXJuIG5pY2UgKiBwb3dlcjtcbn1cblxuLy8gUG93ZXJQb2ludCdzIG51bWJlciBmb3JtYXQgY29kZSBmb3IgYSBmb3JtYXR0ZWQgdmFsdWUgYXhpcywgbWF0Y2hpbmcgdGhlXG4vLyBzY3JlZW4ncyB0aWNrczogJyMsIyMwLjAlJyAocGVyY2VudCksICdcIiRcIiMsIyMwJyAoY3VycmVuY3kpLFxuLy8gJyMsIyMwLjAsXCJLXCInICh0aG91c2FuZHMpLCAnIywjIzBcIiAkXCInIChmci1DQSBjdXJyZW5jeSkuIEEgcGxhaW4gbnVtYmVyXG4vLyB3aG9zZSBkZWNpbWFscyBhcmUgbm90IHBpbm5lZCBrZWVwcyBjaGFydEF4aXNGb3JtYXRDb2RlJ3MgY29kZS4gVGhlIGNvZGUnc1xuLy8gc2VwYXJhdG9ycyBmb2xsb3cgdGhlIG9wZW5pbmcgbWFjaGluZSdzIGxvY2FsZTsgdGhlIGN1cnJlbmN5IHN5bWJvbCBhbmQgaXRzXG4vLyBzaWRlIGZvbGxvdyB0aGUgcmVwb3J0J3MuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyRm9ybWF0Q29kZShcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgY2hhcnQ6IENoYXJ0TnVtYmVyRm9ybWF0LFxuICBzZXJpZXM6IChudW1iZXIgfCBudWxsKVtdW10sXG4gIHN0YWNrZWQ6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZShzcGVjKTtcbiAgY29uc3Qgc2NhbGUgPSBzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCA/IHVuZGVmaW5lZCA6IFVOSVRfU0NBTEVTLmdldChjaGFydC51bml0cyk7XG5cbiAgaWYgKHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIgJiYgIXNjYWxlICYmIGNoYXJ0LmRlY2ltYWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoYXJ0QXhpc0Zvcm1hdENvZGUoc2VyaWVzLCBzdGFja2VkKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2ltYWxzID0gY2hhcnQuZGVjaW1hbHMgPz8gMDtcbiAgY29uc3QgZGlnaXRzID0gYCMsIyMwJHtkZWNpbWFscyA+IDAgPyBgLiR7JzAnLnJlcGVhdChkZWNpbWFscyl9YCA6ICcnfWA7XG5cbiAgaWYgKHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50KSB7XG4gICAgcmV0dXJuIGAke2RpZ2l0c30ke2NvbnRleHQucmF0aW9QZXJjZW50ID8gJyUnIDogJ1wiJVwiJ31gO1xuICB9XG5cbiAgY29uc3Qgc2NhbGVkID0gYCR7ZGlnaXRzfSR7c2NhbGU/LmNvbW1hcyA/PyAnJ31gO1xuICBjb25zdCB1bml0ID0gc2NhbGU/LnN1ZmZpeCA/PyAnJztcblxuICBpZiAoc3R5bGUgIT09IFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5KSB7XG4gICAgcmV0dXJuIHVuaXQgPyBgJHtzY2FsZWR9XCIke3VuaXR9XCJgIDogc2NhbGVkO1xuICB9XG5cbiAgY29uc3Qgc3ltYm9sID0gY3VycmVuY3lTeW1ib2woY29udGV4dCk7XG5cbiAgcmV0dXJuIHN5bWJvbC5wcmVmaXhcbiAgICA/IGBcIiR7c3ltYm9sLnRleHR9XCIke3NjYWxlZH0ke3VuaXQgPyBgXCIke3VuaXR9XCJgIDogJyd9YFxuICAgIDogYCR7c2NhbGVkfVwiJHt1bml0fSR7c3ltYm9sLnRleHR9XCJgO1xufVxuXG4vLyBUaGUgY3VycmVuY3kgc3ltYm9sIGFzIHRoZSBsb2NhbGUgd3JpdGVzIGl0IGJlc2lkZSBhIG51bWJlciwgd2l0aCB0aGUgc3BhY2Vcbi8vIGJldHdlZW4gdGhlbSwgYW5kIHdoaWNoIHNpZGUgaXQgc2l0cyBvbjogJyQnIGJlZm9yZSBpbiBlbi1VUywgJyAkJyBhZnRlciBpblxuLy8gZnItQ0EuIFF1b3RlcyBhcmUgZHJvcHBlZCwgYXMgYSBmb3JtYXQgY29kZSBjYW5ub3QgaG9sZCB0aGVtLlxuaW50ZXJmYWNlIEN1cnJlbmN5U3ltYm9sIHtcbiAgcHJlZml4OiBib29sZWFuO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmNvbnN0IENVUlJFTkNZX1NZTUJPTFMgPSBuZXcgTWFwPHN0cmluZywgQ3VycmVuY3lTeW1ib2w+KCk7XG5cbmZ1bmN0aW9uIGN1cnJlbmN5U3ltYm9sKGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiBDdXJyZW5jeVN5bWJvbCB7XG4gIGNvbnN0IGtleSA9IGAke2NvbnRleHQubG9jYWxlfXwke2NvbnRleHQuY3VycmVuY3l9YDtcbiAgbGV0IHN5bWJvbCA9IENVUlJFTkNZX1NZTUJPTFMuZ2V0KGtleSk7XG5cbiAgaWYgKCFzeW1ib2wpIHtcbiAgICBjb25zdCBwYXJ0cyA9IG51bWJlckZvcm1hdChjb250ZXh0LmxvY2FsZSwgY3VycmVuY3lPcHRpb25zKGNvbnRleHQuY3VycmVuY3kpKS5mb3JtYXRUb1BhcnRzKDEpO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcGFydHMuZmluZEluZGV4KChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdjdXJyZW5jeScpO1xuICAgIGNvbnN0IGZpcnN0ID0gcGFydHMuZmluZEluZGV4KChwYXJ0KSA9PiBOVU1CRVJfUEFSVFMuaGFzKHBhcnQudHlwZSkpO1xuICAgIGNvbnN0IGxhc3QgPSBwYXJ0cy5yZWR1Y2UoKGZvdW5kLCBwYXJ0LCBpbmRleCkgPT4gTlVNQkVSX1BBUlRTLmhhcyhwYXJ0LnR5cGUpID8gaW5kZXggOiBmb3VuZCwgLTEpO1xuICAgIGNvbnN0IHByZWZpeCA9IGN1cnJlbmN5IDwgZmlyc3Q7XG4gICAgY29uc3QgdGV4dCA9IChwcmVmaXggPyBwYXJ0cy5zbGljZShNYXRoLm1heChjdXJyZW5jeSwgMCksIGZpcnN0KSA6IHBhcnRzLnNsaWNlKGxhc3QgKyAxKSlcbiAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpXG4gICAgICAuam9pbignJylcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJyk7XG5cbiAgICBzeW1ib2wgPSB7IHByZWZpeCwgdGV4dCB9O1xuICAgIENVUlJFTkNZX1NZTUJPTFMuc2V0KGtleSwgc3ltYm9sKTtcbiAgfVxuXG4gIHJldHVybiBzeW1ib2w7XG59XG5cblxuLy8gRXZlcnkgZGVjaW1hbCBhIG51bWJlciBoYXMsIGdyb3VwZWQsIGluIHRoZSBsb2NhbGU6IHdoYXQgRUNoYXJ0cyBwcmludHMgYnlcbi8vIGRlZmF1bHQgKGl0cyBhZGRDb21tYXMpLCBidXQgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gYSBjaGFydCdzIGF4aXMgYW5kXG4vLyB0b29sdGlwIHJlYWQgbGlrZSB0aGUgcmVzdCBvZiB0aGUgcmVwb3J0LiAxMjM0LjUgcmVhZHMgMSwyMzQuNSBpbiBlbi1VUyBhbmRcbi8vIDEgMjM0LDUgaW4gZnItQ0EuIEEgbm9uLW51bWVyaWMgc3RyaW5nIGlzIHNob3duIGFzIGl0IGNhbWUsIGFuZCBhbnl0aGluZ1xuLy8gZWxzZSBub24tbnVtZXJpYyBhcyAnLScsIGFzIEVDaGFydHMgc2hvd3MgaXQuIEFzIHRoZXJlLCBhbiBpbmZpbml0ZSB2YWx1ZVxuLy8gcmVhZHMgJ0luZmluaXR5JyBhbmQgbmVnYXRpdmUgemVybyAoYSB0aWNrIGEgZmxvYXQgZXJyb3IgbGVhdmVzIGp1c3QgYmVsb3dcbi8vIHplcm8pIHJlYWRzICcwJy5cbmNvbnN0IFBMQUlOX05VTUJFUjogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zID0geyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIwIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQbGFpbk51bWJlcih2YWx1ZTogdW5rbm93biwgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBjb25zdCBudW1lcmljID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgID8gdmFsdWVcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpICE9PSAnJyA/IE51bWJlcih2YWx1ZSkgOiBOYU47XG5cbiAgaWYgKE51bWJlci5pc05hTihudW1lcmljKSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnLSc7XG4gIH1cblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBTdHJpbmcobnVtZXJpYyk7XG4gIH1cblxuICByZXR1cm4gbnVtYmVyRm9ybWF0KGxvY2FsZSwgUExBSU5fTlVNQkVSKS5mb3JtYXQobnVtZXJpYyA9PT0gMCA/IDAgOiBudW1lcmljKTtcbn1cblxuXG4vLyBUaGUgYXhpcyBwZWFrIGF0IHdoaWNoIGEgbmF0aXZlIGNoYXJ0J3MgdmFsdWUgYXhpcyBnYWlucyB0aG91c2FuZHNcbi8vIHNlcGFyYXRvcnMuIEZyb20gaGVyZSB1cCB0aGUgdGlja3MgYXJlIHdob2xlIG51bWJlcnMgaW4gcHJhY3RpY2U7IGJlbG93IGl0XG4vLyBuZWl0aGVyIHRoZSBzY3JlZW4gbm9yIFBvd2VyUG9pbnQncyAnR2VuZXJhbCcgc2hvd3MgYSBzZXBhcmF0b3IuXG5leHBvcnQgY29uc3QgQVhJU19TRVBBUkFUT1JfVEhSRVNIT0xEID0gMTAwMDtcblxuLy8gUG93ZXJQb2ludCdzIG51bWJlciBmb3JtYXQgZm9yIGEgbmF0aXZlIGNoYXJ0J3MgdmFsdWUgYXhpcywgbWF0Y2hpbmcgd2hhdCB0aGVcbi8vIG9uLXNjcmVlbiBheGlzIHByaW50cyBieSBkZWZhdWx0OiB0aG91c2FuZHMgc2VwYXJhdG9ycyB3aXRoIGVhY2ggdGljaydzIG93blxuLy8gZGVjaW1hbHMuIEV4Y2VsIGhhcyBubyBcIkdlbmVyYWwgd2l0aCBzZXBhcmF0b3JzXCIsIHNvIGFuIGF4aXMgcmVhY2hpbmcgMSwwMDBcbi8vICh3aGVyZSB0aWNrcyBhcmUgd2hvbGUgbnVtYmVycykgZ2V0cyAnIywjIzAnLCBhbmQgYSBzbWFsbGVyIHJhbmdlIGtlZXBzXG4vLyAnR2VuZXJhbCcgc28gZnJhY3Rpb25hbCB0aWNrcyAoMC4yNSwgMC41KSBhcmUgbm90IHJvdW5kZWQgYXdheS5cbi8vXG4vLyBUaGUgcGVhayBpcyBjaGFydFZhbHVlUGVhaydzLlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0QXhpc0Zvcm1hdENvZGUoc2VyaWVzOiAobnVtYmVyIHwgbnVsbClbXVtdLCBzdGFja2VkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYXJ0VmFsdWVQZWFrKHNlcmllcywgc3RhY2tlZCkgPj0gQVhJU19TRVBBUkFUT1JfVEhSRVNIT0xEID8gJyMsIyMwJyA6ICdHZW5lcmFsJztcbn1cblxuLy8gVGhlIGxhcmdlc3QgbWFnbml0dWRlIGEgY2hhcnQncyB2YWx1ZSBheGlzIGhhcyB0byByZWFjaC4gQSBtaXNzaW5nIHZhbHVlXG4vLyBjb3VudHMgYXMgMC4gQSBzdGFja2VkIGNoYXJ0J3MgcGVhayBpcyBpdHMgdGFsbGVzdCBzdGFjazogdGhlIGxhcmdlc3Qgc3VtLFxuLy8gcGVyIGNhdGVnb3J5LCBvZiBldmVyeSBzZXJpZXMnIGFic29sdXRlIHZhbHVlLlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0VmFsdWVQZWFrKHNlcmllczogKG51bWJlciB8IG51bGwpW11bXSwgc3RhY2tlZDogYm9vbGVhbik6IG51bWJlciB7XG4gIGNvbnN0IG1hZ25pdHVkZXMgPSBzZXJpZXMubWFwKCh2YWx1ZXMpID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBNYXRoLmFicyh2YWx1ZSA/PyAwKSkpO1xuXG4gIHJldHVybiBzdGFja2VkXG4gICAgPyBNYXRoLm1heCgwLCAuLi4obWFnbml0dWRlc1swXSA/PyBbXSkubWFwKChfLCBpbmRleCkgPT4gbWFnbml0dWRlc1xuICAgICAgLnJlZHVjZSgoc3VtLCB2YWx1ZXMpID0+IHN1bSArICh2YWx1ZXNbaW5kZXhdID8/IDApLCAwKSkpXG4gICAgOiBNYXRoLm1heCgwLCAuLi5tYWduaXR1ZGVzLmZsYXQoKSk7XG59XG5cblxuLy8gVGhlIHpvbmUgZXZlcnkgZGF0ZSBpbiBhIHJlcG9ydCBpcyByZWFkIGluLiBUaGUgc2VydmVyIHJlc29sdmVzIGl0ICh0aGVcbi8vIHJlcG9ydCdzIG93biB6b25lLCBlbHNlIHRoZSBhcHBsaWNhdGlvbidzIGRlZmF1bHQgcmVwb3J0aW5nIHpvbmUpIGFuZCBzZW5kc1xuLy8gaXQgYXMgYGVmZmVjdGl2ZVRpbWV6b25lYC4gQSBzZXJ2ZXIgdG9vIG9sZCB0byBzZW5kIHRoZSBmaWVsZCBzdGlsbCB1c2VkIGFcbi8vIHJlcG9ydCdzIHBpbm5lZCBgdGltZXpvbmVgLCBzbyB0aGF0IGNvbWVzIG5leHQ7IHRoZSBicm93c2VyJ3Mgem9uZSBpcyB0aGUgbGFzdFxuLy8gZmFsbGJhY2suIFRoaXMgaXMgdGhlIG9uZSBwbGFjZSB0aGF0IGNoYWluIGxpdmVzLCBzbyBldmVyeSBkYXRlIHRoZSB2aWV3ZXJcbi8vIHJlbmRlcnMgb3IgcmVzb2x2ZXMgYWdyZWVzIHdpdGggZXZlcnkgb3RoZXIuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydDogUGljazxSZXBvcnQsICdlZmZlY3RpdmVUaW1lem9uZScgfCAndGltZXpvbmUnPik6IHN0cmluZyB7XG4gIHJldHVybiByZXBvcnQuZWZmZWN0aXZlVGltZXpvbmUgPz8gcmVwb3J0LnRpbWV6b25lID8/IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbn1cblxuXG4vLyBUaGUgZGF0ZSBzaGFwZXMgYSByZXBvcnQgd3JpdGVzLCBlYWNoIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG4vLyAnSmFuIDUsIDIwMjYnIC8gJzUgamFudi4gMjAyNic6IGEgZGF0ZSBjZWxsLCBhIGZpbHRlciBib3VuZC5cbmV4cG9ydCBjb25zdCBEQVlfU0hPUlQ6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJyB9O1xuLy8gJ0phbnVhcnkgNSwgMjAyNicgLyAnNSBqYW52aWVyIDIwMjYnOiBhbiBleHBvcnQgY292ZXIncyBkYXRlIGxpbmUuXG5leHBvcnQgY29uc3QgREFZX0xPTkc6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH07XG4vLyAnSmFudWFyeScgLyAnamFudmllcic6IGEgbW9udGhseSBwZXJpb2QgbGFiZWwgKGl0cyB5ZWFyIGlzIGFkZGVkIGFwYXJ0KS5cbmV4cG9ydCBjb25zdCBNT05USF9MT05HOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgbW9udGg6ICdsb25nJyB9O1xuLy8gJ0phbnVhcnkgMjAyNicgLyAnamFudmllciAyMDI2JzogYSBtb250aGx5IHBlcmlvZCBsYWJlbCB3cml0dGVuIGluIGZ1bGwuXG5leHBvcnQgY29uc3QgTU9OVEhfWUVBUjogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9O1xuLy8gJ0phbiA1JyAvICc1IGphbnYuJzogYSBkYWlseSBvciB3ZWVrbHkgcGVyaW9kIGxhYmVsLlxuZXhwb3J0IGNvbnN0IE1PTlRIX0RBWTogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJyB9O1xuXG4vLyBBIGRhdGUgaW4gdGhlIGxvY2FsZS4gV2l0aCBhIHpvbmUsIHRoZSBkYXkgaXQgZmFsbHMgb24gdGhlcmU7IHdpdGhvdXQgb25lLFxuLy8gdGhlIGJyb3dzZXIncyB6b25lLCB3aGljaCBrZWVwcyBhIGNhbGVuZGFyIGRheSBwYXJzZWQgYXMgbG9jYWwgbWlkbmlnaHRcbi8vIHVuc2hpZnRlZC4gSXQgbmV2ZXIgdGhyb3dzLCBzaW5jZSBhIHBpcGUgb3IgYW4gZXhwb3J0IGNhbGxzIGl0IHBlciBjZWxsOiBhblxuLy8gaW52YWxpZCBEYXRlIHJlYWRzICcnLCBhIG1hbGZvcm1lZCBsb2NhbGUgKCdlbl9DQScpIHJlYWRzIHRoZSBmYWxsYmFja1xuLy8gbG9jYWxlLCBhbmQgYW4gdW5rbm93biB6b25lIHJlYWRzIFVUQywgd2hpY2ggc3RpbGwgbmFtZXMgYSByZWFsIGRheS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMb2NhbERhdGUoXG4gIGRhdGU6IERhdGUsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgdGltZVpvbmU/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHdyaXRlRGF0ZShkYXRlRm9ybWF0KGxvY2FsZSwgb3B0aW9ucywgdGltZVpvbmUpLCBkYXRlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZvcm1hdEZhbGxiYWNrRGF0ZShkYXRlLCByZXNvbHZlUmVwb3J0TG9jYWxlKGxvY2FsZSksIG9wdGlvbnMsIHRpbWVab25lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRGYWxsYmFja0RhdGUoXG4gIGRhdGU6IERhdGUsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyxcbiAgdGltZVpvbmU/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiB3cml0ZURhdGUoZGF0ZUZvcm1hdChsb2NhbGUsIG9wdGlvbnMsIHRpbWVab25lKSwgZGF0ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB3cml0ZURhdGUoZGF0ZUZvcm1hdChsb2NhbGUsIG9wdGlvbnMsICdVVEMnKSwgZGF0ZSk7XG4gIH1cbn1cblxuLy8gSW50bCB3cml0ZXMgYSB5ZWFyIGJlbG93IDEwMDAgd2l0aCBvbmx5IHRoZSBkaWdpdHMgaXQgaGFzICgnSmFuIDEsIDEnKTsgYVxuLy8gZGF0ZSdzIHllYXIgaXMgYWx3YXlzIHdyaXR0ZW4gd2l0aCBmb3VyICgnSmFuIDEsIDAwMDEnKSwgc28gYSBzZW50aW5lbCBkYXlcbi8vIHN0aWxsIHJlYWRzIGFzIGEgZGF0ZS4gT25seSBzdWNoIGEgeWVhciBwYXlzIGZvciBmb3JtYXRUb1BhcnRzLlxuZnVuY3Rpb24gd3JpdGVEYXRlKGZvcm1hdHRlcjogSW50bC5EYXRlVGltZUZvcm1hdCwgZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gIGlmIChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgPiAxMDAwKSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQoZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICd5ZWFyJyA/IHBhcnQudmFsdWUucGFkU3RhcnQoNCwgJzAnKSA6IHBhcnQudmFsdWUpXG4gICAgLmpvaW4oJycpO1xufVxuXG5cbmNvbnN0IERBVEVfT05MWV9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuY29uc3QgREFURV9USU1FX1BBVFRFUk4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfSlbIFRdKFxcZHsyfTpcXGR7Mn06XFxkezJ9KShcXC5cXGQrKT8kLztcblxuLy8gQSByZXBvcnQgcm93J3MgZGF0ZSBjZWxsIGFzIGEgY2FsZW5kYXIgZGF5IGluIHRoZSByZXBvcnQncyB6b25lLlxuLy9cbi8vIFJlcG9ydCByb3dzIGFyZSByYXcgZGF0YWJhc2Ugc3RyaW5ncywgbm90IHNlcmlhbGl6ZWQgbW9kZWxzLCBzbyB0aGVpciBzaGFwZVxuLy8gaXMgdGhlIHdpcmUgY29udHJhY3Q6IGEgREFURSBjb2x1bW4gYXJyaXZlcyBhcyAnWVlZWS1NTS1ERCcgYW5kIGFcbi8vIGRhdGUtYW5kLXRpbWUgY29sdW1uIGFzICdZWVlZLU1NLUREIEhIOk1NOlNTJyBpbiBVVEMuIFJlYWRpbmcgdGhhdCBzaGFwZVxuLy8gaGVyZSBkb2VzIG5vdCByZS1kZXJpdmUgYSBzZXJ2ZXIgcnVsZTsgaXQgb25seSBzdG9wcyB0aGUgYnJvd3NlciBndWVzc2luZy5cbi8vIC0gQSBjYWxlbmRhciBkYXkgaXMgbmV2ZXIgc2hpZnRlZDogcGFyc2VJU08gcmVhZHMgaXQgYXMgbG9jYWwgbWlkbmlnaHQsIHNvXG4vLyAgIHRoZSBkYXkgcHJpbnRlZCBpcyB0aGUgZGF5IHN0b3JlZCwgd2hhdGV2ZXIgdGhlIHpvbmUuXG4vLyAtIEFuIGluc3RhbnQgaXMgcGlubmVkIHRvIFVUQyB3aXRoIGFuIGV4cGxpY2l0ICdaJywgdGhlbiBzaG93biBhcyB0aGUgZGF5IGl0XG4vLyAgIGZlbGwgb24gaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSB0aGUgZmlsdGVycyBhbmQgdGltZSBidWNrZXRzIHVzZS5cbi8vIC0gQW55dGhpbmcgZWxzZSBpcyBzaG93biBhcyBpdCBjYW1lLCBhbmQgc28gaXMgYSB2YWx1ZSB0aGF0IGhhcyB0aGUgc2hhcGVcbi8vICAgYnV0IG5hbWVzIG5vIHJlYWwgZGF5IChhIHplcm8gZGF0ZSAnMDAwMC0wMC0wMCcsIG9yICcyMDI2LTAyLTMwJyk6IG9uZVxuLy8gICBiYWQgY2VsbCBtdXN0IG5vdCB0aHJvdyBvdXQgb2YgYSBwaXBlIG9yIGFib3J0IGFuIGV4cG9ydC5cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlOiAnSmFuIDUsIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LlxuLy8gMjAyNicgaW4gZnItQ0EuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVwb3J0RGF0ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IFN0cmluZyh2YWx1ZSk7XG5cbiAgaWYgKERBVEVfT05MWV9QQVRURVJOLnRlc3QodGV4dCkpIHtcbiAgICBjb25zdCBkYXkgPSBwYXJzZUlTTyh0ZXh0KTtcblxuICAgIHJldHVybiBpc1ZhbGlkKGRheSkgPyBmb3JtYXRMb2NhbERhdGUoZGF5LCBsb2NhbGUsIERBWV9TSE9SVCkgOiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgZGF0ZVRpbWUgPSBEQVRFX1RJTUVfUEFUVEVSTi5leGVjKHRleHQpO1xuICBpZiAoIWRhdGVUaW1lKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBjb25zdCBpbnN0YW50ID0gcGFyc2VJU08oYCR7ZGF0ZVRpbWVbMV19VCR7ZGF0ZVRpbWVbMl19WmApO1xuXG4gIHJldHVybiBpc1ZhbGlkKGluc3RhbnQpID8gZm9ybWF0TG9jYWxEYXRlKGluc3RhbnQsIGxvY2FsZSwgREFZX1NIT1JULCB0aW1lem9uZSkgOiB0ZXh0O1xufVxuXG5cbi8vIFRoZSB0aW1lIG9mIGRheSBhbiBpbnN0YW50IGZhbGxzIGF0IGluIHRoZSByZXBvcnQncyB6b25lOiAnMjoyMyBQTScgaW5cbi8vIGVuLVVTLCAnMTQgaCAyMycgaW4gZnItQ0EuXG5leHBvcnQgY29uc3QgVElNRV9TSE9SVDogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfTtcblxuLy8gQSB3aW5kb3cncyBpbmNsdXNpdmUgZGF5cywgYXMgdGhlIHNlcnZlciBzZW5kcyB0aGVtOiAneXl5eS1NTS1kZCcgY2FsZW5kYXJcbi8vIGRheXMgYWxyZWFkeSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gTGlrZSBhIGRhdGUgY2VsbCB0aGV5IGFyZSByZWFkIGFzIGxvY2FsXG4vLyBtaWRuaWdodCBhbmQgd3JpdHRlbiB3aXRoIE5PIHpvbmUsIHNvIGEgdmlld2VyIGluIGFueSB6b25lIHNlZXMgdGhlIGRheXNcbi8vIHNlbnQuIEJvdGggZGF5czogSW50bCdzIHJhbmdlIGluIHRoZSBsb2NhbGUgKCdTZXAgMSDigJMgMzAsIDIwMjYnIGluIGVuLVVTLFxuLy8gJzHigJMzMCBzZXB0LiAyMDI2JyBpbiBmci1DQSwgb25lIGRhdGUgd2hlbiB0aGV5IGFyZSB0aGUgc2FtZSBkYXkpLiBPbmUgZGF5OlxuLy8gYW4gb3BlbiB3aW5kb3cgKCdTaW5jZSBTZXAgMSwgMjAyNicsICdUaHJvdWdoIFNlcCAzMCwgMjAyNicpLiBOZWl0aGVyLCBvclxuLy8gZGF5cyB0aGF0IGFyZSBub3QgcmVhbCBvbmVzOiAnJy5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXlSYW5nZShcbiAgc3RhcnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGVuZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0gREFZX1NIT1JULFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZmlyc3QgPSBwYXJzZURheShzdGFydCk7XG4gIGNvbnN0IGxhc3QgPSBwYXJzZURheShlbmQpO1xuXG4gIGlmIChmaXJzdCAmJiBsYXN0KSB7XG4gICAgcmV0dXJuIHdyaXRlRGF5UmFuZ2UoZmlyc3QsIGxhc3QsIGxvY2FsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAoZmlyc3QpIHtcbiAgICByZXR1cm4gYFNpbmNlICR7Zm9ybWF0TG9jYWxEYXRlKGZpcnN0LCBsb2NhbGUsIG9wdGlvbnMpfWA7XG4gIH1cblxuICByZXR1cm4gbGFzdCA/IGBUaHJvdWdoICR7Zm9ybWF0TG9jYWxEYXRlKGxhc3QsIGxvY2FsZSwgb3B0aW9ucyl9YCA6ICcnO1xufVxuXG4vLyBUaGUgdGltZSBhIHdpbmRvdyBlbmRpbmcgdG9kYXkgaXMgY3V0IGF0OiB0aGUgc2VydmVyJ3MgVVRDXG4vLyAneXl5eS1NTS1kZCBISDptbTpzcycgaW5zdGFudCwgYXMgYSB0aW1lIG9mIGRheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gJydcbi8vIGZvciBub25lLCBvciBmb3IgYSB2YWx1ZSBvZiBhbm90aGVyIHNoYXBlLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRocm91Z2hUaW1lKFxuICB0aHJvdWdoOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGVUaW1lID0gdGhyb3VnaCA/IERBVEVfVElNRV9QQVRURVJOLmV4ZWModGhyb3VnaCkgOiBudWxsO1xuICBjb25zdCBpbnN0YW50ID0gZGF0ZVRpbWUgPyBwYXJzZUlTTyhgJHtkYXRlVGltZVsxXX1UJHtkYXRlVGltZVsyXX1aYCkgOiBudWxsO1xuXG4gIHJldHVybiBpbnN0YW50ICYmIGlzVmFsaWQoaW5zdGFudCkgPyBmb3JtYXRMb2NhbERhdGUoaW5zdGFudCwgbG9jYWxlLCBUSU1FX1NIT1JULCB0aW1lem9uZSkgOiAnJztcbn1cblxuLy8gQSBjb21wYXJpc29uIG9yIHRpbWVmcmFtZSB3aW5kb3cgaW4gb25lIGxpbmU6IGl0cyBkYXlzLCBhbmQgdGhlIHRpbWUgaXQgaXNcbi8vIGN1dCBhdCB3aGVuIGl0IGVuZHMgdG9kYXkgb24gYSBkYXRlLWFuZC10aW1lIGNvbHVtbiAoJ09jdCAxIOKAkyAyLCAyMDI2LFxuLy8gdW50aWwgMjoyMyBQTScpLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERheVdpbmRvdyhcbiAgbWV0YTogeyBzdGFydDogc3RyaW5nIHwgbnVsbDsgZW5kOiBzdHJpbmcgfCBudWxsOyB0aHJvdWdoPzogc3RyaW5nIHwgbnVsbCB9LFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRheXMgPSBmb3JtYXREYXlSYW5nZShtZXRhLnN0YXJ0LCBtZXRhLmVuZCwgbG9jYWxlKTtcbiAgY29uc3QgdGltZSA9IGZvcm1hdFRocm91Z2hUaW1lKG1ldGEudGhyb3VnaCwgdGltZXpvbmUsIGxvY2FsZSk7XG5cbiAgcmV0dXJuIGRheXMgJiYgdGltZSA/IGAke2RheXN9LCB1bnRpbCAke3RpbWV9YCA6IGRheXM7XG59XG5cbi8vIFdoZXRoZXIgYSBjb21wYXJpc29uIGlzIHJlYWQgb24gb25lIGRheTogYSBjb21wYXJpc29uIG9mIHZhbHVlcyByZWFkIGF0XG4vLyB0aGUgZW5kIG9mIGVhY2ggcGVyaW9kLCB3aXRoIG5vIHRpbWUgYXhpcyBvZiBpdHMgb3duIChhIEtQSSwgYSBvbmUtcm93XG4vLyBsaXN0KSwgd2hvc2UgdmFsdWUgaXMgcmVhZCB0b2RheSBhbmQgd2hvc2UgcHJpb3IgaXMgcmVhZCBhdCB0aGUgZW5kIG9mXG4vLyB0aGUgcGVyaW9kIGJlZm9yZS4gSXRzIHR3byB3aW5kb3dzIGFyZSB0aG9zZSBwZXJpb2RzLCBiYWNrIHRvIGJhY2ssIGFuZFxuLy8gZWFjaCB2YWx1ZSBpcyByZWFkIG9uIGl0cyB3aW5kb3cncyBsYXN0IGRheSwgc28gdGhlIHdpbmRvd3MgYXJlIHdyaXR0ZW4gYXNcbi8vIHRob3NlIGRheXMgKGZvcm1hdFJlYWRpbmdEYXkpLiBBIHNwaW5lIG9mIHNldmVyYWwgcGVyaW9kcyBzZXRzIGVhY2ggcGVyaW9kXG4vLyBhZ2FpbnN0IGFuIGVhcmxpZXIgb25lLCBhbmQgaXRzIHdpbmRvd3MgYXJlIHNwYW5zIGxpa2UgYW55IG90aGVyXG4vLyBjb21wYXJpc29uJ3MuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkT25PbmVEYXkoY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IGNvbXBhcmlzb24/LmN1cnJlbnQ7XG4gIGNvbnN0IHByaW9yID0gY29tcGFyaXNvbj8ucHJpb3JzPy5bMF07XG5cbiAgaWYgKGNvbXBhcmlzb24/Lm1vZGUgIT09ICdwZXJpb2RfZW5kJyB8fCAhY3VycmVudCB8fCAhcHJpb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcmlvckVuZCA9IHBhcnNlRGF5KHByaW9yLmVuZCk7XG4gIGNvbnN0IGN1cnJlbnRTdGFydCA9IHBhcnNlRGF5KGN1cnJlbnQuc3RhcnQpO1xuXG4gIHJldHVybiAhIXByaW9yRW5kICYmICEhY3VycmVudFN0YXJ0ICYmIGFkZERheXMocHJpb3JFbmQsIDEpLmdldFRpbWUoKSA9PT0gY3VycmVudFN0YXJ0LmdldFRpbWUoKTtcbn1cblxuLy8gVGhlIGRheSBhIHZhbHVlIGlzIHJlYWQgb246ICdvbiBTZXAgMTUsIDIwMjYnICgnT24g4oCmJyB0byBvcGVuIGEgbGluZSksIGFzXG4vLyBhIGNoYXJ0J3MgdG9vbHRpcCBuYW1lcyBhIHByaW9yIHBvaW50IHJlYWQgYXQgdGhlIGVuZCBvZiBpdHMgcGVyaW9kLiAnJ1xuLy8gZm9yIGEgZGF5IHRoYXQgaXMgbm90IGEgcmVhbCBvbmUuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVhZGluZ0RheShcbiAgd2luZG93OiBQaWNrPENvbXBhcmlzb25XaW5kb3csICdlbmQnPixcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGxlYWQgPSBmYWxzZSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRheSA9IGZvcm1hdERheSh3aW5kb3cuZW5kLCBsb2NhbGUpO1xuXG4gIGlmICghZGF5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGxlYWQgPyBgT24gJHtkYXl9YCA6IGBvbiAke2RheX1gO1xufVxuXG4vLyBPbmUgJ3l5eXktTU0tZGQnIGRheSBpbiB0aGUgbG9jYWxlLCB3cml0dGVuIHdpdGggbm8gem9uZTogJ1NlcCAxLCAyMDI2Jy5cbmZ1bmN0aW9uIGZvcm1hdERheShkYXk6IHN0cmluZywgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBjb25zdCBkYXRlID0gcGFyc2VEYXkoZGF5KTtcblxuICByZXR1cm4gZGF0ZSA/IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCkgOiAnJztcbn1cblxuLy8gQSAneXl5eS1NTS1kZCcgZGF5IGFzIGxvY2FsIG1pZG5pZ2h0LCBvciBudWxsIHdoZW4gaXQgaXMgbm90IGEgcmVhbCBkYXkuXG5mdW5jdGlvbiBwYXJzZURheShkYXk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB7XG4gIGlmICghZGF5IHx8ICFEQVRFX09OTFlfUEFUVEVSTi50ZXN0KGRheSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBwYXJzZUlTTyhkYXkpO1xuXG4gIHJldHVybiBpc1ZhbGlkKGRhdGUpID8gZGF0ZSA6IG51bGw7XG59XG5cbi8vIEludGwncyByYW5nZSB3cml0ZXMgdGhlIHNoYXJlZCBtb250aCBhbmQgeWVhciBvbmNlLiBBIG1hbGZvcm1lZCBsb2NhbGVcbi8vIHJlYWRzIHRoZSBmYWxsYmFjazsgYSBydW50aW1lIHRoYXQgY2Fubm90IHdyaXRlIHJhbmdlcyBqb2lucyB0d28gZGF0ZXMuXG5mdW5jdGlvbiB3cml0ZURheVJhbmdlKGZpcnN0OiBEYXRlLCBsYXN0OiBEYXRlLCBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZywgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBbZnJvbSwgdG9dID0gZmlyc3QgPD0gbGFzdCA/IFtmaXJzdCwgbGFzdF0gOiBbbGFzdCwgZmlyc3RdO1xuXG4gIGZvciAoY29uc3QgdGFnIG9mIFtsb2NhbGUsIHJlc29sdmVSZXBvcnRMb2NhbGUobG9jYWxlKV0pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRhdGVGb3JtYXQodGFnLCBvcHRpb25zKS5mb3JtYXRSYW5nZShmcm9tLCB0byk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbmV4dCBsb2NhbGUsIHRoZW4gdGhlIGpvaW5lZCBkYXRlcy5cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYCR7Zm9ybWF0TG9jYWxEYXRlKGZyb20sIGxvY2FsZSwgb3B0aW9ucyl9IOKAkyAke2Zvcm1hdExvY2FsRGF0ZSh0bywgbG9jYWxlLCBvcHRpb25zKX1gO1xufVxuXG5cbi8vIEVuZ2xpc2ggbmFtZXMgZm9yIGEgbG9jYWxlIGFuZCBhIGN1cnJlbmN5LCBmb3IgdGhlIHNldHRpbmdzIHNlbGVjdHMuIFRoZVxuLy8gaW50ZXJmYWNlIHN0YXlzIEVuZ2xpc2ggd2hhdGV2ZXIgdGhlIHJlcG9ydCdzIGxvY2FsZTogJ2ZyLUNBJyByZWFkc1xuLy8gJ0NhbmFkaWFuIEZyZW5jaCcsICdDQUQnIHJlYWRzICdDYW5hZGlhbiBEb2xsYXInLiBBIHJ1bnRpbWUgd2l0aG91dCB0aGVcbi8vIG5hbWVzIHNob3dzIHRoZSBjb2RlLlxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsZU5hbWUodGFnOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICByZXR1cm4gZGlzcGxheU5hbWUoJ2xhbmd1YWdlJywgdGFnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbmN5TmFtZShjb2RlOiBSZXBvcnRDdXJyZW5jeUNvZGUpOiBzdHJpbmcge1xuICByZXR1cm4gZGlzcGxheU5hbWUoJ2N1cnJlbmN5JywgY29kZSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlOYW1lKHR5cGU6ICdsYW5ndWFnZScgfCAnY3VycmVuY3knLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgSW50bC5EaXNwbGF5TmFtZXMoWydlbiddLCB7IHR5cGUgfSkub2YoY29kZSkgPz8gY29kZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbn1cblxuXG4vLyBDb21wYXJpc29uLCB3aW5kb3cgYW5kIEtQSSB3b3JkaW5nLiBUaGUgc2VydmVyIHNlbmRzIGNvZGVzIGFuZCBmaWVsZHMsXG4vLyBuZXZlciBzZW50ZW5jZXMgKGEgd2luZG93J3MgZGVzY3JpcHRpb24gaXMgZm9yIHRoZSBhZ2VudCBhbmQgdGhlIGV4cG9ydHMnXG4vLyBub3Rlcywgbm90IHRoZSBzY3JlZW4pOyB0aGUgaW50ZXJmYWNlIHdvcmRzIHRoZW0gaGVyZSwgaW4gRW5nbGlzaCBsaWtlXG4vLyBldmVyeSBvdGhlciBsYWJlbCwgd2l0aCBhbnkgZGF5IHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cblxuY29uc3QgR1JBTlVMQVJJVFlfVU5JVFM6IFJlY29yZDxDaGFydEdyYW51bGFyaXR5LCB7IG9uZTogc3RyaW5nOyBtYW55OiBzdHJpbmcgfT4gPSB7XG4gIGRheTogeyBvbmU6ICdkYXknLCBtYW55OiAnZGF5cycgfSxcbiAgd2VlazogeyBvbmU6ICd3ZWVrJywgbWFueTogJ3dlZWtzJyB9LFxuICBtb250aDogeyBvbmU6ICdtb250aCcsIG1hbnk6ICdtb250aHMnIH0sXG4gIHF1YXJ0ZXI6IHsgb25lOiAncXVhcnRlcicsIG1hbnk6ICdxdWFydGVycycgfSxcbiAgeWVhcjogeyBvbmU6ICd5ZWFyJywgbWFueTogJ3llYXJzJyB9LFxufTtcblxuLy8gV2hhdCBhIHByaW9yIGxhbmUgaXMgY2FsbGVkOiBhbHdheXMgc28gZm9yIGEgbmFtZWQgcGVyaW9kLCBhbmQgZm9yIHRoZVxuLy8gcHJldmlvdXMgcGVyaW9kIHdoZW4gdGhlIHNlcnZlciBuYW1lcyBubyB1bml0IGZvciBpdC5cbmNvbnN0IEFHQUlOU1RfUEhSQVNFUzogUmVjb3JkPENvbXBhcmlzb25BZ2FpbnN0LCBzdHJpbmc+ID0ge1xuICBwcmV2aW91c19wZXJpb2Q6ICdwcmV2aW91cyBwZXJpb2QnLFxuICBwcmV2aW91c193ZWVrOiAncHJldmlvdXMgd2VlaycsXG4gIHByZXZpb3VzX21vbnRoOiAncHJldmlvdXMgbW9udGgnLFxuICBwcmV2aW91c19xdWFydGVyOiAncHJldmlvdXMgcXVhcnRlcicsXG4gIHByZXZpb3VzX3llYXI6ICdwcmV2aW91cyB5ZWFyJyxcbiAgcmFuZ2U6ICdjdXN0b20gcmFuZ2UnLFxufTtcblxuLy8gQSBwcmlvciBsYW5lJ3MgbGFiZWwsIGZyb20gaXRzIG9mZnNldCByYXRoZXIgdGhhbiBmcm9tIHRoZSBtZWFzdXJlLCBzbyBhXG4vLyBjaGFydCByZWdyb3VwZWQgYnkgdGhlIHZpZXdlciBzYXlzIHdoYXQgaXQgbm93IGNvbXBhcmVzLiBBIG5hbWVkIHBlcmlvZFxuLy8gcmVhZHMgYnkgaXRzIG5hbWUgd2hhdGV2ZXIgc2hpZnQgY2FycmllcyBpdCAoJ3ZzIHByZXZpb3VzIHF1YXJ0ZXInIGZvciAzXG4vLyBtb250aHMsICd2cyBwcmV2aW91cyB5ZWFyJyBmb3IgMzY0IGRheXMgb3IgNTIgd2Vla3MsICd2cyBjdXN0b20gcmFuZ2UnKS5cbi8vIE9ubHkgdGhlIHByZXZpb3VzIHBlcmlvZCBpcyB3b3JkZWQgZnJvbSBpdHMgdW5pdCBhbmQgY291bnQ6ICd2cyBwcmV2aW91c1xuLy8gd2VlaycsICd2cyBwcmV2aW91cyAzIG1vbnRocycsICd2cyBwcmV2aW91cyA4IGRheXMnIChhIGRheS1sZW5ndGggc2hpZnQpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmlzb25PZmZzZXRMYWJlbChvZmZzZXQ6IENvbXBhcmlzb25PZmZzZXQpOiBzdHJpbmcge1xuICByZXR1cm4gYHZzICR7b2Zmc2V0UGhyYXNlKG9mZnNldCl9YDtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0UGhyYXNlKG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCk6IHN0cmluZyB7XG4gIGlmIChvZmZzZXQuYWdhaW5zdCAhPT0gJ3ByZXZpb3VzX3BlcmlvZCcgfHwgIW9mZnNldC51bml0IHx8ICFvZmZzZXQuY291bnQpIHtcbiAgICByZXR1cm4gQUdBSU5TVF9QSFJBU0VTW29mZnNldC5hZ2FpbnN0XSA/PyBBR0FJTlNUX1BIUkFTRVMucHJldmlvdXNfcGVyaW9kO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldC5jb3VudCA9PT0gMVxuICAgID8gYHByZXZpb3VzICR7R1JBTlVMQVJJVFlfVU5JVFNbb2Zmc2V0LnVuaXRdLm9uZX1gXG4gICAgOiBgcHJldmlvdXMgJHtvZmZzZXQuY291bnR9ICR7R1JBTlVMQVJJVFlfVU5JVFNbb2Zmc2V0LnVuaXRdLm1hbnl9YDtcbn1cblxuLy8gT25lIGNvbXBhcmlzb24gbm90ZSBhcyBhIHNlbnRlbmNlLiBUaGUgY29tcGFyaXNvbiwgd2hlbiBnaXZlbiwgbmFtZXMgdGhlXG4vLyBwZXJpb2QgY29tcGFyZWQgd2l0aCAoaXRzIGZpcnN0IHByaW9yIGxhbmUpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmlzb25Ob3RlVGV4dChcbiAgY29kZTogQ29tcGFyaXNvbk5vdGVDb2RlLFxuICBjb21wYXJpc29uPzogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvZmZzZXQgPSBjb21wYXJpc29uPy5vZmZzZXRzPy5bMF0gPz8gbnVsbDtcbiAgY29uc3QgY29tcGFyZWQgPSBvZmZzZXQgPyBgQ29tcGFyZWQgd2l0aCB0aGUgJHtvZmZzZXRQaHJhc2Uob2Zmc2V0KX1gIDogbnVsbDtcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlICdub193aW5kb3cnOlxuICAgICAgcmV0dXJuICdQaWNrIGEgZGF0ZSByYW5nZSB0byBzZWUgdGhlIGNvbXBhcmlzb24uJztcbiAgICBjYXNlICd1bml0X2luZmVycmVkJzpcbiAgICAgIHJldHVybiBjb21wYXJlZFxuICAgICAgICA/IGAke2NvbXBhcmVkfSwganVkZ2VkIGZyb20gdGhlIGRhdGVzIHBpY2tlZC5gXG4gICAgICAgIDogJ1RoZSBwZXJpb2QgY29tcGFyZWQgd2l0aCB3YXMganVkZ2VkIGZyb20gdGhlIGRhdGVzIHBpY2tlZC4nO1xuICAgIGNhc2UgJ3dpbmRvd19pbl9mdXR1cmUnOlxuICAgICAgcmV0dXJuICdUaGUgZGF0ZSByYW5nZSBzdGFydHMgYWZ0ZXIgdG9kYXksIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB5ZXQuJztcbiAgICBjYXNlICdvdGhlcl9kYXRlX2ZpbHRlcic6XG4gICAgICByZXR1cm4gJ0EgZGF0ZSBmaWx0ZXIgb24gYW5vdGhlciBjb2x1bW4gYWxzbyBhcHBsaWVzIHRvIGJvdGggcGVyaW9kcy4nO1xuICAgIGNhc2UgJ2dyYWluX2ZvbGxvd2VkJzpcbiAgICAgIHJldHVybiBjb21wYXJlZFxuICAgICAgICA/IGAke2NvbXBhcmVkfSwgZm9sbG93aW5nIHRoZSBncm91cGluZyBwaWNrZWQuYFxuICAgICAgICA6ICdUaGUgY29tcGFyaXNvbiBmb2xsb3dzIHRoZSBncm91cGluZyBwaWNrZWQuJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8vIFdoYXQgYSB3aW5kb3dlZCB2YWx1ZSBpczogJ1JvbGxpbmcgMy1tb250aCB0b3RhbCcsICdNb250aC10by1kYXRlIHRvdGFsJyxcbi8vICdSdW5uaW5nIHRvdGFsIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgZGF0YScsIHRoZW4gaXRzIGRheXMgd2hlbiB0aGUgc2VydmVyXG4vLyBzZW5kcyB0aGVtICgnUm9sbGluZyA3LWRheSBhdmVyYWdlLCBTZXAgMjQg4oCTIDMwLCAyMDI2JykuIGdyYW51bGFyaXR5IGlzIHRoZVxuLy8gZ3JvdXBpbmcgdGhlIHJvd3MgYXJlIGRyYXduIGF0IChDb21wb25lbnREYXRhLmdyYW51bGFyaXR5KSwgd2hpY2ggbmFtZXMgYVxuLy8gcm9sbGluZyB3aW5kb3cgYXV0aG9yZWQgaW4gcGVyaW9kcyBvZiB0aGUgYXhpcy5cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dUZXh0KFxuICBtZXRhOiBXaW5kb3dNZXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZ3JhbnVsYXJpdHk/OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRheXMgPSBmb3JtYXREYXlSYW5nZShtZXRhLnN0YXJ0LCBtZXRhLmVuZCwgbG9jYWxlKTtcbiAgY29uc3QgcGhyYXNlID0gd2luZG93UGhyYXNlKG1ldGEsIGdyYW51bGFyaXR5ID8/IG51bGwpO1xuXG4gIHJldHVybiBkYXlzID8gYCR7cGhyYXNlfSwgJHtkYXlzfWAgOiBwaHJhc2U7XG59XG5cbmZ1bmN0aW9uIHdpbmRvd1BocmFzZShtZXRhOiBXaW5kb3dNZXRhLCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IG1ldGEuYXZlcmFnZSA/ICdhdmVyYWdlJyA6ICd0b3RhbCc7XG5cbiAgc3dpdGNoIChtZXRhLmtpbmQpIHtcbiAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgIHJldHVybiBtZXRhLmZyb21CZWdpbm5pbmcgPyBgUnVubmluZyAke3ZhbHVlfSBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIGRhdGFgIDogYFJ1bm5pbmcgJHt2YWx1ZX1gO1xuICAgIGNhc2UgJ3RvX2RhdGUnOiB7XG4gICAgICBjb25zdCByZXNldCA9IG1ldGEucmVzZXRFdmVyeSA/IEdSQU5VTEFSSVRZX1VOSVRTW21ldGEucmVzZXRFdmVyeV0ub25lIDogbnVsbDtcblxuICAgICAgcmV0dXJuIHJlc2V0ID8gYCR7Y2FwaXRhbGl6ZShyZXNldCl9LXRvLWRhdGUgJHt2YWx1ZX1gIDogYFRvLWRhdGUgJHt2YWx1ZX1gO1xuICAgIH1cbiAgICBjYXNlICdyb2xsaW5nJzoge1xuICAgICAgY29uc3QgdW5pdCA9IG1ldGEudW5pdCA/PyBncmFudWxhcml0eTtcbiAgICAgIGNvbnN0IHNwYW4gPSBtZXRhLnBlcmlvZHMgPyBgJHttZXRhLnBlcmlvZHN9LSR7dW5pdCA/IEdSQU5VTEFSSVRZX1VOSVRTW3VuaXRdLm9uZSA6ICdwZXJpb2QnfSBgIDogJyc7XG5cbiAgICAgIHJldHVybiBgUm9sbGluZyAke3NwYW59JHt2YWx1ZX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNhcGl0YWxpemUodmFsdWUpO1xuICB9XG59XG5cbi8vIE9uZSB3aW5kb3cgbm90ZSBhcyBhIHNlbnRlbmNlLlxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd05vdGVUZXh0KFxuICBjb2RlOiBXaW5kb3dOb3RlQ29kZSxcbiAgbWV0YTogV2luZG93TWV0YSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGdyYW51bGFyaXR5PzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlICdzbmFwcGVkX3N0YXJ0Jzoge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtZXRhLnN0YXJ0ID8gZm9ybWF0RGF5KG1ldGEuc3RhcnQsIGxvY2FsZSkgOiAnJztcblxuICAgICAgcmV0dXJuIHN0YXJ0XG4gICAgICAgID8gYFRoZSBzdGFydCB3YXMgbW92ZWQgdG8gJHtzdGFydH0sIHRoZSBzdGFydCBvZiBpdHMgcGVyaW9kLCBzbyB0aGUgZmlyc3QgcGVyaW9kIGlzIHdob2xlLmBcbiAgICAgICAgOiAnVGhlIHN0YXJ0IHdhcyBtb3ZlZCB0byB0aGUgc3RhcnQgb2YgaXRzIHBlcmlvZCwgc28gdGhlIGZpcnN0IHBlcmlvZCBpcyB3aG9sZS4nO1xuICAgIH1cbiAgICBjYXNlICdzcGFuX2NvbnZlcnRlZCc6XG4gICAgICByZXR1cm4gc3BhbkNvbnZlcnRlZFRleHQobWV0YSwgZ3JhbnVsYXJpdHkgPz8gbnVsbCk7XG4gICAgY2FzZSAnZ3JhaW5fdG9vX2NvYXJzZSc6XG4gICAgICByZXR1cm4gJ1RoZSBncm91cGluZyBpcyBjb2Fyc2VyIHRoYW4gdGhlIHdpbmRvdywgc28gaXQgaGFzIG5vIHZhbHVlcyBhdCB0aGlzIGdyb3VwaW5nLic7XG4gICAgY2FzZSAnZXF1YWxfZ3JhaW5fcGxhaW4nOlxuICAgICAgcmV0dXJuICdBdCB0aGlzIGdyb3VwaW5nIGVhY2ggd2luZG93IGlzIGEgc2luZ2xlIHBlcmlvZCwgc28gdGhlIHZhbHVlcyBhcmUgdGhlIHBsYWluIG9uZXMuJztcbiAgICBjYXNlICdvd25fZmlsdGVyX2NhcHNfbGVhZF9pbic6XG4gICAgICByZXR1cm4gJ1RoZSBxdWVyeVxcJ3Mgb3duIGRhdGUgY29uZGl0aW9uIHN0YXJ0cyB0aGUgd2luZG93LCBzbyBlYXJsaWVyIHJvd3MgYXJlIG5vdCBjb3VudGVkLic7XG4gICAgY2FzZSAnd2Vla19ieV9tb25kYXknOlxuICAgICAgcmV0dXJuICdBIHdlZWsgdGhhdCBzcGFucyB0d28gcGVyaW9kcyBjb3VudHMgdG93YXJkIHRoZSBwZXJpb2QgaXRzIE1vbmRheSBmYWxscyBpbi4nO1xuICAgIGNhc2UgJ2luY29tcGxldGVfaGVhZCc6XG4gICAgICByZXR1cm4gJ1RoZSBmaXJzdCBwZXJpb2RzIGFyZSBibGFuayBiZWNhdXNlIHRoZXJlIGFyZSBub3QgZW5vdWdoIGVhcmxpZXIgcm93cyB0byBmaWxsIGEgd2hvbGUgd2luZG93Lic7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vLyAnMyBtb250aHMgYXJlIHNob3duIGFzIDEzIHdlZWtzIGF0IHRoaXMgZ3JvdXBpbmcuJ1xuZnVuY3Rpb24gc3BhbkNvbnZlcnRlZFRleHQobWV0YTogV2luZG93TWV0YSwgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFtZXRhLnBlcmlvZHMgfHwgIW1ldGEudW5pdCB8fCAhbWV0YS5kcmF3blBlcmlvZHMpIHtcbiAgICByZXR1cm4gJ1RoZSB3aW5kb3dcXCdzIHNwYW4gd2FzIGNvbnZlcnRlZCB0byB0aGUgZ3JvdXBpbmcgc2hvd24uJztcbiAgfVxuXG4gIGNvbnN0IGF1dGhvcmVkID0gdW5pdENvdW50KG1ldGEucGVyaW9kcywgbWV0YS51bml0KTtcbiAgY29uc3QgZHJhd24gPSBncmFudWxhcml0eVxuICAgID8gdW5pdENvdW50KG1ldGEuZHJhd25QZXJpb2RzLCBncmFudWxhcml0eSlcbiAgICA6IGAke21ldGEuZHJhd25QZXJpb2RzfSAke21ldGEuZHJhd25QZXJpb2RzID09PSAxID8gJ3BlcmlvZCcgOiAncGVyaW9kcyd9YDtcblxuICByZXR1cm4gYCR7YXV0aG9yZWR9ICR7bWV0YS5wZXJpb2RzID09PSAxID8gJ2lzJyA6ICdhcmUnfSBzaG93biBhcyAke2RyYXdufSBhdCB0aGlzIGdyb3VwaW5nLmA7XG59XG5cbmZ1bmN0aW9uIHVuaXRDb3VudChjb3VudDogbnVtYmVyLCB1bml0OiBDaGFydEdyYW51bGFyaXR5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvdW50fSAke2NvdW50ID09PSAxID8gR1JBTlVMQVJJVFlfVU5JVFNbdW5pdF0ub25lIDogR1JBTlVMQVJJVFlfVU5JVFNbdW5pdF0ubWFueX1gO1xufVxuXG4vLyBXaHkgYSBLUEkncyBkZWx0YSByZWFkcyBhcyBpdCBkb2VzLCBhcyBhIHNlbnRlbmNlLiBUaGUgYmFzZWxpbmUgaXMgbmFtZWRcbi8vIGJ5IHdoYXQgdGhlIHZhbHVlIGlzIGNvbXBhcmVkIGFnYWluc3Q6IHRoZSBzYW1lIHBlcmlvZCBsYXN0IHllYXIgZm9yIGFcbi8vIHllYXItb24teWVhciBjb21wYXJpc29uLCBlbHNlIHRoZSBwZXJpb2QgYmVmb3JlLlxuZXhwb3J0IGZ1bmN0aW9uIGtwaU5vdGVUZXh0KGNvZGU6IEtwaU5vdGVDb2RlLCBhZ2FpbnN0PzogQ29tcGFyaXNvbkFnYWluc3QgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZWxpbmUgPSBrcGlCYXNlbGluZVRleHQoYWdhaW5zdCk7XG5cbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAnbm9fcHJpb3JfZGF0YSc6XG4gICAgICByZXR1cm4gYE5vIGJhc2VsaW5lOiAke2Jhc2VsaW5lfSBoYXMgbm8gZGF0YS5gO1xuICAgIGNhc2UgJ3VwX2Zyb21femVybyc6XG4gICAgICByZXR1cm4gYE5ldzogJHtiYXNlbGluZX0gd2FzIDAuYDtcbiAgICBjYXNlICdub19jaGFuZ2UnOlxuICAgICAgcmV0dXJuIGBObyBjaGFuZ2UgZnJvbSAke2Jhc2VsaW5lfS5gO1xuICAgIGNhc2UgJ25vX2RhdGFfZWl0aGVyJzpcbiAgICAgIHJldHVybiAnTm8gZGF0YSBpbiBlaXRoZXIgcGVyaW9kLic7XG4gICAgY2FzZSAnc2lnbl9jaGFuZ2UnOlxuICAgICAgcmV0dXJuICdUaGUgdmFsdWUgY3Jvc3NlZCB6ZXJvLCBzbyB0aGVyZSBpcyBubyBwZXJjZW50IGNoYW5nZS4nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLy8gVGhlIHdpbmRvdyBhIEtQSSdzIHZhbHVlIGlzIGNvbXBhcmVkIHdpdGgsIGFzIGEgbm91biBwaHJhc2UuIEFuIHVua25vd24gb3Jcbi8vIG1pc3NpbmcgY29tcGFyaXNvbiByZWFkcyBhcyBuZXV0cmFsIHdvcmRpbmcgcmF0aGVyIHRoYW4gYSB3cm9uZyBwZXJpb2QuXG5mdW5jdGlvbiBrcGlCYXNlbGluZVRleHQoYWdhaW5zdDogQ29tcGFyaXNvbkFnYWluc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgc3dpdGNoIChhZ2FpbnN0KSB7XG4gICAgY2FzZSAncHJldmlvdXNfcGVyaW9kJzpcbiAgICAgIHJldHVybiAndGhlIHByZXZpb3VzIHBlcmlvZCc7XG4gICAgY2FzZSAncHJldmlvdXNfd2Vlayc6XG4gICAgICByZXR1cm4gJ3RoZSBwcmV2aW91cyB3ZWVrJztcbiAgICBjYXNlICdwcmV2aW91c19tb250aCc6XG4gICAgICByZXR1cm4gJ3RoZSBwcmV2aW91cyBtb250aCc7XG4gICAgY2FzZSAncHJldmlvdXNfcXVhcnRlcic6XG4gICAgICByZXR1cm4gJ3RoZSBwcmV2aW91cyBxdWFydGVyJztcbiAgICBjYXNlICdwcmV2aW91c195ZWFyJzpcbiAgICAgIHJldHVybiAndGhlIHNhbWUgcGVyaW9kIGxhc3QgeWVhcic7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAndGhlIGNvbXBhcmlzb24gcGVyaW9kJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXBpdGFsaXplKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4dC5zbGljZSgxKTtcbn1cblxuXG4vLyBcIk5vd1wiIGFzIGEgRGF0ZSB3aG9zZSBsb2NhbCBmaWVsZHMgcmVhZCB0aGUgd2FsbCBjbG9jayBpbiB0aGUgZ2l2ZW4gem9uZSwgc29cbi8vIGRhdGUtZm5zIGNhbGVuZGFyIGFyaXRobWV0aWMgKHN0YXJ0T2ZXZWVrLCBzdGFydE9mTW9udGgsIC4uLikgYW5kXG4vLyBkYXRlQm91bmRTdHJpbmcoKSBsYW5kIG9uIHRoZSB6b25lJ3MgY2FsZW5kYXIgZGF5IHJhdGhlciB0aGFuIHRoZSBicm93c2VyJ3MuXG4vLyBBbiB1bmtub3duIHpvbmUgZmFsbHMgYmFjayB0byB0aGUgYnJvd3NlcidzIGNsb2NrLlxuZXhwb3J0IGZ1bmN0aW9uIGdldFpvbmVkTm93KHRpbWV6b25lOiBzdHJpbmcpOiBEYXRlIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHpvbmVkID0gdG9ab25lZFRpbWUobm93LCB0aW1lem9uZSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHpvbmVkLmdldFRpbWUoKSkgPyBub3cgOiB6b25lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vdztcbiAgfVxufVxuIl19
|