@hestia-earth/ui-components 0.27.13 → 0.27.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/files/files-error.model.mjs +7 -3
- package/esm2022/node/node-logs-models/node-logs-models.component.mjs +4 -3
- package/esm2022/node/node-logs-models/node-logs-models.model.mjs +4 -2
- package/fesm2022/hestia-earth-ui-components.mjs +12 -5
- package/fesm2022/hestia-earth-ui-components.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -259,8 +259,9 @@ export class NodeLogsModelsComponent {
|
|
|
259
259
|
minimum_should_match: 1
|
|
260
260
|
}
|
|
261
261
|
})
|
|
262
|
-
: of([])), map(terms =>
|
|
263
|
-
restrictTermTypeFromKey[this.nodeKey()].includes(term.termType))
|
|
262
|
+
: of([])), map(terms => this.nodeKey() in restrictTermTypeFromKey
|
|
263
|
+
? terms.filter(term => restrictTermTypeFromKey[this.nodeKey()].includes(term.termType))
|
|
264
|
+
: terms))
|
|
264
265
|
.subscribe(values => this.extraTermsByIds.set(values));
|
|
265
266
|
effect(() => {
|
|
266
267
|
of(this.isBlankNodes())
|
|
@@ -345,4 +346,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
|
|
|
345
346
|
IsObjectPipe
|
|
346
347
|
], template: "@if (showOutdatedLogs() || engineModelVersion() === currentModelVersion()) {\n <div class=\"is-px-3 is-pb-3\">\n @if (!isExternal && logsUrl()) {\n <div class=\"has-text-right is-mb-2\">\n <a class=\"is-size-7\" [href]=\"logsUrl()\" target=\"_blank\">\n <fa-icon [icon]=\"faExternalLinkAlt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n }\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n @if (enableFilterByTerm()) {\n <div class=\"field\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"term.set($event.item)\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"term.set('')\">\n <fa-icon [icon]=\"faTimes\"></fa-icon>\n </a>\n </div>\n </div>\n }\n </th>\n @if (isBlankNodes()) {\n <th>\n <span class=\"is-pr-1\">Units</span>\n <span>(per </span>\n <span>\n @switch (functionalUnit()) {\n @case (CycleFunctionalUnit['1 ha']) {\n hectare\n }\n @default {\n kg product\n }\n }\n </span>\n <span>)</span>\n </th>\n }\n <th>Original</th>\n <th>Recalculated</th>\n @if (isBlankNodes()) {\n <th>Difference</th>\n }\n @for (c of methodModelsCount() | times; track c; let i = $index) {\n <th>({{ i + 1 }})</th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon [icon]=\"faSpinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n }\n @if (!loading() && blankNodes().length === 0) {\n <tr>\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>{{ noDataMessage() || 'No data' }}</span>\n </td>\n </tr>\n }\n @for (blankNode of blankNodes(); track trackByBlankNode($index, blankNode)) {\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td\n class=\"width-auto has-border-right is-nowrap\"\n [attr.title]=\"$any(blankNode).term?.name || $any(blankNode).key\">\n @if (blankNode.canOpen) {\n <a class=\"is-inline-block is-align-top pr-2 open-node\" (click)=\"blankNode.isOpen = !blankNode.isOpen\">\n <fa-icon [icon]=\"faAngleDown\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon [icon]=\"faAngleRight\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n }\n @if ($any(blankNode).term) {\n <he-node-link class=\"is-inline-block is-pre-wrap\" [node]=\"$any(blankNode).term\">\n <span [innerHtml]=\"$any(blankNode).term.name | compound\"></span>\n </he-node-link>\n }\n @if ($any(blankNode).key) {\n @if (nodeKey() === 'completeness') {\n <a [href]=\"baseUrl + '/schema/Completeness#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n }\n } @else {\n <span>{{ $any(blankNode).key }}</span>\n }\n </td>\n @if (isBlankNodes()) {\n <td>\n <span class=\"is-nowrap\" [innerHtml]=\"$any(blankNode).term?.units | compound\"></span>\n </td>\n }\n <td>\n <ng-template #originalValueContent>\n <span>{{ $any(blankNode).originalValue | precision: 3 | default: '-' }}</span>\n </ng-template>\n\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model) {\n <div>\n {{ $any(blankNode).originalValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n }\n } @else {\n <span\n [class.trigger-popover]=\"!!$any(blankNode).original?.[0]?.methodModel\"\n [ngbPopover]=\"blankNodeOriginalValueDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n [disablePopover]=\"!$any(blankNode).original?.[0]?.methodModel\"\n [popoverContext]=\"{ blankNode }\">\n <span pointer>\n {{ $any(blankNode).originalValue | precision: 3 | default: '-' }}\n </span>\n </span>\n }\n </td>\n <td>\n @if (!blankNode.isOriginal || blankNode.isRecalculated) {\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model) {\n <div>\n {{ $any(blankNode).recalculatedValueByMethodId[model.methodId] | precision: 3 | default: '-' }}\n </div>\n }\n } @else {\n <span>{{ blankNode.recalculatedValue | precision: 3 | default: '-' }}</span>\n }\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"is-nowrap\">\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model) {\n <div>\n @if (\n $any(blankNode).originalValueByMethodId[model.methodId] !== null &&\n $any(blankNode).recalculatedValueByMethodId[model.methodId] !== null\n ) {\n <he-blank-node-value-delta\n [value]=\"$any(blankNode).recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"\n $any(blankNode).originalValueByMethodId[model.methodId]\n \"></he-blank-node-value-delta>\n } @else {\n -\n }\n </div>\n }\n } @else {\n @if ($any(blankNode).original.length && blankNode.isRecalculated) {\n <he-blank-node-value-delta\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"$any(blankNode).originalValue\"></he-blank-node-value-delta>\n } @else {\n -\n }\n }\n </td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\"></ng-container>\n </tr>\n @for (subValue of $any(blankNode).keys; track subValue) {\n <tr\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"$any(blankNode).subValues?.length\"\n [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n @if (blankNode.type) {\n <a\n class=\"is-inline-block is-pre-wrap\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n }\n @if (!blankNode.type) {\n <span class=\"is-inline-block is-align-top\">{{ subValue.key }}</span>\n }\n </td>\n @if (isBlankNodes()) {\n <td></td>\n }\n <td>\n @if (subValue.originalValue !== null) {\n <span>\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n } @else {\n -\n }\n </td>\n <td>\n @if (subValue.isRecalculated || subValue.key === 'impactAssessment') {\n <span>\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td>-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n }\n @for (subValue of $any(blankNode).subValues; track subValue) {\n <tr [class.is-hidden]=\"!blankNode.isOpen\" [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right\">\n <span class=\"is-inline-block is-align-top pl-3\">{{ subValue.key | keyToLabel }}</span>\n @if (subValue.id) {\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n @switch (subValue.key) {\n @case ('backgroundData') {\n <span class=\"is-inline-block\">{{ subValue.id | keyToLabel }}</span>\n }\n @default {\n <he-node-link\n class=\"is-block pl-4\"\n [node]=\"termById(subValue.id)\"\n [attr.title]=\"termById(subValue.id).name\">\n <span [innerHtml]=\"termById(subValue.id).name | compound\"></span>\n </he-node-link>\n }\n }\n }\n </td>\n @if (isBlankNodes()) {\n <td>\n @if (subValue.showUnits) {\n <span class=\"is-nowrap\" [innerHtml]=\"$any(blankNode).term?.units | compound\"></span>\n }\n </td>\n }\n <td>\n @if (subValue.originalValue !== null) {\n <span>\n {{ subValue.originalValue | precision: 3 | default: '-' }}\n </span>\n } @else {\n -\n }\n </td>\n <td>\n @if (subValue.isRecalculated) {\n <span>\n {{ subValue.recalculatedValue | precision: 3 | default: '-' }}\n </span>\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td>-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\"></ng-container>\n </tr>\n }\n }\n </tbody>\n </table>\n </he-data-table>\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\" (click)=\"showLegend = !showLegend\">\n <fa-icon [icon]=\"faAngleDown\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon [icon]=\"faAngleRight\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n @for (status of LogStatus | keys; track status) {\n @if (logIcon[status.value]) {\n <li class=\"has-text-{{ logColor[status.value] }}\">\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{ status.value }}</span>\n </li>\n }\n }\n </ul>\n </div>\n @if (filteredType()) {\n <div class=\"column has-text-right\">\n <label class=\"is-inline-block checkbox\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [ngModel]=\"onlyRequired\"\n (change)=\"onlyRequired.set($event.target.checked)\"\n [disabled]=\"!!term()\" />\n <span class=\"ml-2\">\n Show only {{ filteredType() | pluralize }} included in the default HESTIA system boundary\n </span>\n </label>\n </div>\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"is-3 has-text-centered\">\n <p class=\"is-mb-2\">\n <fa-icon class=\"is-pr-2\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>These logs might be incorrect as the calculations are outdated.</span>\n </p>\n <p class=\"is-underlined is-size-7\"><a (click)=\"showOutdatedLogs.set(true)\">View logs anyway.</a></p>\n </div>\n}\n\n<ng-template #blankNodeOriginalValueDetails let-blankNode=\"blankNode\">\n <span class=\"is-pr-1\">The original value was reported using:</span>\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-dark\"\n [node]=\"$any(blankNode).original[0].methodModel\"\n [showExternalLink]=\"true\">\n <span>{{ $any(blankNode).original[0].methodModel.name }}</span>\n </he-node-link>\n</ng-template>\n\n<ng-template #blankNodeModels let-data=\"data\">\n <ng-template #notInSystemBoundary>\n <td [attr.colspan]=\"methodModelsCount()\">\n <span>Not in HESTIA system boundary</span>\n </td>\n </ng-template>\n\n @if (isSystemBoundary(data)) {\n @for (c of methodModelsCount() | times; track c; let i = $index) {\n <td class=\"blank-node-index-{{ i }}\">\n @if (getModelsAt(data, i); as models) {\n @if ($any(models) | isArray) {\n <div>\n @for (model of $any(models); track model) {\n <p>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\"></ng-container>\n </p>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\"></ng-container>\n }\n } @else {\n -\n }\n </td>\n }\n } @else {\n -\n }\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <span\n class=\"is-nowrap\"\n [class.trigger-popover]=\"model.showLogs\"\n [ngbPopover]=\"logDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"is-capitalized\">{{ methodName(model) }}</span>\n @if (model.logs?.methodTier || model.model?.methodTier) {\n <span class=\"pl-1\">[{{ model.logs?.methodTier || model.model?.methodTier }}]</span>\n }\n\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }} trigger-popover\"\n [ngbPopover]=\"logStatusDetails\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <fa-icon [icon]=\"logIcon[model.status]\"></fa-icon>\n </span>\n\n @if (model.model) {\n <span class=\"pl-1\">\n (\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\"></ng-container>\n )\n </span>\n }\n </span>\n</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <div class=\"table-container\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n @if (logs?.requirements) {\n @for (key of requirementKeys(logs.requirements); track key) {\n <ng-container *ngTemplateOutlet=\"logLine; context: { key, value: logs.requirements[key] }\"></ng-container>\n }\n }\n\n @if (logs?.logs) {\n @for (key of logs.logs | keys; track key) {\n <ng-container *ngTemplateOutlet=\"logLine; context: key\"></ng-container>\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (logs?.missingLookups?.length) {\n <div class=\"it-mt-2\">\n <p>Data missing (might be optional):</p>\n <div class=\"table-container data-table-container\">\n <table class=\"table is-dark is-fullwidth is-striped\">\n <thead>\n <tr>\n <th class=\"has-text-white\">\n <span>Filename</span>\n </th>\n <th class=\"has-text-white\">\n <span>Column Title</span>\n </th>\n <th class=\"has-text-white\">\n <span>Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-text-white\">\n @for (data of logs.missingLookups; track data) {\n <tr>\n <td>{{ data.filename }}</td>\n <td>{{ data.column }}</td>\n <td>{{ data.termId }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #logLineValue let-key=\"key\" let-value=\"value\">\n @if (requirementLinkedNode(key, value); as linkedNode) {\n <he-node-link\n class=\"is-inline-block is-align-middle\"\n linkClass=\"is-dark\"\n [node]=\"linkedNode\"\n [showExternalLink]=\"true\"></he-node-link>\n } @else {\n <span class=\"is-inline-block is-align-middle\">{{ value }}</span>\n }\n</ng-template>\n\n<ng-template #logLine let-key=\"key\" let-value=\"value\">\n <tr>\n <td class=\"has-border-right copy-log\">\n <span class=\"is-inline-block is-align-middle\">\n @if (parseLogCompleteness(key); as completeness) {\n <span>Data completeness for</span>\n <code class=\"is-mx-1\">{{ completeness.key }}</code>\n <span>must be</span>\n <code class=\"is-mx-1\">{{ completeness.value }}</code>\n } @else {\n @switch (key) {\n @default {\n {{ key | keyToLabel }}\n }\n @case ('property_id') {\n Property Term @id\n }\n @case ('product_id') {\n Product Term @id\n }\n @case ('crop_product_id') {\n Crop Product Term @id\n }\n @case ('input_id') {\n Input Term @id\n }\n @case ('node_type_allowed') {\n <span>Is the current</span>\n <code class=\"is-mx-1\">Node</code>\n <span>allowed to run this model</span>\n }\n @case ('siteType_allowed') {\n <span>Is the current</span>\n <code class=\"is-mx-1\">siteType</code>\n <span>allowed to run this model</span>\n }\n @case ('product_id_allowed') {\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n }\n @case ('product_termType_allowed') {\n <span>Are any of the Product</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n @case ('input_id_allowed') {\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n }\n @case ('input_termType_allowed') {\n <span>Are any of the Input</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n <!-- Deprecated -->\n @case ('primary_product_id_allowed') {\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">@id</code>\n <span>allowed to run this model</span>\n }\n @case ('primary_product_termType_allowed') {\n <span>Is the current primary product</span>\n <code class=\"is-mx-1\">termType</code>\n <span>allowed to run this model</span>\n }\n @case ('geospatial_data') {\n Has geospatial data necessary to run this model\n }\n @case ('contains_geospatial_data') {\n Has geospatial data necessary to run this model\n }\n @case ('current_size') {\n Current polygon area\n }\n @case ('max_area_size') {\n Maximum polygon area to run this model\n }\n @case ('below_max_area_size') {\n Polygon below the maximum area\n }\n @case ('region_factor') {\n Factor from region lookup\n }\n @case ('has_pesticides_inputs') {\n <span>Cycle contains</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs</span>\n }\n @case ('all_pesticideAI_have_lookup_value') {\n <span>All</span>\n <code class=\"is-mx-1\">pesticideAI</code>\n <span>Inputs have a lookup value</span>\n }\n @case ('has_crop_residue_burnt') {\n <code class=\"is-mr-1\">aboveGroundCropResidueBurnt</code>\n <span>is present as Product</span>\n }\n @case ('liquid_slurry_sludge_P') {\n Liquid, Slurry, and Sludge P\n }\n @case ('no_cycle_inputs_feed') {\n <span>\n Cycle has\n <b>no</b>\n Input with\n </span>\n <code>isAnimalFeed=true</code>\n }\n @case ('has_cycle_inputs_feed') {\n <span>\n Cycle has\n <b>some</b>\n Input with\n </span>\n <code>isAnimalFeed=true</code>\n }\n }\n }\n </span>\n <he-clipboard\n class=\"is-inline-block is-align-middle\"\n clipboardClass=\"is-size-7 is-p-1\"\n [icon]=\"farClone\"\n [value]=\"key\"\n [hideText]=\"true\"></he-clipboard>\n </td>\n <td>\n @if (logValueArray(value); as valueArray) {\n <div>\n <table class=\"table is-dark is-bordered is-striped\">\n @if (valueArray[0] | isObject) {\n <thead>\n <tr>\n @for (v of valueArray[0] | keys; track v) {\n <th class=\"has-text-white\">{{ v.key }}</th>\n }\n </tr>\n </thead>\n }\n <tbody>\n @for (v of valueArray; track v) {\n <tr>\n @if (v | isObject) {\n @for (vv of v | keys; track vv) {\n <td>{{ vv.value }}</td>\n }\n } @else {\n <td>{{ v }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"logLineValue; context: { key, value }\"></ng-container>\n }\n </td>\n </tr>\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ model.status }}</span>\n </div>\n\n @if (model.status === LogStatus.notRequired && model.logs?.is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (model.logs.logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (model.logs.logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (model.logs.logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (model.logs.logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (model.logs.logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n }\n\n @if (model.logs && model.status !== LogStatus.notRequired && model.status !== LogStatus.skipHierarchy) {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (model.logs?.shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!model.logs.runRequired) {\n @if (model.logs.logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (model.config) {\n <p class=\"is-run-strategy-{{ model.config.runStrategy }}\">\n @switch (model.config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (model.config.runArgs?.runNonMeasured && hasMethodTier(data.original, EmissionMethodTier.measured)) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ model.config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (model.logs.logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data.type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data.termId }}</code>\n is already present or already added by another model.\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (model.logs?.shouldRun) {\n <p>All the requirements were met to run the model.</p>\n }\n @if (!model.logs?.shouldRun) {\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on the model name on the left to view the debugging logs.</p>\n }\n @if (model.logs?.logs?.error) {\n <p>The model failed to run for the following reason:</p>\n <p>\n <code>{{ model.logs.logs.error }}</code>\n </p>\n }\n </li>\n }\n @if (model.logs?.replaceLowerTier !== undefined) {\n <li>\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n @if (!model.logs.replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">lower than</span>\n }\n @if (model.logs.replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">higher than or equal to</span>\n }\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n }\n @if (model.logs.replaceLowerTier) {\n <li class=\"is-merge-replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{ model.config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n @if (model.config?.mergeArgs) {\n @if (!model.logs.replaceThreshold) {\n <span class=\"is-underlined\">less than</span>\n }\n @if (model.logs.replaceThreshold) {\n <span class=\"is-underlined\">more than or equal to</span>\n }\n <b class=\"is-pl-1\">{{ model.config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n }\n @if (!model.config?.mergeArgs) {\n @if (!model.logs.replaceThreshold) {\n <span class=\"is-underlined\">not sufficiently</span>\n }\n @if (model.logs.replaceThreshold) {\n <span class=\"is-underlined\">sufficiently</span>\n }\n }\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{ model.config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}.</b>\n </li>\n }\n </ul>\n }\n</ng-template>\n\n<ng-template #docsLink let-model>\n <a [href]=\"model.apiDocsPath || model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <fa-icon class=\"ml-1\" [icon]=\"faExternalLinkAlt\" size=\"sm\"></fa-icon>\n </a>\n</ng-template>\n", styles: [":host{display:block}::ng-deep .table{background-color:transparent}::ng-deep .table td he-node-link{width:190px}@media screen and (max-width: 767px){::ng-deep .table td he-node-link{width:150px}}::ng-deep .table td .open-node+he-node-link{width:170px}@media screen and (max-width: 767px){::ng-deep .table td .open-node+he-node-link{width:130px}}::ng-deep .table td.has-border-right{box-shadow:1px 0 #6c8093}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#6c809333;height:100%;width:1px;top:0;left:12px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}::ng-deep .copy-log he-clipboard{visibility:hidden}::ng-deep .copy-log:hover he-clipboard{visibility:visible}\n"] }]
|
|
347
348
|
}], ctorParameters: () => [] });
|
|
348
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBYyxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixrQkFBa0IsRUFJbEIsUUFBUSxFQUNSLFlBQVksRUFFWixvQkFBb0IsRUFDcEIsNEJBQTRCLEVBQzVCLGlCQUFpQixFQUNqQix1QkFBdUIsRUFFdkIsbUJBQW1CLEVBQ3BCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFD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QUMsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVTLFFBQVEsQ0FBQyxFQUFVO1FBQzNCLE9BQU8sQ0FDTCxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDckI7Z0JBQ0MsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUN0QixLQUFLLEVBQUUsRUFBRTtnQkFDVCxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQ2xCLENBQUM7SUFDSixDQUFDOzhHQWhUVSx1QkFBdUI7a0dBQXZCLHVCQUF1QiwrekNDclJwQywwcCtCQTZ5QkEscTdCRDVpQkksZUFBZSxrUEFDZixrQkFBa0Isc0dBQ2xCLFdBQVcsZ3lCQUNYLFlBQVksc1VBQ1osaUJBQWlCLDRHQUNqQiw0QkFBNEIseUhBQzVCLGdCQUFnQixvSkFDaEIsVUFBVSwyVUFDVixrQkFBa0IsMklBQ2xCLFlBQVksNENBQ1osV0FBVywyQ0FDWCxRQUFRLHdDQUNSLGFBQWEsNkNBQ2IsY0FBYyw4Q0FDZCxhQUFhLDZDQUNiLFNBQVMseUNBQ1QsV0FBVywyQ0FDWCxZQUFZOzsyRkFHSCx1QkFBdUI7a0JBM0JuQyxTQUFTOytCQUNFLHFCQUFxQixtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsNEJBQTRCO3dCQUM1QixnQkFBZ0I7d0JBQ2hCLFVBQVU7d0JBQ1Ysa0JBQWtCO3dCQUNsQixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsUUFBUTt3QkFDUixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixTQUFTO3dCQUNULFdBQVc7d0JBQ1gsWUFBWTtxQkFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFNpZ25hbCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRvU2lnbmFsLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBmb3JrSm9pbiwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0LCBmaWx0ZXIsIHJlZHVjZSwgdG9BcnJheSwgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWVyZ2VNYXAsIHRhcCwgbWVyZ2VBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBCbGFua05vZGVzS2V5LFxuICBDeWNsZUZ1bmN0aW9uYWxVbml0LFxuICBFbWlzc2lvbk1ldGhvZFRpZXIsXG4gIElDeWNsZUpTT05MRCxcbiAgSVRlcm1KU09OTEQsXG4gIEpTT05MRCxcbiAgTm9kZVR5cGUsXG4gIFRlcm1UZXJtVHlwZSxcbiAgYmxhbmtOb2Rlc0tleSxcbiAgZW1pc3Npb25UZXJtVGVybVR5cGUsXG4gIGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUsXG4gIGlucHV0VGVybVRlcm1UeXBlLFxuICBtZWFzdXJlbWVudFRlcm1UZXJtVHlwZSxcbiAgbm9uQmxhbmtOb2Rlc0tleSxcbiAgcHJvZHVjdFRlcm1UZXJtVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwga2V5VG9MYWJlbCwgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBsb2FkUmVzb3VyY2VLZXkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2dsb3NzYXJ5JztcbmltcG9ydCB7IERhdGFTdGF0ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvYXBpJztcbmltcG9ydCB7IE5nYlR5cGVhaGVhZCwgTmdiUG9wb3ZlciB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHtcbiAgSWNvbkRlZmluaXRpb24sXG4gIGZhQW5nbGVEb3duLFxuICBmYUFuZ2xlUmlnaHQsXG4gIGZhQ2hlY2ssXG4gIGZhQ2lyY2xlLFxuICBmYURvdENpcmNsZSxcbiAgZmFFeGNsYW1hdGlvblRyaWFuZ2xlLFxuICBmYUV4dGVybmFsTGlua0FsdCxcbiAgZmFTcGlubmVyLFxuICBmYVRpbWVzXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBmYUNsb25lIGFzIGZhckNsb25lLCBmYUNpcmNsZSBhcyBmYXJDaXJjbGUgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1yZWd1bGFyLXN2Zy1pY29ucyc7XG5cbmltcG9ydCB7IGJhc2VVcmwsIGlzRXh0ZXJuYWwsIHR5cGVhaGVhZEZvY3VzIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7XG4gIGJsYW5rTm9kZXNUeXBlVmFsdWUsXG4gIG5vbkJsYW5rTm9kZXNUeXBlVmFsdWUsXG4gIElCbGFua05vZGVMb2dTdWJWYWx1ZSxcbiAgSUJsYW5rTm9kZUxvZyxcbiAgTG9nU3RhdHVzLFxuICBJQ29uZmlnTW9kZWwsXG4gIGdyb3VwTG9nc0J5TW9kZWwsXG4gIGdyb3VwTG9nc0J5VGVybSxcbiAgbW9kZWxDb3VudCxcbiAgY29tcHV0ZVRlcm1zLFxuICBsb2dWYWx1ZUFycmF5LFxuICBJTm9kZVRlcm1Mb2dzLFxuICBJTm9kZUxvZ3MsXG4gIGdyb3VwZExvZ3NCeUtleSxcbiAgSU5vbkJsYW5rTm9kZUxvZyxcbiAgSUxvZyxcbiAgY29tcHV0ZUtleXNcbn0gZnJvbSAnLi9ub2RlLWxvZ3MtbW9kZWxzLm1vZGVsJztcbmltcG9ydCB7IElKU09OTm9kZSwgSGVOb2RlU2VydmljZSB9IGZyb20gJy4uL25vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBub2RlVmVyc2lvbiB9IGZyb20gJy4uL25vZGUtbW9kZWwtdmVyc2lvbic7XG5pbXBvcnQgeyBIZUVuZ2luZVNlcnZpY2UsIElNb2RlbCwgSU9yY2hlc3RyYXRvckNvbmZpZywgZmluZE9yY2hlc3RyYXRvck1vZGVsIH0gZnJvbSAnLi4vLi4vZW5naW5lL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IG1hdGNoRXhhY3RRdWVyeSwgbWF0Y2hJZCwgbWF0Y2hUZXJtVHlwZSwgbWF0Y2hUeXBlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5tb2RlbCc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGVybVR5cGVMYWJlbCB9IGZyb20gJy4uLy4uL3Rlcm1zL3Rlcm1zLm1vZGVsJztcbmltcG9ydCB7IElzT2JqZWN0UGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9pcy1vYmplY3QucGlwZSc7XG5pbXBvcnQgeyBJc0FycmF5UGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9pcy1hcnJheS5waXBlJztcbmltcG9ydCB7IFRpbWVzUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi90aW1lcy5waXBlJztcbmltcG9ydCB7IFByZWNpc2lvblBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vcHJlY2lzaW9uLnBpcGUnO1xuaW1wb3J0IHsgS2V5VG9MYWJlbFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24va2V5LXRvLWxhYmVsLnBpcGUnO1xuaW1wb3J0IHsgUGx1cmFsaXplUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9wbHVyYWxpemUucGlwZSc7XG5pbXBvcnQgeyBLZXlzUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9rZXlzLnBpcGUnO1xuaW1wb3J0IHsgRGVmYXVsdFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vZGVmYXVsdC5waXBlJztcbmltcG9ydCB7IENvbXBvdW5kUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb3VuZC5waXBlJztcbmltcG9ydCB7IENsaXBib2FyZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9jbGlwYm9hcmQvY2xpcGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCbGFua05vZGVWYWx1ZURlbHRhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2JsYW5rLW5vZGUtdmFsdWUtZGVsdGEvYmxhbmstbm9kZS12YWx1ZS1kZWx0YS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxpbmtDb21wb25lbnQgfSBmcm9tICcuLi9ub2RlLWxpbmsvbm9kZS1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAgfSBmcm9tICcuLi8uLi9jb21tb24vcnhqcy11dGlscyc7XG5cbmludGVyZmFjZSBJVGVybXNCeUlkTWFwcGluZyB7XG4gIFtpZDogc3RyaW5nXTogSVRlcm1KU09OTEQ7XG59XG5cbmNvbnN0IG5vZGVUeXBlID0gKG5vZGU/OiBJSlNPTk5vZGUpID0+IG5vZGU/LlsnQHR5cGUnXSB8fCBub2RlPy50eXBlO1xuY29uc3Qgbm9kZUlkID0gKG5vZGU/OiBJSlNPTk5vZGUpID0+IG5vZGU/LlsnQGlkJ10gfHwgbm9kZT8uaWQ7XG5jb25zdCBub2RlVHlwZXNMb3dlckNhc2UgPSBPYmplY3QudmFsdWVzKE5vZGVUeXBlKS5tYXAodiA9PiB2LnRvTG93ZXJDYXNlKCkpO1xuXG5jb25zdCBsb2dJY29uOiB7XG4gIFtzdGF0dXMgaW4gTG9nU3RhdHVzXT86IEljb25EZWZpbml0aW9uO1xufSA9IHtcbiAgW0xvZ1N0YXR1cy5zdWNjZXNzXTogZmFDaGVjayxcbiAgW0xvZ1N0YXR1cy5lcnJvcl06IGZhVGltZXMsXG4gIFtMb2dTdGF0dXMuc2tpcEhpZXJhcmNoeV06IGZhckNpcmNsZSxcbiAgW0xvZ1N0YXR1cy5kYXRhUHJvdmlkZWRdOiBmYUNpcmNsZSxcbiAgW0xvZ1N0YXR1cy5ub3RSZXF1aXJlZF06IGZhRG90Q2lyY2xlXG59O1xuXG5jb25zdCBsb2dDb2xvcjoge1xuICBbc3RhdHVzIGluIExvZ1N0YXR1c10/OiBzdHJpbmc7XG59ID0ge1xuICBbTG9nU3RhdHVzLnN1Y2Nlc3NdOiAnc3VjY2VzcycsXG4gIFtMb2dTdGF0dXMuZXJyb3JdOiAnZGFuZ2VyJyxcbiAgW0xvZ1N0YXR1cy5za2lwSGllcmFyY2h5XTogJ2RhcmsnLFxuICBbTG9nU3RhdHVzLmRhdGFQcm92aWRlZF06ICdkYXJrJyxcbiAgW0xvZ1N0YXR1cy5ub3RSZXF1aXJlZF06ICdncmV5J1xufTtcblxuY29uc3Qgc2hvdWxkU2hvd0JsYW5rTm9kZSA9IChibGFua05vZGVMb2c6IElCbGFua05vZGVMb2cpID0+XG4gIFtcbiAgICBibGFua05vZGVMb2c/LmNvbmZpZ01vZGVscz8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8ua2V5cz8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8uc3ViVmFsdWVzPy5sZW5ndGgsXG4gICAgYmxhbmtOb2RlTG9nPy5vcmlnaW5hbD8ubGVuZ3RoLFxuICAgIGJsYW5rTm9kZUxvZz8ucmVjYWxjdWxhdGVkPy5sZW5ndGhcbiAgXS5zb21lKEJvb2xlYW4pO1xuXG5jb25zdCBtZXRob2RJZExhYmVsID0gKG1ldGhvZElkOiBzdHJpbmcsIF9tb2RlbD86IElNb2RlbCkgPT5cbiAgKG1ldGhvZElkXG4gICAgPyB7XG4gICAgICAgICdjeWNsZS90cmFuc2Zvcm1hdGlvbic6ICdEYXRhIEZyb20gVHJhbnNmb3JtYXRpb24nLFxuICAgICAgICBpbXBhY3RfYXNzZXNzbWVudDogJ0RhdGEgRnJvbSBDeWNsZSdcbiAgICAgIH1bbWV0aG9kSWRdXG4gICAgOiAnJykgfHwgKG1ldGhvZElkLmluY2x1ZGVzKCcvJykgPyBtZXRob2RJZC5zcGxpdCgnLycpWzBdIDoga2V5VG9MYWJlbChtZXRob2RJZCkpO1xuXG5jb25zdCBnZXRNb2RlbHNBdCA9IChsb2c6IElCbGFua05vZGVMb2dTdWJWYWx1ZSB8IElCbGFua05vZGVMb2csIGluZGV4OiBudW1iZXIpID0+XG4gICgnbW9kZWxzSW5TdWJWYWx1ZXMnIGluIGxvZyA/ICFsb2cubW9kZWxzSW5TdWJWYWx1ZXMgfHwgIWxvZy5pc09wZW4gOiB0cnVlKSAmJiBsb2cuY29uZmlnTW9kZWxzW2luZGV4XTtcblxuY29uc3QgcmVxdWlyZW1lbnRLZXlzID0gKHJlcXVpcmVtZW50czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT5cbiAgT2JqZWN0LmtleXMocmVxdWlyZW1lbnRzKS5maWx0ZXIoayA9PiAhbm9kZVR5cGVzTG93ZXJDYXNlLmluY2x1ZGVzKGspICYmICFbJ21vZGVsX2tleSddLmluY2x1ZGVzKGspKTtcblxuY29uc3QgcmVxdWlyZW1lbnRDb2xvciA9ICh2YWx1ZTogYW55KSA9PiAoIXZhbHVlIHx8IFsnTm9uZScsICdGYWxzZScsICcwJywgJzAuMCddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYW5nZXInIDogJ3doaXRlJyk7XG5cbmNvbnN0IHJlcXVpcmVtZW50TGlua2VkTm9kZUJ5S2V5OiB7XG4gIFtrZXk6IHN0cmluZ106ICh2YWx1ZTogc3RyaW5nKSA9PiBQYXJ0aWFsPEpTT05MRDxOb2RlVHlwZT4+O1xufSA9IHtcbiAgcmVsYXRlZF9jeWNsZXM6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuQ3ljbGUsICdAaWQnOiB2IH0pLFxuICBjeWNsZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSwgJ0BpZCc6IHYgfSksXG4gIGltcGFjdF9hc3Nlc3NtZW50X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkltcGFjdEFzc2Vzc21lbnQsICdAaWQnOiB2IH0pLFxuICBzaXRlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlNpdGUsICdAaWQnOiB2IH0pLFxuICBzb3VyY2VfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuU291cmNlLCAnQGlkJzogdiB9KSxcbiAgcHJvcGVydHlfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSksXG4gIGlucHV0X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBwcm9kdWN0X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBwcmFjdGljZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogdiB9KSxcbiAgY3JvcF9wcm9kdWN0X2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pXG59O1xuXG5jb25zdCByZXF1aXJlbWVudExpbmtlZE5vZGUgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+XG4gIGtleSBpbiByZXF1aXJlbWVudExpbmtlZE5vZGVCeUtleSAmJiAhWydOb25lJywgJycsIG51bGxdLmluY2x1ZGVzKHZhbHVlKVxuICAgID8gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUubWFwKHYgPT4gcmVxdWlyZW1lbnRMaW5rZWROb2RlKGtleSwgdikpXG4gICAgICA6IHJlcXVpcmVtZW50TGlua2VkTm9kZUJ5S2V5W2tleV0odmFsdWUpXG4gICAgOiBudWxsO1xuXG5jb25zdCBpc1N5c3RlbUJvdW5kYXJ5ID1cbiAgKHRlcm1JZD86IHN0cmluZykgPT5cbiAgKHsgaXNSZWNhbGN1bGF0ZWQsIGlzUmVxdWlyZWQgfTogUGljazxJTG9nIHwgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlLCAnaXNSZWNhbGN1bGF0ZWQnIHwgJ2lzUmVxdWlyZWQnPikgPT4ge1xuICAgIC8vIG9ubHkgZXhpc3RzIGZvciBzb21lIHRlcm1zXG4gICAgY29uc3QgaW5TeXN0ZW1Cb3VuZGFyeSA9IGxvYWRSZXNvdXJjZUtleSgnaW5IZXN0aWFEZWZhdWx0U3lzdGVtQm91bmRhcnkuanNvbicsIHRlcm1JZCk7XG4gICAgcmV0dXJuICFpblN5c3RlbUJvdW5kYXJ5ID8gW2lzUmVjYWxjdWxhdGVkLCBpc1JlcXVpcmVkXS5zb21lKEJvb2xlYW4pIDogYCR7aW5TeXN0ZW1Cb3VuZGFyeX1gID09PSAndHJ1ZSc7XG4gIH07XG5cbmNvbnN0IGlzR2VuZXJpY1Rlcm0gPSAodGVybUlkOiBzdHJpbmcpID0+IFt0ZXJtSWQuc3RhcnRzV2l0aCgnZXhjcmV0YScpXS5ldmVyeShCb29sZWFuKTtcblxuY29uc3QgZXh0cmFUZXJtSWRzRnJvbUNvbmZpZyA9IChjb25maWc6IElPcmNoZXN0cmF0b3JDb25maWcsIGtleTogYmxhbmtOb2Rlc0tleSwgbG9nczogSU5vZGVMb2dzIHwgSU5vZGVUZXJtTG9ncykgPT5cbiAgdW5pcXVlKFtcbiAgICAuLi4oY29uZmlnPy5tb2RlbHMgfHwgW10pXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmlsdGVyKG0gPT4gbS5rZXkgPT09IGtleSlcbiAgICAgIC5tYXAobSA9PiBtLnZhbHVlKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZpbHRlcih2ID0+ICFpc0dlbmVyaWNUZXJtKHYpKSxcbiAgICAvLyBtYXRjaCBsb2dzIHdpdGggYSBjb25maWd1cmF0aW9uXG4gICAgLi4uT2JqZWN0LmVudHJpZXMobG9ncyB8fCB7fSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbX2lkLCB2YWx1ZV0pID0+XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5zb21lKChbbW9kZWwsIHZdOiBbbW9kZWw6IHN0cmluZywgdmFsdWU6IGFueV0pID0+XG4gICAgICAgICAgICBmaW5kT3JjaGVzdHJhdG9yTW9kZWwoY29uZmlnLCB7IGtleSwgbW9kZWwsIHZhbHVlOiB2Lm1vZGVsX2tleSB9KVxuICAgICAgICAgIClcbiAgICAgIClcbiAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpXG4gIF0pO1xuXG4vKipcbiAqIEV4dGVuZCB0ZXJtcyBieSBmaW5kaW5nIGFsbCB0ZXJtcyBpbiB0aG9zZSBgdGVybVR5cGVgLlxuICovXG5jb25zdCBtYXRjaFRlcm1UeXBlRnJvbUtleToge1xuICBba2V5IGluIEJsYW5rTm9kZXNLZXldPzogVGVybVRlcm1UeXBlW107XG59ID0ge1xuICAvLyBDeWNsZVxuICBbQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNdOiBlbWlzc2lvblRlcm1UZXJtVHlwZS50ZXJtLFxuICAvLyBTaXRlXG4gIFtCbGFua05vZGVzS2V5Lm1lYXN1cmVtZW50c106IG1lYXN1cmVtZW50VGVybVRlcm1UeXBlLnRlcm0sXG4gIC8vIEltcGFjdEFzc2Vzc21lbnRcbiAgLy8gZGlzYWJsZWQgYXMgaXQgd2lsbCBzaG93IHRlcm1zIGluIGJvdGggYGVtaXNzaW9uc2AgYW5kIGByZXNvdXJjZVVzZWAgY2F0ZWdvcmllcywgc2VlIGlzc3VlICMyNzNcbiAgLy8gZW1pc3Npb25zUmVzb3VyY2VVc2U6IGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUuZW1pc3Npb25zUmVzb3VyY2VVc2UudGVybSxcbiAgW0JsYW5rTm9kZXNLZXkuaW1wYWN0c106IGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUuaW1wYWN0cy50ZXJtLFxuICBbQmxhbmtOb2Rlc0tleS5lbmRwb2ludHNdOiBpbXBhY3RBc3Nlc3NtZW50VGVybVRlcm1UeXBlLmVuZHBvaW50cy50ZXJtXG59O1xuXG4vKipcbiAqIFJlc3RyaWN0IHRlcm1zIGZvdW5kIGluIHRoZSBsb2dzIGJ5IHRoZXNlIGB0ZXJtVHlwZWAuXG4gKi9cbmNvbnN0IHJlc3RyaWN0VGVybVR5cGVGcm9tS2V5OiB7XG4gIFtrZXkgaW4gQmxhbmtOb2Rlc0tleV0/OiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmlucHV0c106IGlucHV0VGVybVRlcm1UeXBlLnRlcm0sXG4gIFtCbGFua05vZGVzS2V5LnByb2R1Y3RzXTogcHJvZHVjdFRlcm1UZXJtVHlwZS50ZXJtLFxuICAuLi5tYXRjaFRlcm1UeXBlRnJvbUtleVxufTtcblxuY29uc3QgZmlsdGVyQmxhbmtOb2RlID0gKFxuICB7IHRlcm06IHsgbmFtZSwgJ0BpZCc6IGlkIH0sIHN1YlZhbHVlcywgLi4ubG9nIH06IElCbGFua05vZGVMb2csXG4gIHNlbGVjdGVkVGVybT86IHN0cmluZyxcbiAgZmlsdGVyVGVybVR5cGVzPzogVGVybVRlcm1UeXBlW10sXG4gIG9ubHlSZXF1aXJlZD86IGJvb2xlYW5cbikgPT5cbiAgc2VsZWN0ZWRUZXJtXG4gICAgPyBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VsZWN0ZWRUZXJtLnRvTG93ZXJDYXNlKCkpXG4gICAgOiAhZmlsdGVyVGVybVR5cGVzPy5sZW5ndGggfHwgIW9ubHlSZXF1aXJlZCB8fCBpc1N5c3RlbUJvdW5kYXJ5KGlkKShsb2cpIHx8IHN1YlZhbHVlcy5zb21lKGlzU3lzdGVtQm91bmRhcnkoaWQpKTtcblxuY29uc3QgdGVybVNlYXJjaCA9ICh0ZXJtID0gJycpID0+IHRlcm0ucmVwbGFjZSgvWyxcXHNdL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG5jb25zdCBsaXN0VGVybUlkID0gKHRlcm1zOiBJVGVybUpTT05MRFtdKSA9PlxuICB0ZXJtc1xuICAgIC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxuICAgIC5zb3J0KClcbiAgICAuam9pbignLCcpO1xuXG5jb25zdCBjb21wbGV0ZW5lc3NDb21wbGV0ZVN1ZmZpeCA9ICdfY29tcGxldGUnO1xuY29uc3QgY29tcGxldGVuZXNzSW5jb21wbGV0ZVN1ZmZpeCA9ICdfaW5jb21wbGV0ZSc7XG5jb25zdCBwYXJzZUxvZ0NvbXBsZXRlbmVzcyA9IChrZXk6IHN0cmluZykgPT5cbiAgW1xuICAgIGtleS5zdGFydHNXaXRoKCd0ZXJtX3R5cGVfJyksXG4gICAga2V5LmVuZHNXaXRoKGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4KSB8fCBrZXkuZW5kc1dpdGgoY29tcGxldGVuZXNzSW5jb21wbGV0ZVN1ZmZpeClcbiAgXS5ldmVyeShCb29sZWFuKVxuICAgID8ge1xuICAgICAgICBrZXk6IGtleVxuICAgICAgICAgIC5yZXBsYWNlKCd0ZXJtX3R5cGVfJywgJycpXG4gICAgICAgICAgLnJlcGxhY2UoY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlKGNvbXBsZXRlbmVzc0luY29tcGxldGVTdWZmaXgsICcnKSxcbiAgICAgICAgdmFsdWU6IGtleS5lbmRzV2l0aChjb21wbGV0ZW5lc3NDb21wbGV0ZVN1ZmZpeClcbiAgICAgIH1cbiAgICA6IG51bGw7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLW5vZGUtbG9ncy1tb2RlbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGYUljb25Db21wb25lbnQsXG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5nYlR5cGVhaGVhZCxcbiAgICBOb2RlTGlua0NvbXBvbmVudCxcbiAgICBCbGFua05vZGVWYWx1ZURlbHRhQ29tcG9uZW50LFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdiUG9wb3ZlcixcbiAgICBDbGlwYm9hcmRDb21wb25lbnQsXG4gICAgQ29tcG91bmRQaXBlLFxuICAgIERlZmF1bHRQaXBlLFxuICAgIEtleXNQaXBlLFxuICAgIFBsdXJhbGl6ZVBpcGUsXG4gICAgS2V5VG9MYWJlbFBpcGUsXG4gICAgUHJlY2lzaW9uUGlwZSxcbiAgICBUaW1lc1BpcGUsXG4gICAgSXNBcnJheVBpcGUsXG4gICAgSXNPYmplY3RQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQge1xuICBwcml2YXRlIG5vZGVTZXJ2aWNlID0gaW5qZWN0KEhlTm9kZVNlcnZpY2UpO1xuICBwcml2YXRlIHNlYXJjaFNlcnZpY2UgPSBpbmplY3QoSGVTZWFyY2hTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlbmdpbmVTZXJ2aWNlID0gaW5qZWN0KEhlRW5naW5lU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRXh0ZXJuYWxMaW5rQWx0ID0gZmFFeHRlcm5hbExpbmtBbHQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYUV4Y2xhbWF0aW9uVHJpYW5nbGUgPSBmYUV4Y2xhbWF0aW9uVHJpYW5nbGU7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYVRpbWVzID0gZmFUaW1lcztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhQW5nbGVEb3duID0gZmFBbmdsZURvd247XG4gIHByb3RlY3RlZCByZWFkb25seSBmYUFuZ2xlUmlnaHQgPSBmYUFuZ2xlUmlnaHQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYVNwaW5uZXIgPSBmYVNwaW5uZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYXJDbG9uZSA9IGZhckNsb25lO1xuXG4gIHByb3RlY3RlZCBub2RlID0gaW5wdXQucmVxdWlyZWQ8SUpTT05Ob2RlPigpO1xuICBwcml2YXRlIG5vZGUkID0gdG9PYnNlcnZhYmxlKHRoaXMubm9kZSk7XG4gIHByaXZhdGUgZGF0YSQgPSB0aGlzLm5vZGUkLnBpcGUoXG4gICAgZmlsdGVyKG5vZGUgPT4gIWlzVW5kZWZpbmVkKG5vZGUpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAoKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nLnNldCh0cnVlKSksXG4gICAgbWVyZ2VNYXAobm9kZSA9PlxuICAgICAgZm9ya0pvaW4oe1xuICAgICAgICBsb2dzOiB0aGlzLm5vZGVTZXJ2aWNlLmdldExvZyh7IC4uLm5vZGUsIGRhdGFTdGF0ZTogRGF0YVN0YXRlLnJlY2FsY3VsYXRlZCB9KSxcbiAgICAgICAgY29uZmlnOiB0aGlzLmVuZ2luZVNlcnZpY2Uub2NoZXN0cmF0b3JDb25maWckKG5vZGVUeXBlKG5vZGUpLCBub2RlSWQobm9kZSkpXG4gICAgICB9KVxuICAgICksXG4gICAgdGFwKCgpID0+IHRoaXMubG9hZGluZy5zZXQoZmFsc2UpKVxuICApO1xuXG4gIHByb3RlY3RlZCBub2RlS2V5ID0gaW5wdXQucmVxdWlyZWQ8YmxhbmtOb2Rlc0tleSB8IG5vbkJsYW5rTm9kZXNLZXk+KCk7XG4gIHByb3RlY3RlZCBvcmlnaW5hbFZhbHVlcyA9IGlucHV0KFtdIGFzIGJsYW5rTm9kZXNUeXBlVmFsdWVbXSB8IG5vbkJsYW5rTm9kZXNUeXBlVmFsdWUpO1xuICBwcm90ZWN0ZWQgcmVjYWxjdWxhdGVkVmFsdWVzID0gaW5wdXQoW10gYXMgYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdIHwgbm9uQmxhbmtOb2Rlc1R5cGVWYWx1ZSk7XG4gIHByb3RlY3RlZCB0ZXJtcyA9IGlucHV0KFtdIGFzIElUZXJtSlNPTkxEW10pO1xuICBwcm90ZWN0ZWQgZmlsdGVyVGVybVR5cGVzID0gaW5wdXQoW10gYXMgVGVybVRlcm1UeXBlW10pO1xuICBwcm90ZWN0ZWQgZmlsdGVyVGVybVR5cGVzTGFiZWwgPSBpbnB1dCgnJyk7XG4gIHByb3RlY3RlZCBsb2dzS2V5ID0gaW5wdXQoJycpO1xuICBwcm90ZWN0ZWQgbm9EYXRhTWVzc2FnZSA9IGlucHV0KCcnKTtcblxuICBwcm90ZWN0ZWQgYmFzZVVybCA9IGJhc2VVcmwoKTtcbiAgcHJvdGVjdGVkIGlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsKCk7XG4gIHByb3RlY3RlZCBDeWNsZUZ1bmN0aW9uYWxVbml0ID0gQ3ljbGVGdW5jdGlvbmFsVW5pdDtcbiAgcHJvdGVjdGVkIEVtaXNzaW9uTWV0aG9kVGllciA9IEVtaXNzaW9uTWV0aG9kVGllcjtcbiAgcHJvdGVjdGVkIExvZ1N0YXR1cyA9IExvZ1N0YXR1cztcbiAgcHJvdGVjdGVkIGxvZ0ljb24gPSBsb2dJY29uO1xuICBwcm90ZWN0ZWQgbG9nQ29sb3IgPSBsb2dDb2xvcjtcbiAgcHJvdGVjdGVkIGdldE1vZGVsc0F0ID0gZ2V0TW9kZWxzQXQ7XG4gIHByb3RlY3RlZCByZXF1aXJlbWVudEtleXMgPSByZXF1aXJlbWVudEtleXM7XG4gIHByb3RlY3RlZCByZXF1aXJlbWVudENvbG9yID0gcmVxdWlyZW1lbnRDb2xvcjtcbiAgcHJvdGVjdGVkIGxvZ1ZhbHVlQXJyYXkgPSBsb2dWYWx1ZUFycmF5O1xuICBwcm90ZWN0ZWQgcmVxdWlyZW1lbnRMaW5rZWROb2RlID0gcmVxdWlyZW1lbnRMaW5rZWROb2RlO1xuICBwcm90ZWN0ZWQgaXNTeXN0ZW1Cb3VuZGFyeSA9IGlzU3lzdGVtQm91bmRhcnk7XG4gIHByb3RlY3RlZCBwYXJzZUxvZ0NvbXBsZXRlbmVzcyA9IHBhcnNlTG9nQ29tcGxldGVuZXNzO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHNob3dMZWdlbmQgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvbmx5UmVxdWlyZWQgPSBzaWduYWwodHJ1ZSk7XG5cbiAgcHJvdGVjdGVkIGZpbHRlcmVkVHlwZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuZmlsdGVyVGVybVR5cGVzTGFiZWwoKSB8fCB0aGlzLmZpbHRlclRlcm1UeXBlcygpPy5tYXAodGVybVR5cGVMYWJlbCkuam9pbignICYgJylcbiAgKTtcbiAgcHJvdGVjdGVkIGZ1bmN0aW9uYWxVbml0ID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubm9kZSgpIGFzIElDeWNsZUpTT05MRCk/LmZ1bmN0aW9uYWxVbml0KTtcblxuICBwcm90ZWN0ZWQgbG9nc1VybCA9IGNvbXB1dGVkKCgpID0+IHRoaXMubm9kZVNlcnZpY2Uubm9kZUxvZ3NVcmwodGhpcy5ub2RlKCkpKTtcbiAgcHJvdGVjdGVkIG5vZGVUeXBlID0gY29tcHV0ZWQoKCkgPT4gbm9kZVR5cGUodGhpcy5ub2RlKCkpKTtcbiAgcHJpdmF0ZSBub2RlSWQgPSBjb21wdXRlZCgoKSA9PiBub2RlSWQodGhpcy5ub2RlKCkpKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBzaWduYWwodW5kZWZpbmVkIGFzIElPcmNoZXN0cmF0b3JDb25maWcpO1xuXG4gIHByaXZhdGUgYWxsTG9ncyA9IHNpZ25hbCgnJyk7XG4gIHByaXZhdGUgZ3JvdXBlZExvZ3MgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5hbGxMb2dzKCkgPyBncm91cExvZ3NCeU1vZGVsKHRoaXMuYWxsTG9ncygpKSA6IHt9KSk7XG4gIHByaXZhdGUgbG9ncyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmxvZ3NLZXkoKSA/IHRoaXMuZ3JvdXBlZExvZ3MoKT8uW3RoaXMubG9nc0tleSgpXSA6IHRoaXMuZ3JvdXBlZExvZ3MoKSkgfHwge30pO1xuXG4gIHByaXZhdGUgYWxsQmxhbmtOb2RlcyA9IHNpZ25hbChbXSBhcyAoSUJsYW5rTm9kZUxvZyB8IElOb25CbGFua05vZGVMb2cpW10pO1xuICBwcm90ZWN0ZWQgYmxhbmtOb2RlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5hbGxCbGFua05vZGVzKCkuZmlsdGVyKFxuICAgICAgbG9nID0+ICEoJ3Rlcm0nIGluIGxvZykgfHwgZmlsdGVyQmxhbmtOb2RlKGxvZywgdGhpcy50ZXJtKCksIHRoaXMuZmlsdGVyVGVybVR5cGVzKCksIHRoaXMub25seVJlcXVpcmVkKCkpXG4gICAgKVxuICApO1xuXG4gIHByb3RlY3RlZCBpc0JsYW5rTm9kZXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiBBcnJheS5pc0FycmF5KHRoaXMub3JpZ2luYWxWYWx1ZXMoKSkgfHwgQXJyYXkuaXNBcnJheSh0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcygpKVxuICApO1xuICBwcm90ZWN0ZWQgbWV0aG9kTW9kZWxzQ291bnQgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuYWxsQmxhbmtOb2RlcygpPy5sZW5ndGggJiYgJ3Rlcm0nIGluIHRoaXMuYWxsQmxhbmtOb2RlcygpWzBdXG4gICAgICA/IG1vZGVsQ291bnQodGhpcy5hbGxCbGFua05vZGVzKCkgYXMgSUJsYW5rTm9kZUxvZ1tdKVxuICAgICAgOiAxXG4gICk7XG5cbiAgcHJpdmF0ZSBleHRyYVRlcm1zQnlJZHMgPSBzaWduYWwoW10gYXMgSVRlcm1KU09OTERbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFUZXJtVHlwZXMkID0gZm9ya0pvaW4oe1xuICAgIG5vZGVLZXk6IHRvT2JzZXJ2YWJsZSh0aGlzLm5vZGVLZXkpLFxuICAgIHRlcm1UeXBlczogdG9PYnNlcnZhYmxlKHRoaXMuZmlsdGVyVGVybVR5cGVzKVxuICB9KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICBwcml2YXRlIGV4dHJhVGVybXNCeVRlcm1UeXBlcyA9IHNpZ25hbChbXSBhcyBJVGVybUpTT05MRFtdKTtcbiAgcHJpdmF0ZSBleHRyYVRlcm1zID0gY29tcHV0ZWQoKCkgPT4gWy4uLnRoaXMuZXh0cmFUZXJtc0J5SWRzKCksIC4uLnRoaXMuZXh0cmFUZXJtc0J5VGVybVR5cGVzKCldKTtcbiAgcHJpdmF0ZSBhbGxUZXJtcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgY29tcHV0ZVRlcm1zKFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpIGFzIGJsYW5rTm9kZXNUeXBlVmFsdWVbXSxcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzKCkgYXMgYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdLFxuICAgICAgdGhpcy50ZXJtcygpLFxuICAgICAgdGhpcy5maWx0ZXJUZXJtVHlwZXMoKSxcbiAgICAgIHRoaXMuZXh0cmFUZXJtcygpXG4gICAgKVxuICApO1xuXG4gIHByaXZhdGUgbWV0aG9kc0J5SWQgPSB0b1NpZ25hbChcbiAgICB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgIGJvb2w6IHtcbiAgICAgICAgbXVzdDogW21hdGNoVHlwZShOb2RlVHlwZS5UZXJtKSwgbWF0Y2hUZXJtVHlwZShUZXJtVGVybVR5cGUubW9kZWwpXVxuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICBtZXJnZUFsbCgpLFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIGRpc3RpbmN0KHYgPT4gdlsnQGlkJ10pLFxuICAgICAgcmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoeyAuLi5wcmV2LCBbY3VyclsnQGlkJ11dOiBjdXJyIH0pLCB7fSBhcyBJVGVybXNCeUlkTWFwcGluZylcbiAgICApXG4gICk7XG5cbiAgcHJpdmF0ZSB0ZXJtc0J5SWQgPSBzaWduYWwoe30gYXMgSVRlcm1zQnlJZE1hcHBpbmcpO1xuXG4gIC8vIGZyb20gYG1vZGVsLWxpbmtzLmpzb25gIGZpbGVcbiAgcHJpdmF0ZSBlbmdpbmVNb2RlbHMgPSB0b1NpZ25hbCh0aGlzLmVuZ2luZVNlcnZpY2UuYWxsTW9kZWxzJCgpKTtcblxuICBwcm90ZWN0ZWQgZW5naW5lTW9kZWxWZXJzaW9uID0gdG9TaWduYWwodGhpcy5lbmdpbmVTZXJ2aWNlLmxhdGVzdFZlcnNpb24kKTtcbiAgcHJvdGVjdGVkIGN1cnJlbnRNb2RlbFZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiBub2RlVmVyc2lvbih0aGlzLm5vZGUoKSkpO1xuICBwcm90ZWN0ZWQgc2hvd091dGRhdGVkTG9ncyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gZmlsdGVyIGxpc3Qgb2YgcmVzdWx0cyBieSBhIHNpbmdsZSBUZXJtXG4gIHByb3RlY3RlZCB0ZXJtID0gc2lnbmFsKCcnKTtcbiAgcHJvdGVjdGVkIGVuYWJsZUZpbHRlckJ5VGVybSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYWxsVGVybXMoKT8ubGVuZ3RoID4gMCk7XG4gIHByb3RlY3RlZCBzdWdnZXN0VGVybSA9ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKHYgPT4gdGhpcy5zdWdnZXN0QnlUZXJtKHYpKVxuICAgICk7XG5cbiAgcHJvdGVjdGVkIHR5cGVhaGVhZEZvY3VzID0gdHlwZWFoZWFkRm9jdXM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5kYXRhJC5zdWJzY3JpYmUoKHsgbG9ncywgY29uZmlnIH0pID0+IHtcbiAgICAgIHRoaXMuY29uZmlnLnNldChjb25maWcpO1xuICAgICAgdGhpcy5hbGxMb2dzLnNldChsb2dzKTtcbiAgICB9KTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3RvT2JzZXJ2YWJsZSh0aGlzLm5vZGVLZXkpLCB0b09ic2VydmFibGUodGhpcy5maWx0ZXJUZXJtVHlwZXMpXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIodmFsdWVzID0+IHZhbHVlcy5ldmVyeSh2YWx1ZSA9PiAhaXNVbmRlZmluZWQodmFsdWUpKSksXG4gICAgICAgIG1hcCgoW25vZGVLZXksIHRlcm1UeXBlc10pID0+IFsuLi4obWF0Y2hUZXJtVHlwZUZyb21LZXlbbm9kZUtleV0gfHwgW10pLCAuLi4odGVybVR5cGVzIHx8IFtdKV0pLFxuICAgICAgICBtZXJnZU1hcCh2YWx1ZXMgPT5cbiAgICAgICAgICB2YWx1ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgICAgICAgICAgICBib29sOiB7XG4gICAgICAgICAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pXSxcbiAgICAgICAgICAgICAgICAgIHNob3VsZDogdmFsdWVzLm1hcChtYXRjaFRlcm1UeXBlKSxcbiAgICAgICAgICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBvZihbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh2YWx1ZXMgPT4gdGhpcy5leHRyYVRlcm1zQnlUZXJtVHlwZXMuc2V0KHZhbHVlcykpO1xuXG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmRhdGEkLnBpcGUobWFwKCh7IGNvbmZpZyB9KSA9PiBjb25maWcpKSxcbiAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLm5vZGVLZXkgYXMgU2lnbmFsPGJsYW5rTm9kZXNLZXk+KSxcbiAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLmxvZ3MpXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIodmFsdWVzID0+IHZhbHVlcy5ldmVyeSh2YWx1ZSA9PiAhaXNVbmRlZmluZWQodmFsdWUpKSksXG4gICAgICAgIG1hcCgoW2NvbmZpZywgbm9kZUtleSwgbG9nc10pID0+IGV4dHJhVGVybUlkc0Zyb21Db25maWcoY29uZmlnLCBub2RlS2V5LCBsb2dzKSksXG4gICAgICAgIG1lcmdlTWFwKHZhbHVlcyA9PlxuICAgICAgICAgIHZhbHVlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSldLFxuICAgICAgICAgICAgICAgICAgc2hvdWxkOiB2YWx1ZXMubWFwKG1hdGNoSWQpLFxuICAgICAgICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG9mKFtdKVxuICAgICAgICApLFxuICAgICAgICBtYXAodGVybXMgPT5cbiAgICAgICAgICB0ZXJtcy5maWx0ZXIoXG4gICAgICAgICAgICB0ZXJtID0+XG4gICAgICAgICAgICAgICFyZXN0cmljdFRlcm1UeXBlRnJvbUtleVt0aGlzLm5vZGVLZXkoKV0gfHxcbiAgICAgICAgICAgICAgcmVzdHJpY3RUZXJtVHlwZUZyb21LZXlbdGhpcy5ub2RlS2V5KCldLmluY2x1ZGVzKHRlcm0udGVybVR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlcyA9PiB0aGlzLmV4dHJhVGVybXNCeUlkcy5zZXQodmFsdWVzKSk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIG9mKHRoaXMuaXNCbGFua05vZGVzKCkpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgbWVyZ2VNYXAoaXNCbGFua05vZGVzID0+IChpc0JsYW5rTm9kZXMgPyB0aGlzLmxvYWRCbGFua05vZGVzKCkgOiB0aGlzLmxvYWROb25CbGFua05vZGVzKCkpKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlcyA9PiB0aGlzLmFsbEJsYW5rTm9kZXMuc2V0KHZhbHVlcykpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRCbGFua05vZGVzKCkge1xuICAgIHJldHVybiBvZih0aGlzLmFsbFRlcm1zKCkpLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4gbGlzdFRlcm1JZChwcmV2KSAhPT0gbGlzdFRlcm1JZChjdXJyKSksXG4gICAgICBtZXJnZUFsbCgpLFxuICAgICAgbWFwKFxuICAgICAgICBncm91cExvZ3NCeVRlcm0oXG4gICAgICAgICAgdGhpcy5ub2RlVHlwZSgpLFxuICAgICAgICAgIHRoaXMubG9ncygpLFxuICAgICAgICAgIHRoaXMuZW5naW5lTW9kZWxzKCksXG4gICAgICAgICAgdGhpcy5jb25maWcoKSxcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzKCkgYXMgYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdLFxuICAgICAgICAgIHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzKCkgYXMgYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdLFxuICAgICAgICAgIHRoaXMubm9kZUtleSgpIGFzIGJsYW5rTm9kZXNLZXlcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGZpbHRlcihzaG91bGRTaG93QmxhbmtOb2RlKSxcbiAgICAgIHRvQXJyYXkoKSxcbiAgICAgIG1lcmdlTWFwKHZhbHVlcyA9PiB0aGlzLmZldGNoVGVybUlkcyh2YWx1ZXMpLnBpcGUobWFwKCgpID0+IHZhbHVlcykpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWROb25CbGFua05vZGVzKCkge1xuICAgIGNvbnN0IG1hcEZ1bmMgPSBncm91cGRMb2dzQnlLZXkoXG4gICAgICB0aGlzLm5vZGVUeXBlKCksXG4gICAgICB0aGlzLm5vZGVLZXkoKSBhcyBub25CbGFua05vZGVzS2V5LFxuICAgICAgdGhpcy5sb2dzKCksXG4gICAgICB0aGlzLmVuZ2luZU1vZGVscygpLFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpIGFzIG5vbkJsYW5rTm9kZXNUeXBlVmFsdWUsXG4gICAgICB0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcygpIGFzIG5vbkJsYW5rTm9kZXNUeXBlVmFsdWVcbiAgICApO1xuICAgIGNvbnN0IGtleXMgPSBjb21wdXRlS2V5cyhcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSBhcyBub25CbGFua05vZGVzVHlwZVZhbHVlLFxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMoKSBhcyBub25CbGFua05vZGVzVHlwZVZhbHVlXG4gICAgKTtcbiAgICByZXR1cm4gZnJvbShrZXlzKS5waXBlKG1hcChtYXBGdW5jKSwgdG9BcnJheSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hUZXJtSWRzKHZhbHVlczogSUJsYW5rTm9kZUxvZ1tdKSB7XG4gICAgcmV0dXJuIG9mKHZhbHVlcykucGlwZShcbiAgICAgIG1lcmdlTWFwKHYgPT4gdi5mbGF0TWFwKHZ2ID0+IHZ2LnN1YlZhbHVlcykpLFxuICAgICAgbWFwKHYgPT4gdi5pZCksXG4gICAgICBkaXN0aW5jdCgpLFxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcbiAgICAgIHRvQXJyYXkoKSxcbiAgICAgIG1lcmdlTWFwKChpZHM6IHN0cmluZ1tdKSA9PlxuICAgICAgICBpZHMubGVuZ3RoXG4gICAgICAgICAgPyB0aGlzLnNlYXJjaFRlcm1zKHtcbiAgICAgICAgICAgICAgYm9vbDoge1xuICAgICAgICAgICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSldLFxuICAgICAgICAgICAgICAgIHNob3VsZDogaWRzLm1hcChpZCA9PiBtYXRjaEV4YWN0UXVlcnkoJ0BpZCcsIGlkKSksXG4gICAgICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IG9mKFtdKVxuICAgICAgKSxcbiAgICAgIHJlZHVjZSgocHJldiwgY3VycikgPT4gKHsgLi4ucHJldiwgW2N1cnJbJ0BpZCddXTogY3VyciB9KSwge30gYXMgSVRlcm1zQnlJZE1hcHBpbmcpLFxuICAgICAgdGFwKHZhbHVlcyA9PiB0aGlzLnRlcm1zQnlJZC5zZXQodmFsdWVzKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWdnZXN0QnlUZXJtKHRlcm06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFsbFRlcm1zKClcbiAgICAgIC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxuICAgICAgLmZpbHRlcih2ID0+IHRlcm1TZWFyY2godikuaW5jbHVkZXModGVybVNlYXJjaCh0ZXJtKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hUZXJtcyhxdWVyeTogYW55KSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlXG4gICAgICAuc2VhcmNoJDxJVGVybUpTT05MRCwgTm9kZVR5cGUuVGVybT4oe1xuICAgICAgICBmaWVsZHM6IFsnQHR5cGUnLCAnQGlkJywgJ25hbWUnLCAndW5pdHMnLCAndGVybVR5cGUnXSxcbiAgICAgICAgbGltaXQ6IDEwMDAwLFxuICAgICAgICBxdWVyeVxuICAgICAgfSlcblxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKSksXG4gICAgICAgIG1hcCgoeyByZXN1bHRzIH0pID0+IHJlc3VsdHMpXG4gICAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlCbGFua05vZGUoX2luZGV4OiBudW1iZXIsIG5vZGU6IGFueSkge1xuICAgIHJldHVybiBub2RlLnRlcm1JZCB8fCBub2RlLmtleTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXRob2ROYW1lKHsgbWV0aG9kSWQsIG1vZGVsIH06IElDb25maWdNb2RlbCkge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZHNCeUlkKCk/LlttZXRob2RJZF0/Lm5hbWUgfHwgbWV0aG9kSWRMYWJlbChtZXRob2RJZCwgbW9kZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc01ldGhvZFRpZXIodmFsdWVzOiBibGFua05vZGVzVHlwZVZhbHVlW10sIG1ldGhvZFRpZXI6IEVtaXNzaW9uTWV0aG9kVGllcikge1xuICAgIHJldHVybiB2YWx1ZXMuc29tZSh2ID0+ICdtZXRob2RUaWVyJyBpbiB2ICYmIHYubWV0aG9kVGllciA9PT0gbWV0aG9kVGllcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGVybUJ5SWQoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnRlcm1zQnlJZCgpPy5baWRdIHx8XG4gICAgICAoe1xuICAgICAgICAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLFxuICAgICAgICAnQGlkJzogaWQsXG4gICAgICAgIG5hbWU6IHRlcm1UeXBlTGFiZWwoaWQpXG4gICAgICB9IGFzIElUZXJtSlNPTkxEKVxuICAgICk7XG4gIH1cbn1cbiIsIkBpZiAoc2hvd091dGRhdGVkTG9ncygpIHx8IGVuZ2luZU1vZGVsVmVyc2lvbigpID09PSBjdXJyZW50TW9kZWxWZXJzaW9uKCkpIHtcbiAgPGRpdiBjbGFzcz1cImlzLXB4LTMgaXMtcGItM1wiPlxuICAgIEBpZiAoIWlzRXh0ZXJuYWwgJiYgbG9nc1VybCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtcmlnaHQgaXMtbWItMlwiPlxuICAgICAgICA8YSBjbGFzcz1cImlzLXNpemUtN1wiIFtocmVmXT1cImxvZ3NVcmwoKVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhRXh0ZXJuYWxMaW5rQWx0XCI+PC9mYS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPk9wZW4gRnVsbCBMb2dzPC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGhlLWRhdGEtdGFibGUgY2xhc3M9XCJtYi0xIGlzLXNtYWxsXCIgW3NtYWxsXT1cInRydWVcIiBtYXhIZWlnaHQ9XCIzMjBcIj5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWZ1bGx3aWR0aCBpcy1uYXJyb3cgaXMtc3RyaXBlZFwiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgIEBpZiAoZW5hYmxlRmlsdGVyQnlUZXJtKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkIGhhcy1pY29ucy1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0IHNlYXJjaC1pbnB1dCBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidGVybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidGVybVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZW50cnkgYnkgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nYlR5cGVhaGVhZF09XCJzdWdnZXN0VGVybVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZvY3VzRmlyc3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cInR5cGVhaGVhZEZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RJdGVtKT1cInRlcm0uc2V0KCRldmVudC5pdGVtKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXRlcm0oKVwiIChjbGljayk9XCJ0ZXJtLnNldCgnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYVRpbWVzXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIEBpZiAoaXNCbGFua05vZGVzKCkpIHtcbiAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcHItMVwiPlVuaXRzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPihwZXImbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICBAc3dpdGNoIChmdW5jdGlvbmFsVW5pdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChDeWNsZUZ1bmN0aW9uYWxVbml0WycxIGhhJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICBoZWN0YXJlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICAgIGtnIHByb2R1Y3RcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4pPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHRoPk9yaWdpbmFsPC90aD5cbiAgICAgICAgICAgIDx0aD5SZWNhbGN1bGF0ZWQ8L3RoPlxuICAgICAgICAgICAgQGlmIChpc0JsYW5rTm9kZXMoKSkge1xuICAgICAgICAgICAgICA8dGg+RGlmZmVyZW5jZTwvdGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZm9yIChjIG9mIG1ldGhvZE1vZGVsc0NvdW50KCkgfCB0aW1lczsgdHJhY2sgYzsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRoPih7eyBpICsgMSB9fSk8L3RoPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtdGV4dC1jZW50ZXJlZFwiIGNvbHNwYW49XCI2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYVNwaW5uZXJcIiBbcHVsc2VdPVwidHJ1ZVwiIHNpemU9XCJsZ1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoIWxvYWRpbmcoKSAmJiBibGFua05vZGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImhhcy10ZXh0LWNlbnRlcmVkXCIgY29sc3Bhbj1cIjZcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBub0RhdGFNZXNzYWdlKCkgfHwgJ05vIGRhdGEnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGZvciAoYmxhbmtOb2RlIG9mIGJsYW5rTm9kZXMoKTsgdHJhY2sgdHJhY2tCeUJsYW5rTm9kZSgkaW5kZXgsIGJsYW5rTm9kZSkpIHtcbiAgICAgICAgICAgIDx0ciBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cImJsYW5rTm9kZS5jYW5PcGVuXCIgW2NsYXNzLmlzLW9wZW5dPVwiYmxhbmtOb2RlLmlzT3BlblwiPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodCBpcy1ub3dyYXBcIlxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIiRhbnkoYmxhbmtOb2RlKS50ZXJtPy5uYW1lIHx8ICRhbnkoYmxhbmtOb2RlKS5rZXlcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGJsYW5rTm9kZS5jYW5PcGVuKSB7XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMiBvcGVuLW5vZGVcIiAoY2xpY2spPVwiYmxhbmtOb2RlLmlzT3BlbiA9ICFibGFua05vZGUuaXNPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhQW5nbGVEb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFBbmdsZVJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJibGFua05vZGUuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKCRhbnkoYmxhbmtOb2RlKS50ZXJtKSB7XG4gICAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLXByZS13cmFwXCIgW25vZGVdPVwiJGFueShibGFua05vZGUpLnRlcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCIkYW55KGJsYW5rTm9kZSkudGVybS5uYW1lIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmICgkYW55KGJsYW5rTm9kZSkua2V5KSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKG5vZGVLZXkoKSA9PT0gJ2NvbXBsZXRlbmVzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hL0NvbXBsZXRlbmVzcyMnICsgJGFueShibGFua05vZGUpLmtleVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICRhbnkoYmxhbmtOb2RlKS5rZXkgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyAkYW55KGJsYW5rTm9kZSkua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgQGlmIChpc0JsYW5rTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtbm93cmFwXCIgW2lubmVySHRtbF09XCIkYW55KGJsYW5rTm9kZSkudGVybT8udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI29yaWdpbmFsVmFsdWVDb250ZW50PlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgJGFueShibGFua05vZGUpLm9yaWdpbmFsVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIEBpZiAoYmxhbmtOb2RlLmFsbFBhcmFsbGVsKSB7XG4gICAgICAgICAgICAgICAgICBAZm9yIChtb2RlbCBvZiAkYW55KGJsYW5rTm9kZSkuY29uZmlnTW9kZWxzWzBdOyB0cmFjayBtb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF0gfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudHJpZ2dlci1wb3BvdmVyXT1cIiEhJGFueShibGFua05vZGUpLm9yaWdpbmFsPy5bMF0/Lm1ldGhvZE1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nYlBvcG92ZXJdPVwiYmxhbmtOb2RlT3JpZ2luYWxWYWx1ZURldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICNwPVwibmdiUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVQb3BvdmVyXT1cIiEkYW55KGJsYW5rTm9kZSkub3JpZ2luYWw/LlswXT8ubWV0aG9kTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckNvbnRleHRdPVwieyBibGFua05vZGUgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBwb2ludGVyPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICBAaWYgKCFibGFua05vZGUuaXNPcmlnaW5hbCB8fCBibGFua05vZGUuaXNSZWNhbGN1bGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYmxhbmtOb2RlLmFsbFBhcmFsbGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG1vZGVsIG9mICRhbnkoYmxhbmtOb2RlKS5jb25maWdNb2RlbHNbMF07IHRyYWNrIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICRhbnkoYmxhbmtOb2RlKS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICBub3QgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICBAaWYgKGlzQmxhbmtOb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaXMtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKGJsYW5rTm9kZS5hbGxQYXJhbGxlbCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChtb2RlbCBvZiAkYW55KGJsYW5rTm9kZSkuY29uZmlnTW9kZWxzWzBdOyB0cmFjayBtb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAkYW55KGJsYW5rTm9kZSkub3JpZ2luYWxWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICRhbnkoYmxhbmtOb2RlKS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiJGFueShibGFua05vZGUpLnJlY2FsY3VsYXRlZFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFueShibGFua05vZGUpLm9yaWdpbmFsVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPjwvaGUtYmxhbmstbm9kZS12YWx1ZS1kZWx0YT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAtXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKCRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbC5sZW5ndGggJiYgYmxhbmtOb2RlLmlzUmVjYWxjdWxhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGhlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJibGFua05vZGUucmVjYWxjdWxhdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwiJGFueShibGFua05vZGUpLm9yaWdpbmFsVmFsdWVcIj48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDogeyBkYXRhOiBibGFua05vZGUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIEBmb3IgKHN1YlZhbHVlIG9mICRhbnkoYmxhbmtOb2RlKS5rZXlzOyB0cmFjayBzdWJWYWx1ZSkge1xuICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXN1Yi1yb3dzXT1cIiRhbnkoYmxhbmtOb2RlKS5zdWJWYWx1ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXN1Yi1yb3ddPVwiYmxhbmtOb2RlLmNhbk9wZW5cIj5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHQgaXMtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcGwtMyBwci0xIGZpZWxkLW5vZGVcIj5GaWVsZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICBAaWYgKGJsYW5rTm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtcHJlLXdyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS8nICsgYmxhbmtOb2RlLnR5cGUgKyAnIycgKyBzdWJWYWx1ZS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInN1YlZhbHVlLmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN1YlZhbHVlLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmICghYmxhbmtOb2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wXCI+e3sgc3ViVmFsdWUua2V5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgQGlmIChpc0JsYW5rTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgIEBpZiAoc3ViVmFsdWUub3JpZ2luYWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzdWJWYWx1ZS5vcmlnaW5hbFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAtXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICBAaWYgKHN1YlZhbHVlLmlzUmVjYWxjdWxhdGVkIHx8IHN1YlZhbHVlLmtleSA9PT0gJ2ltcGFjdEFzc2Vzc21lbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHN1YlZhbHVlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub3QgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICBAaWYgKGlzQmxhbmtOb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICA8dGQ+LTwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbHM7IGNvbnRleHQ6IHsgZGF0YTogc3ViVmFsdWUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGZvciAoc3ViVmFsdWUgb2YgJGFueShibGFua05vZGUpLnN1YlZhbHVlczsgdHJhY2sgc3ViVmFsdWUpIHtcbiAgICAgICAgICAgICAgPHRyIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWJsYW5rTm9kZS5pc09wZW5cIiBbY2xhc3MuaXMtc3ViLXJvd109XCJibGFua05vZGUuY2FuT3BlblwiPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHBsLTNcIj57eyBzdWJWYWx1ZS5rZXkgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChzdWJWYWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcCBwci0xXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoc3ViVmFsdWUua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdiYWNrZ3JvdW5kRGF0YScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrXCI+e3sgc3ViVmFsdWUuaWQgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtYmxvY2sgcGwtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwidGVybUJ5SWQoc3ViVmFsdWUuaWQpLm5hbWUgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgQGlmIChpc0JsYW5rTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHN1YlZhbHVlLnNob3dVbml0cykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtbm93cmFwXCIgW2lubmVySHRtbF09XCIkYW55KGJsYW5rTm9kZSkudGVybT8udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgQGlmIChzdWJWYWx1ZS5vcmlnaW5hbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgIEBpZiAoc3ViVmFsdWUuaXNSZWNhbGN1bGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3sgc3ViVmFsdWUucmVjYWxjdWxhdGVkVmFsdWUgfCBwcmVjaXNpb246IDMgfCBkZWZhdWx0OiAnLScgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdCByZWNhbGN1bGF0ZWRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIEBpZiAoaXNCbGFua05vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDx0ZD4tPC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsczsgY29udGV4dDogeyBkYXRhOiBzdWJWYWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2hlLWRhdGEtdGFibGU+XG4gICAgPGRpdiBjbGFzcz1cImlzLXNpemUtNyBpcy1pdGFsaWNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLXZhcmlhYmxlIGlzLTEgbXktMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgcHItMlwiIChjbGljayk9XCJzaG93TGVnZW5kID0gIXNob3dMZWdlbmRcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFBbmdsZURvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFzaG93TGVnZW5kXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUFuZ2xlUmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInNob3dMZWdlbmRcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiPkxlZ2VuZDo8L3NwYW4+XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDx1bCBjbGFzcz1cImNvbnRlbnQgcGwtMlwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXNob3dMZWdlbmRcIj5cbiAgICAgICAgICAgIEBmb3IgKHN0YXR1cyBvZiBMb2dTdGF0dXMgfCBrZXlzOyB0cmFjayBzdGF0dXMpIHtcbiAgICAgICAgICAgICAgQGlmIChsb2dJY29uW3N0YXR1cy52YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJoYXMtdGV4dC17eyBsb2dDb2xvcltzdGF0dXMudmFsdWVdIH19XCI+XG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJsb2dJY29uW3N0YXR1cy52YWx1ZV1cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj57eyBzdGF0dXMudmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGZpbHRlcmVkVHlwZSgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBoYXMtdGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGNoZWNrYm94XCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib25seVJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9ubHlSZXF1aXJlZC5zZXQoJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhdGVybSgpXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICAgICAgU2hvdyBvbmx5IHt7IGZpbHRlcmVkVHlwZSgpIHwgcGx1cmFsaXplIH19IGluY2x1ZGVkIGluIHRoZSBkZWZhdWx0IEhFU1RJQSBzeXN0ZW0gYm91bmRhcnlcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXYgY2xhc3M9XCJpcy0zIGhhcy10ZXh0LWNlbnRlcmVkXCI+XG4gICAgPHAgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICA8ZmEtaWNvbiBjbGFzcz1cImlzLXByLTJcIiBbaWNvbl09XCJmYUV4Y2xhbWF0aW9uVHJpYW5nbGVcIj48L2ZhLWljb24+XG4gICAgICA8c3Bhbj5UaGVzZSBsb2dzIG1pZ2h0IGJlIGluY29ycmVjdCBhcyB0aGUgY2FsY3VsYXRpb25zIGFyZSBvdXRkYXRlZC48L3NwYW4+XG4gICAgPC9wPlxuICAgIDxwIGNsYXNzPVwiaXMtdW5kZXJsaW5lZCBpcy1zaXplLTdcIj48YSAoY2xpY2spPVwic2hvd091dGRhdGVkTG9ncy5zZXQodHJ1ZSlcIj5WaWV3IGxvZ3MgYW55d2F5LjwvYT48L3A+XG4gIDwvZGl2PlxufVxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU9yaWdpbmFsVmFsdWVEZXRhaWxzIGxldC1ibGFua05vZGU9XCJibGFua05vZGVcIj5cbiAgPHNwYW4gY2xhc3M9XCJpcy1wci0xXCI+VGhlIG9yaWdpbmFsIHZhbHVlIHdhcyByZXBvcnRlZCB1c2luZzo8L3NwYW4+XG4gIDxoZS1ub2RlLWxpbmtcbiAgICBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiXG4gICAgbGlua0NsYXNzPVwiaXMtZGFya1wiXG4gICAgW25vZGVdPVwiJGFueShibGFua05vZGUpLm9yaWdpbmFsWzBdLm1ldGhvZE1vZGVsXCJcbiAgICBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCI+XG4gICAgPHNwYW4+e3sgJGFueShibGFua05vZGUpLm9yaWdpbmFsWzBdLm1ldGhvZE1vZGVsLm5hbWUgfX08L3NwYW4+XG4gIDwvaGUtbm9kZS1saW5rPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNibGFua05vZGVNb2RlbHMgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxuZy10ZW1wbGF0ZSAjbm90SW5TeXN0ZW1Cb3VuZGFyeT5cbiAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJtZXRob2RNb2RlbHNDb3VudCgpXCI+XG4gICAgICA8c3Bhbj5Ob3QgaW4gSEVTVElBIHN5c3RlbSBib3VuZGFyeTwvc3Bhbj5cbiAgICA8L3RkPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIEBpZiAoaXNTeXN0ZW1Cb3VuZGFyeShkYXRhKSkge1xuICAgIEBmb3IgKGMgb2YgbWV0aG9kTW9kZWxzQ291bnQoKSB8IHRpbWVzOyB0cmFjayBjOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPHRkIGNsYXNzPVwiYmxhbmstbm9kZS1pbmRleC17eyBpIH19XCI+XG4gICAgICAgIEBpZiAoZ2V0TW9kZWxzQXQoZGF0YSwgaSk7IGFzIG1vZGVscykge1xuICAgICAgICAgIEBpZiAoJGFueShtb2RlbHMpIHwgaXNBcnJheSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgQGZvciAobW9kZWwgb2YgJGFueShtb2RlbHMpOyB0cmFjayBtb2RlbCkge1xuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7IG1vZGVsLCBkYXRhIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJsYW5rTm9kZU1vZGVsOyBjb250ZXh0OiB7IG1vZGVsOiBtb2RlbHMsIGRhdGEgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgLVxuICAgICAgICB9XG4gICAgICA8L3RkPlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgLVxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JsYW5rTm9kZU1vZGVsIGxldC1tb2RlbD1cIm1vZGVsXCIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxzcGFuXG4gICAgY2xhc3M9XCJpcy1ub3dyYXBcIlxuICAgIFtjbGFzcy50cmlnZ2VyLXBvcG92ZXJdPVwibW9kZWwuc2hvd0xvZ3NcIlxuICAgIFtuZ2JQb3BvdmVyXT1cImxvZ0RldGFpbHNcIlxuICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICBwb3BvdmVyQ2xhc3M9XCJpcy1uYXJyb3dcIlxuICAgIHRyaWdnZXJzPVwibWFudWFsXCJcbiAgICAjcD1cIm5nYlBvcG92ZXJcIlxuICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgIChjbGljayk9XCJwLmlzT3BlbigpID8gcC5jbG9zZSgpIDogbW9kZWwuc2hvd0xvZ3MgPyBwLm9wZW4oeyBsb2dzOiBtb2RlbC5sb2dzIH0pIDogbnVsbFwiPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtY2FwaXRhbGl6ZWRcIj57eyBtZXRob2ROYW1lKG1vZGVsKSB9fTwvc3Bhbj5cbiAgICBAaWYgKG1vZGVsLmxvZ3M/Lm1ldGhvZFRpZXIgfHwgbW9kZWwubW9kZWw/Lm1ldGhvZFRpZXIpIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPlt7eyBtb2RlbC5sb2dzPy5tZXRob2RUaWVyIHx8IG1vZGVsLm1vZGVsPy5tZXRob2RUaWVyIH19XTwvc3Bhbj5cbiAgICB9XG5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJwbC0xIGhhcy10ZXh0LXt7IGxvZ0NvbG9yW21vZGVsLnN0YXR1c10gfX0gdHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgIFtuZ2JQb3BvdmVyXT1cImxvZ1N0YXR1c0RldGFpbHNcIlxuICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICAgIHRyaWdnZXJzPVwibWFudWFsXCJcbiAgICAgICNwMT1cIm5nYlBvcG92ZXJcIlxuICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHAxLmlzT3BlbigpID8gcDEuY2xvc2UoKSA6IHAxLm9wZW4oeyBtb2RlbCwgZGF0YSB9KVwiPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwibG9nSWNvblttb2RlbC5zdGF0dXNdXCI+PC9mYS1pY29uPlxuICAgIDwvc3Bhbj5cblxuICAgIEBpZiAobW9kZWwubW9kZWwpIHtcbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPlxuICAgICAgICAoXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkb2NzTGluazsgY29udGV4dDogeyAkaW1wbGljaXQ6IG1vZGVsLm1vZGVsIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgKVxuICAgICAgPC9zcGFuPlxuICAgIH1cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dEZXRhaWxzIGxldC1sb2dzPVwibG9nc1wiPlxuICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1mdWxsd2lkdGhcIj5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgQGlmIChsb2dzPy5yZXF1aXJlbWVudHMpIHtcbiAgICAgICAgICBAZm9yIChrZXkgb2YgcmVxdWlyZW1lbnRLZXlzKGxvZ3MucmVxdWlyZW1lbnRzKTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDogeyBrZXksIHZhbHVlOiBsb2dzLnJlcXVpcmVtZW50c1trZXldIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGxvZ3M/LmxvZ3MpIHtcbiAgICAgICAgICBAZm9yIChrZXkgb2YgbG9ncy5sb2dzIHwga2V5czsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9nTGluZTsgY29udGV4dDoga2V5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuXG4gIEBpZiAobG9ncz8ubWlzc2luZ0xvb2t1cHM/Lmxlbmd0aCkge1xuICAgIDxkaXYgY2xhc3M9XCJpdC1tdC0yXCI+XG4gICAgICA8cD5EYXRhIG1pc3NpbmcgKG1pZ2h0IGJlIG9wdGlvbmFsKTo8L3A+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIGRhdGEtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWRhcmsgaXMtZnVsbHdpZHRoIGlzLXN0cmlwZWRcIj5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+RmlsZW5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+Q29sdW1uIFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlJvdyAodGVybS5pZCk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgPHRib2R5IGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgIEBmb3IgKGRhdGEgb2YgbG9ncy5taXNzaW5nTG9va3VwczsgdHJhY2sgZGF0YSkge1xuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPnt7IGRhdGEuZmlsZW5hbWUgfX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD57eyBkYXRhLmNvbHVtbiB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPnt7IGRhdGEudGVybUlkIH19PC90ZD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nTGluZVZhbHVlIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICBAaWYgKHJlcXVpcmVtZW50TGlua2VkTm9kZShrZXksIHZhbHVlKTsgYXMgbGlua2VkTm9kZSkge1xuICAgIDxoZS1ub2RlLWxpbmtcbiAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLW1pZGRsZVwiXG4gICAgICBsaW5rQ2xhc3M9XCJpcy1kYXJrXCJcbiAgICAgIFtub2RlXT1cImxpbmtlZE5vZGVcIlxuICAgICAgW3Nob3dFeHRlcm5hbExpbmtdPVwidHJ1ZVwiPjwvaGUtbm9kZS1saW5rPlxuICB9IEBlbHNlIHtcbiAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIj57eyB2YWx1ZSB9fTwvc3Bhbj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dMaW5lIGxldC1rZXk9XCJrZXlcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICA8dHI+XG4gICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodCBjb3B5LWxvZ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgIEBpZiAocGFyc2VMb2dDb21wbGV0ZW5lc3Moa2V5KTsgYXMgY29tcGxldGVuZXNzKSB7XG4gICAgICAgICAgPHNwYW4+RGF0YSBjb21wbGV0ZW5lc3MgZm9yPC9zcGFuPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IGNvbXBsZXRlbmVzcy5rZXkgfX08L2NvZGU+XG4gICAgICAgICAgPHNwYW4+bXVzdCBiZTwvc3Bhbj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj57eyBjb21wbGV0ZW5lc3MudmFsdWUgfX08L2NvZGU+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIEBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICB7eyBrZXkgfCBrZXlUb0xhYmVsIH19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb3BlcnR5X2lkJykge1xuICAgICAgICAgICAgICBQcm9wZXJ0eSBUZXJtICYjNjQ7aWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncHJvZHVjdF9pZCcpIHtcbiAgICAgICAgICAgICAgUHJvZHVjdCBUZXJtICYjNjQ7aWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnY3JvcF9wcm9kdWN0X2lkJykge1xuICAgICAgICAgICAgICBDcm9wIFByb2R1Y3QgVGVybSAmIzY0O2lkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2lucHV0X2lkJykge1xuICAgICAgICAgICAgICBJbnB1dCBUZXJtICYjNjQ7aWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnbm9kZV90eXBlX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Ob2RlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdzaXRlVHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5JcyB0aGUgY3VycmVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+c2l0ZVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb2R1Y3RfaWRfYWxsb3dlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgUHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+JiM2NDtpZDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncHJvZHVjdF90ZXJtVHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5BcmUgYW55IG9mIHRoZSBQcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnaW5wdXRfaWRfYWxsb3dlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgSW5wdXQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPiYjNjQ7aWQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2lucHV0X3Rlcm1UeXBlX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIElucHV0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gRGVwcmVjYXRlZCAtLT5cbiAgICAgICAgICAgIEBjYXNlICgncHJpbWFyeV9wcm9kdWN0X2lkX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50IHByaW1hcnkgcHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+JiM2NDtpZDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncHJpbWFyeV9wcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPklzIHRoZSBjdXJyZW50IHByaW1hcnkgcHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+dGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2dlb3NwYXRpYWxfZGF0YScpIHtcbiAgICAgICAgICAgICAgSGFzIGdlb3NwYXRpYWwgZGF0YSBuZWNlc3NhcnkgdG8gcnVuIHRoaXMgbW9kZWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnY29udGFpbnNfZ2Vvc3BhdGlhbF9kYXRhJykge1xuICAgICAgICAgICAgICBIYXMgZ2Vvc3BhdGlhbCBkYXRhIG5lY2Vzc2FyeSB0byBydW4gdGhpcyBtb2RlbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdjdXJyZW50X3NpemUnKSB7XG4gICAgICAgICAgICAgIEN1cnJlbnQgcG9seWdvbiBhcmVhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ21heF9hcmVhX3NpemUnKSB7XG4gICAgICAgICAgICAgIE1heGltdW0gcG9seWdvbiBhcmVhIHRvIHJ1biB0aGlzIG1vZGVsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2JlbG93X21heF9hcmVhX3NpemUnKSB7XG4gICAgICAgICAgICAgIFBvbHlnb24gYmVsb3cgdGhlIG1heGltdW0gYXJlYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdyZWdpb25fZmFjdG9yJykge1xuICAgICAgICAgICAgICBGYWN0b3IgZnJvbSByZWdpb24gbG9va3VwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2hhc19wZXN0aWNpZGVzX2lucHV0cycpIHtcbiAgICAgICAgICAgICAgPHNwYW4+Q3ljbGUgY29udGFpbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnBlc3RpY2lkZUFJPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5JbnB1dHM8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2FsbF9wZXN0aWNpZGVBSV9oYXZlX2xvb2t1cF92YWx1ZScpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QWxsPC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5wZXN0aWNpZGVBSTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+SW5wdXRzIGhhdmUgYSBsb29rdXAgdmFsdWU8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2hhc19jcm9wX3Jlc2lkdWVfYnVybnQnKSB7XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPmFib3ZlR3JvdW5kQ3JvcFJlc2lkdWVCdXJudDwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+aXMgcHJlc2VudCBhcyBQcm9kdWN0PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdsaXF1aWRfc2x1cnJ5X3NsdWRnZV9QJykge1xuICAgICAgICAgICAgICBMaXF1aWQsIFNsdXJyeSwgYW5kIFNsdWRnZSBQXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ25vX2N5Y2xlX2lucHV0c19mZWVkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICBDeWNsZSBoYXNcbiAgICAgICAgICAgICAgICA8Yj5ubzwvYj5cbiAgICAgICAgICAgICAgICBJbnB1dCB3aXRoXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGU+aXNBbmltYWxGZWVkPXRydWU8L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2hhc19jeWNsZV9pbnB1dHNfZmVlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgQ3ljbGUgaGFzXG4gICAgICAgICAgICAgICAgPGI+c29tZTwvYj5cbiAgICAgICAgICAgICAgICBJbnB1dCB3aXRoXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGU+aXNBbmltYWxGZWVkPXRydWU8L2NvZGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L3NwYW4+XG4gICAgICA8aGUtY2xpcGJvYXJkXG4gICAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLW1pZGRsZVwiXG4gICAgICAgIGNsaXBib2FyZENsYXNzPVwiaXMtc2l6ZS03IGlzLXAtMVwiXG4gICAgICAgIFtpY29uXT1cImZhckNsb25lXCJcbiAgICAgICAgW3ZhbHVlXT1cImtleVwiXG4gICAgICAgIFtoaWRlVGV4dF09XCJ0cnVlXCI+PC9oZS1jbGlwYm9hcmQ+XG4gICAgPC90ZD5cbiAgICA8dGQ+XG4gICAgICBAaWYgKGxvZ1ZhbHVlQXJyYXkodmFsdWUpOyBhcyB2YWx1ZUFycmF5KSB7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZGFyayBpcy1ib3JkZXJlZCBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgICBAaWYgKHZhbHVlQXJyYXlbMF0gfCBpc09iamVjdCkge1xuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgQGZvciAodiBvZiB2YWx1ZUFycmF5WzBdIHwga2V5czsgdHJhY2sgdikge1xuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPnt7IHYua2V5IH19PC90aD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICBAZm9yICh2IG9mIHZhbHVlQXJyYXk7IHRyYWNrIHYpIHtcbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICBAaWYgKHYgfCBpc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yICh2diBvZiB2IHwga2V5czsgdHJhY2sgdnYpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgdnYudmFsdWUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHYgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmVWYWx1ZTsgY29udGV4dDogeyBrZXksIHZhbHVlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICA8L3RkPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2dTdGF0dXNEZXRhaWxzIGxldC1tb2RlbD1cIm1vZGVsXCIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgPHNwYW4+U3RhdHVzOjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbC5zdGF0dXMgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIEBpZiAobW9kZWwuc3RhdHVzID09PSBMb2dTdGF0dXMubm90UmVxdWlyZWQgJiYgbW9kZWwubG9ncz8uaXNfbm90X3JlbGV2YW50ID09PSAnVHJ1ZScpIHtcbiAgICA8dWwgY2xhc3M9XCJpcy1wbC0zIGlzLWxpc3Qtc3R5bGUtZGlzY1wiPlxuICAgICAgQGlmIChtb2RlbC5sb2dzLmxvZ3M/LnNpdGVUeXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIFRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnNpdGUuc2l0ZVR5cGU8L2NvZGU+XG4gICAgICAgICAgaXMgbm90IHJlbGV2YW50LlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgICAgQGlmIChtb2RlbC5sb2dzLmxvZ3M/LnByb2R1Y3RfaWRfYWxsb3dlZCA9PT0gJ0ZhbHNlJykge1xuICAgICAgICA8bGk+XG4gICAgICAgICAgTm9uZSBvZiB0aGVcbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5Qcm9kdWN0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0uJiM2NDtpZDwvY29kZT5cbiAgICAgICAgICBpcyByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICAgIEBpZiAobW9kZWwubG9ncy5sb2dzPy5wcm9kdWN0X3Rlcm1UeXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+UHJvZHVjdDwvY29kZT5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW1yLTFcIj50ZXJtLnRlcm1UeXBlPC9jb2RlPlxuICAgICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgICAgQGlmIChtb2RlbC5sb2dzLmxvZ3M/LmlucHV0X2lkX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+SW5wdXQ8L2NvZGU+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS4mIzY0O2lkPC9jb2RlPlxuICAgICAgICAgIGlzIHJlbGV2YW50LlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgICAgQGlmIChtb2RlbC5sb2dzLmxvZ3M/LmlucHV0X3Rlcm1UeXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+SW5wdXQ8L2NvZGU+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICBpcyByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICA8L3VsPlxuICB9XG5cbiAgQGlmIChtb2RlbC5sb2dzICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLm5vdFJlcXVpcmVkICYmIG1vZGVsLnN0YXR1cyAhPT0gTG9nU3RhdHVzLnNraXBIaWVyYXJjaHkpIHtcbiAgICA8dWwgY2xhc3M9XCJpcy1wbC0zIGlzLWxpc3Qtc3R5bGUtZGlzY1wiPlxuICAgICAgQGlmIChtb2RlbC5sb2dzPy5zaG91bGRSdW5PcmNoZXN0cmF0b3IgPT09IGZhbHNlKSB7XG4gICAgICAgIDxsaSBjbGFzcz1cImlzLW5vLXJ1bi1vcmNoZXN0cmF0b3JcIj5cbiAgICAgICAgICBAaWYgKCFtb2RlbC5sb2dzLnJ1blJlcXVpcmVkKSB7XG4gICAgICAgICAgICBAaWYgKG1vZGVsLmxvZ3MubG9ncz8ubm9kZV90eXBlX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ydW4tbm9kZS10eXBlLW5vdC1hbGxvd2VkXCI+XG4gICAgICAgICAgICAgICAgVGhpcyBtb2RlbCBzaG91bGQgbm90IHJ1biBmb3Ige3sgbm9kZVR5cGUoKSB8IHBsdXJhbGl6ZTogMCB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAobW9kZWwuY29uZmlnKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImlzLXJ1bi1zdHJhdGVneS17eyBtb2RlbC5jb25maWcucnVuU3RyYXRlZ3kgfX1cIj5cbiAgICAgICAgICAgICAgQHN3aXRjaCAobW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdhbHdheXMnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnYWRkX2tleV9pZl9taXNzaW5nJykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+V2Ugb25seSBnYXAtZmlsbCB0aGlzIGtleSBpZiBub3QgcHJlc2VudDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdhZGRfYmxhbmtfbm9kZV9pZl9taXNzaW5nJykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+V2Ugb25seSBnYXAtZmlsbCB0aGlzIEJsYW5rIE5vZGUgaWYgbm90IHByZXNlbnQuPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJpcy1tdC0xXCI+XG4gICAgICAgICAgICAgIEBpZiAobW9kZWwuY29uZmlnLnJ1bkFyZ3M/LnJ1bk5vbk1lYXN1cmVkICYmIGhhc01ldGhvZFRpZXIoZGF0YS5vcmlnaW5hbCwgRW1pc3Npb25NZXRob2RUaWVyLm1lYXN1cmVkKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcnVuLXdpdGgtbWVhc3VyZWRcIj5cbiAgICAgICAgICAgICAgICAgIFRoZVxuICAgICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgbW9kZWwuY29uZmlnLnZhbHVlIH19PC9jb2RlPlxuICAgICAgICAgICAgICAgICAgd2FzIHJlcG9ydGVkIGFzIG1lYXN1cmVkLlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKG1vZGVsLmxvZ3MubG9ncz8uaXNfZW1wdHkgPT09ICdGYWxzZScpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcnVuLW5vdC1lbXB0eVwiPlxuICAgICAgICAgICAgICBUaGUge3sgZGF0YS50eXBlIHx8ICdibGFuayBub2RlJyB9fSB3aXRoIFRlcm1cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgZGF0YS50ZXJtSWQgfX08L2NvZGU+XG4gICAgICAgICAgICAgIGlzIGFscmVhZHkgcHJlc2VudCBvciBhbHJlYWR5IGFkZGVkIGJ5IGFub3RoZXIgbW9kZWwuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xpPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxsaSBjbGFzcz1cImlzLXJ1bi1vcmNoZXN0cmF0b3JcIj5cbiAgICAgICAgICBAaWYgKG1vZGVsLmxvZ3M/LnNob3VsZFJ1bikge1xuICAgICAgICAgICAgPHA+QWxsIHRoZSByZXF1aXJlbWVudHMgd2VyZSBtZXQgdG8gcnVuIHRoZSBtb2RlbC48L3A+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoIW1vZGVsLmxvZ3M/LnNob3VsZFJ1bikge1xuICAgICAgICAgICAgPHA+U29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbm90IG1ldCB0byBydW4gdGhlIG1vZGVsLjwvcD5cbiAgICAgICAgICAgIDxwPllvdSBjYW4gY2xpY2sgb24gdGhlIG1vZGVsIG5hbWUgb24gdGhlIGxlZnQgdG8gdmlldyB0aGUgZGVidWdnaW5nIGxvZ3MuPC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKG1vZGVsLmxvZ3M/LmxvZ3M/LmVycm9yKSB7XG4gICAgICAgICAgICA8cD5UaGUgbW9kZWwgZmFpbGVkIHRvIHJ1biBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246PC9wPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxjb2RlPnt7IG1vZGVsLmxvZ3MubG9ncy5lcnJvciB9fTwvY29kZT5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgICBAaWYgKG1vZGVsLmxvZ3M/LnJlcGxhY2VMb3dlclRpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICBUaGUgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICA8Yj5tZXRob2RUaWVyPC9iPlxuICAgICAgICAgICAgd2FzXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIEBpZiAoIW1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllcikge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xIGlzLXVuZGVybGluZWRcIj5sb3dlciB0aGFuPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKG1vZGVsLmxvZ3MucmVwbGFjZUxvd2VyVGllcikge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xIGlzLXVuZGVybGluZWRcIj5oaWdoZXIgdGhhbiBvciBlcXVhbCB0bzwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+XG4gICAgICAgICAgICB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIDxiPm1ldGhvZFRpZXI8L2I+XG4gICAgICAgICAgICAuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgICAgQGlmIChtb2RlbC5sb2dzLnJlcGxhY2VMb3dlclRpZXIpIHtcbiAgICAgICAgPGxpIGNsYXNzPVwiaXMtbWVyZ2UtcmVwbGFjZUxvd2VyVGllclwiPlxuICAgICAgICAgIDxzcGFuPlRoZSByZWNhbGN1bGF0ZWQ8L3NwYW4+XG4gICAgICAgICAgPGIgY2xhc3M9XCJpcy1wbC0xXCI+e3sgbW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnIH19PC9iPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPndhczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5cbiAgICAgICAgICAgIEBpZiAobW9kZWwuY29uZmlnPy5tZXJnZUFyZ3MpIHtcbiAgICAgICAgICAgICAgQGlmICghbW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCI+bGVzcyB0aGFuPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAobW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCI+bW9yZSB0aGFuIG9yIGVxdWFsIHRvPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsLmNvbmZpZy5tZXJnZUFyZ3MucmVwbGFjZVRocmVzaG9sZFsxXSAqIDEwMCB9fSU8L2I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFtb2RlbC5jb25maWc/Lm1lcmdlQXJncykge1xuICAgICAgICAgICAgICBAaWYgKCFtb2RlbC5sb2dzLnJlcGxhY2VUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXVuZGVybGluZWRcIj5ub3Qgc3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAobW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCI+c3VmZmljaWVudGx5PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPmRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbDwvc3Bhbj5cbiAgICAgICAgICA8YiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbC5jb25maWc/Lm1lcmdlQXJncz8ucmVwbGFjZVRocmVzaG9sZD8uWzBdIHx8ICd2YWx1ZScgfX0uPC9iPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZG9jc0xpbmsgbGV0LW1vZGVsPlxuICA8YSBbaHJlZl09XCJtb2RlbC5hcGlEb2NzUGF0aCB8fCBtb2RlbC5kb2NQYXRoIHx8IG1vZGVsLnBhdGhcIiB0YXJnZXQ9XCJfYmxhbmtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPHNwYW4+RG9jczwvc3Bhbj5cbiAgICA8ZmEtaWNvbiBjbGFzcz1cIm1sLTFcIiBbaWNvbl09XCJmYUV4dGVybmFsTGlua0FsdFwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgPC9hPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
349
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZS9ub2RlLWxvZ3MtbW9kZWxzL25vZGUtbG9ncy1tb2RlbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBYyxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixrQkFBa0IsRUFJbEIsUUFBUSxFQUNSLFlBQVksRUFFWixvQkFBb0IsRUFDcEIsNEJBQTRCLEVBQzVCLGlCQUFpQixFQUNqQix1QkFBdUIsRUFFdkIsbUJBQW1CLEVBQ3BCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFD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QVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRVMsUUFBUSxDQUFDLEVBQVU7UUFDM0IsT0FBTyxDQUNMLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNyQjtnQkFDQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3RCLEtBQUssRUFBRSxFQUFFO2dCQUNULElBQUksRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FDbEIsQ0FBQztJQUNKLENBQUM7OEdBOVNVLHVCQUF1QjtrR0FBdkIsdUJBQXVCLCt6Q0NyUnBDLDBwK0JBNnlCQSxxN0JENWlCSSxlQUFlLGtQQUNmLGtCQUFrQixzR0FDbEIsV0FBVyxneUJBQ1gsWUFBWSxzVUFDWixpQkFBaUIsNEdBQ2pCLDRCQUE0Qix5SEFDNUIsZ0JBQWdCLG9KQUNoQixVQUFVLDJVQUNWLGtCQUFrQiwySUFDbEIsWUFBWSw0Q0FDWixXQUFXLDJDQUNYLFFBQVEsd0NBQ1IsYUFBYSw2Q0FDYixjQUFjLDhDQUNkLGFBQWEsNkNBQ2IsU0FBUyx5Q0FDVCxXQUFXLDJDQUNYLFlBQVk7OzJGQUdILHVCQUF1QjtrQkEzQm5DLFNBQVM7K0JBQ0UscUJBQXFCLG1CQUdkLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQiw0QkFBNEI7d0JBQzVCLGdCQUFnQjt3QkFDaEIsVUFBVTt3QkFDVixrQkFBa0I7d0JBQ2xCLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxRQUFRO3dCQUNSLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsV0FBVzt3QkFDWCxZQUFZO3FCQUNiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgU2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwsIHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIGZvcmtKb2luLCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3QsIGZpbHRlciwgcmVkdWNlLCB0b0FycmF5LCBtYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtZXJnZU1hcCwgdGFwLCBtZXJnZUFsbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEJsYW5rTm9kZXNLZXksXG4gIEN5Y2xlRnVuY3Rpb25hbFVuaXQsXG4gIEVtaXNzaW9uTWV0aG9kVGllcixcbiAgSUN5Y2xlSlNPTkxELFxuICBJVGVybUpTT05MRCxcbiAgSlNPTkxELFxuICBOb2RlVHlwZSxcbiAgVGVybVRlcm1UeXBlLFxuICBibGFua05vZGVzS2V5LFxuICBlbWlzc2lvblRlcm1UZXJtVHlwZSxcbiAgaW1wYWN0QXNzZXNzbWVudFRlcm1UZXJtVHlwZSxcbiAgaW5wdXRUZXJtVGVybVR5cGUsXG4gIG1lYXN1cmVtZW50VGVybVRlcm1UeXBlLFxuICBub25CbGFua05vZGVzS2V5LFxuICBwcm9kdWN0VGVybVRlcm1UeXBlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGlzVW5kZWZpbmVkLCBrZXlUb0xhYmVsLCB1bmlxdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IGxvYWRSZXNvdXJjZUtleSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvZ2xvc3NhcnknO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHsgTmdiVHlwZWFoZWFkLCBOZ2JQb3BvdmVyIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGYUljb25Db21wb25lbnQgfSBmcm9tICdAZm9ydGF3ZXNvbWUvYW5ndWxhci1mb250YXdlc29tZSc7XG5pbXBvcnQge1xuICBJY29uRGVmaW5pdGlvbixcbiAgZmFBbmdsZURvd24sXG4gIGZhQW5nbGVSaWdodCxcbiAgZmFDaGVjayxcbiAgZmFDaXJjbGUsXG4gIGZhRG90Q2lyY2xlLFxuICBmYUV4Y2xhbWF0aW9uVHJpYW5nbGUsXG4gIGZhRXh0ZXJuYWxMaW5rQWx0LFxuICBmYVNwaW5uZXIsXG4gIGZhVGltZXNcbn0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IGZhQ2xvbmUgYXMgZmFyQ2xvbmUsIGZhQ2lyY2xlIGFzIGZhckNpcmNsZSB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXJlZ3VsYXItc3ZnLWljb25zJztcblxuaW1wb3J0IHsgYmFzZVVybCwgaXNFeHRlcm5hbCwgdHlwZWFoZWFkRm9jdXMgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHtcbiAgYmxhbmtOb2Rlc1R5cGVWYWx1ZSxcbiAgbm9uQmxhbmtOb2Rlc1R5cGVWYWx1ZSxcbiAgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlLFxuICBJQmxhbmtOb2RlTG9nLFxuICBMb2dTdGF0dXMsXG4gIElDb25maWdNb2RlbCxcbiAgZ3JvdXBMb2dzQnlNb2RlbCxcbiAgZ3JvdXBMb2dzQnlUZXJtLFxuICBtb2RlbENvdW50LFxuICBjb21wdXRlVGVybXMsXG4gIGxvZ1ZhbHVlQXJyYXksXG4gIElOb2RlVGVybUxvZ3MsXG4gIElOb2RlTG9ncyxcbiAgZ3JvdXBkTG9nc0J5S2V5LFxuICBJTm9uQmxhbmtOb2RlTG9nLFxuICBJTG9nLFxuICBjb21wdXRlS2V5c1xufSBmcm9tICcuL25vZGUtbG9ncy1tb2RlbHMubW9kZWwnO1xuaW1wb3J0IHsgSUpTT05Ob2RlLCBIZU5vZGVTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IG5vZGVWZXJzaW9uIH0gZnJvbSAnLi4vbm9kZS1tb2RlbC12ZXJzaW9uJztcbmltcG9ydCB7IEhlRW5naW5lU2VydmljZSwgSU1vZGVsLCBJT3JjaGVzdHJhdG9yQ29uZmlnLCBmaW5kT3JjaGVzdHJhdG9yTW9kZWwgfSBmcm9tICcuLi8uLi9lbmdpbmUvZW5naW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hFeGFjdFF1ZXJ5LCBtYXRjaElkLCBtYXRjaFRlcm1UeXBlLCBtYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IEhlU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyB0ZXJtVHlwZUxhYmVsIH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMubW9kZWwnO1xuaW1wb3J0IHsgSXNPYmplY3RQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2lzLW9iamVjdC5waXBlJztcbmltcG9ydCB7IElzQXJyYXlQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2lzLWFycmF5LnBpcGUnO1xuaW1wb3J0IHsgVGltZXNQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3RpbWVzLnBpcGUnO1xuaW1wb3J0IHsgUHJlY2lzaW9uUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9wcmVjaXNpb24ucGlwZSc7XG5pbXBvcnQgeyBLZXlUb0xhYmVsUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9rZXktdG8tbGFiZWwucGlwZSc7XG5pbXBvcnQgeyBQbHVyYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3BsdXJhbGl6ZS5waXBlJztcbmltcG9ydCB7IEtleXNQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2tleXMucGlwZSc7XG5pbXBvcnQgeyBEZWZhdWx0UGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWZhdWx0LnBpcGUnO1xuaW1wb3J0IHsgQ29tcG91bmRQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvdW5kLnBpcGUnO1xuaW1wb3J0IHsgQ2xpcGJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2NsaXBib2FyZC9jbGlwYm9hcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEJsYW5rTm9kZVZhbHVlRGVsdGFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS12YWx1ZS1kZWx0YS9ibGFuay1ub2RlLXZhbHVlLWRlbHRhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlTGlua0NvbXBvbmVudCB9IGZyb20gJy4uL25vZGUtbGluay9ub2RlLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkRGVlcCB9IGZyb20gJy4uLy4uL2NvbW1vbi9yeGpzLXV0aWxzJztcblxuaW50ZXJmYWNlIElUZXJtc0J5SWRNYXBwaW5nIHtcbiAgW2lkOiBzdHJpbmddOiBJVGVybUpTT05MRDtcbn1cblxuY29uc3Qgbm9kZVR5cGUgPSAobm9kZT86IElKU09OTm9kZSkgPT4gbm9kZT8uWydAdHlwZSddIHx8IG5vZGU/LnR5cGU7XG5jb25zdCBub2RlSWQgPSAobm9kZT86IElKU09OTm9kZSkgPT4gbm9kZT8uWydAaWQnXSB8fCBub2RlPy5pZDtcbmNvbnN0IG5vZGVUeXBlc0xvd2VyQ2FzZSA9IE9iamVjdC52YWx1ZXMoTm9kZVR5cGUpLm1hcCh2ID0+IHYudG9Mb3dlckNhc2UoKSk7XG5cbmNvbnN0IGxvZ0ljb246IHtcbiAgW3N0YXR1cyBpbiBMb2dTdGF0dXNdPzogSWNvbkRlZmluaXRpb247XG59ID0ge1xuICBbTG9nU3RhdHVzLnN1Y2Nlc3NdOiBmYUNoZWNrLFxuICBbTG9nU3RhdHVzLmVycm9yXTogZmFUaW1lcyxcbiAgW0xvZ1N0YXR1cy5za2lwSGllcmFyY2h5XTogZmFyQ2lyY2xlLFxuICBbTG9nU3RhdHVzLmRhdGFQcm92aWRlZF06IGZhQ2lyY2xlLFxuICBbTG9nU3RhdHVzLm5vdFJlcXVpcmVkXTogZmFEb3RDaXJjbGVcbn07XG5cbmNvbnN0IGxvZ0NvbG9yOiB7XG4gIFtzdGF0dXMgaW4gTG9nU3RhdHVzXT86IHN0cmluZztcbn0gPSB7XG4gIFtMb2dTdGF0dXMuc3VjY2Vzc106ICdzdWNjZXNzJyxcbiAgW0xvZ1N0YXR1cy5lcnJvcl06ICdkYW5nZXInLFxuICBbTG9nU3RhdHVzLnNraXBIaWVyYXJjaHldOiAnZGFyaycsXG4gIFtMb2dTdGF0dXMuZGF0YVByb3ZpZGVkXTogJ2RhcmsnLFxuICBbTG9nU3RhdHVzLm5vdFJlcXVpcmVkXTogJ2dyZXknXG59O1xuXG5jb25zdCBzaG91bGRTaG93QmxhbmtOb2RlID0gKGJsYW5rTm9kZUxvZzogSUJsYW5rTm9kZUxvZykgPT5cbiAgW1xuICAgIGJsYW5rTm9kZUxvZz8uY29uZmlnTW9kZWxzPy5sZW5ndGgsXG4gICAgYmxhbmtOb2RlTG9nPy5rZXlzPy5sZW5ndGgsXG4gICAgYmxhbmtOb2RlTG9nPy5zdWJWYWx1ZXM/Lmxlbmd0aCxcbiAgICBibGFua05vZGVMb2c/Lm9yaWdpbmFsPy5sZW5ndGgsXG4gICAgYmxhbmtOb2RlTG9nPy5yZWNhbGN1bGF0ZWQ/Lmxlbmd0aFxuICBdLnNvbWUoQm9vbGVhbik7XG5cbmNvbnN0IG1ldGhvZElkTGFiZWwgPSAobWV0aG9kSWQ6IHN0cmluZywgX21vZGVsPzogSU1vZGVsKSA9PlxuICAobWV0aG9kSWRcbiAgICA/IHtcbiAgICAgICAgJ2N5Y2xlL3RyYW5zZm9ybWF0aW9uJzogJ0RhdGEgRnJvbSBUcmFuc2Zvcm1hdGlvbicsXG4gICAgICAgIGltcGFjdF9hc3Nlc3NtZW50OiAnRGF0YSBGcm9tIEN5Y2xlJ1xuICAgICAgfVttZXRob2RJZF1cbiAgICA6ICcnKSB8fCAobWV0aG9kSWQuaW5jbHVkZXMoJy8nKSA/IG1ldGhvZElkLnNwbGl0KCcvJylbMF0gOiBrZXlUb0xhYmVsKG1ldGhvZElkKSk7XG5cbmNvbnN0IGdldE1vZGVsc0F0ID0gKGxvZzogSUJsYW5rTm9kZUxvZ1N1YlZhbHVlIHwgSUJsYW5rTm9kZUxvZywgaW5kZXg6IG51bWJlcikgPT5cbiAgKCdtb2RlbHNJblN1YlZhbHVlcycgaW4gbG9nID8gIWxvZy5tb2RlbHNJblN1YlZhbHVlcyB8fCAhbG9nLmlzT3BlbiA6IHRydWUpICYmIGxvZy5jb25maWdNb2RlbHNbaW5kZXhdO1xuXG5jb25zdCByZXF1aXJlbWVudEtleXMgPSAocmVxdWlyZW1lbnRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PlxuICBPYmplY3Qua2V5cyhyZXF1aXJlbWVudHMpLmZpbHRlcihrID0+ICFub2RlVHlwZXNMb3dlckNhc2UuaW5jbHVkZXMoaykgJiYgIVsnbW9kZWxfa2V5J10uaW5jbHVkZXMoaykpO1xuXG5jb25zdCByZXF1aXJlbWVudENvbG9yID0gKHZhbHVlOiBhbnkpID0+ICghdmFsdWUgfHwgWydOb25lJywgJ0ZhbHNlJywgJzAnLCAnMC4wJ10uaW5jbHVkZXModmFsdWUpID8gJ2RhbmdlcicgOiAnd2hpdGUnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXk6IHtcbiAgW2tleTogc3RyaW5nXTogKHZhbHVlOiBzdHJpbmcpID0+IFBhcnRpYWw8SlNPTkxEPE5vZGVUeXBlPj47XG59ID0ge1xuICByZWxhdGVkX2N5Y2xlczogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSwgJ0BpZCc6IHYgfSksXG4gIGN5Y2xlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLCAnQGlkJzogdiB9KSxcbiAgaW1wYWN0X2Fzc2Vzc21lbnRfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCwgJ0BpZCc6IHYgfSksXG4gIHNpdGVfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuU2l0ZSwgJ0BpZCc6IHYgfSksXG4gIHNvdXJjZV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsICdAaWQnOiB2IH0pLFxuICBwcm9wZXJ0eV9pZDogdiA9PiAoeyAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLCAnQGlkJzogdiB9KSxcbiAgaW5wdXRfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSksXG4gIHByb2R1Y3RfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSksXG4gIHByYWN0aWNlX2lkOiB2ID0+ICh7ICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiB2IH0pLFxuICBjcm9wX3Byb2R1Y3RfaWQ6IHYgPT4gKHsgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IHYgfSlcbn07XG5cbmNvbnN0IHJlcXVpcmVtZW50TGlua2VkTm9kZSA9IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT5cbiAga2V5IGluIHJlcXVpcmVtZW50TGlua2VkTm9kZUJ5S2V5ICYmICFbJ05vbmUnLCAnJywgbnVsbF0uaW5jbHVkZXModmFsdWUpXG4gICAgPyBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyB2YWx1ZS5tYXAodiA9PiByZXF1aXJlbWVudExpbmtlZE5vZGUoa2V5LCB2KSlcbiAgICAgIDogcmVxdWlyZW1lbnRMaW5rZWROb2RlQnlLZXlba2V5XSh2YWx1ZSlcbiAgICA6IG51bGw7XG5cbmNvbnN0IGlzU3lzdGVtQm91bmRhcnkgPVxuICAodGVybUlkPzogc3RyaW5nKSA9PlxuICAoeyBpc1JlY2FsY3VsYXRlZCwgaXNSZXF1aXJlZCB9OiBQaWNrPElMb2cgfCBJQmxhbmtOb2RlTG9nU3ViVmFsdWUsICdpc1JlY2FsY3VsYXRlZCcgfCAnaXNSZXF1aXJlZCc+KSA9PiB7XG4gICAgLy8gb25seSBleGlzdHMgZm9yIHNvbWUgdGVybXNcbiAgICBjb25zdCBpblN5c3RlbUJvdW5kYXJ5ID0gbG9hZFJlc291cmNlS2V5KCdpbkhlc3RpYURlZmF1bHRTeXN0ZW1Cb3VuZGFyeS5qc29uJywgdGVybUlkKTtcbiAgICByZXR1cm4gIWluU3lzdGVtQm91bmRhcnkgPyBbaXNSZWNhbGN1bGF0ZWQsIGlzUmVxdWlyZWRdLnNvbWUoQm9vbGVhbikgOiBgJHtpblN5c3RlbUJvdW5kYXJ5fWAgPT09ICd0cnVlJztcbiAgfTtcblxuY29uc3QgaXNHZW5lcmljVGVybSA9ICh0ZXJtSWQ6IHN0cmluZykgPT4gW3Rlcm1JZC5zdGFydHNXaXRoKCdleGNyZXRhJyldLmV2ZXJ5KEJvb2xlYW4pO1xuXG5jb25zdCBleHRyYVRlcm1JZHNGcm9tQ29uZmlnID0gKGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZywga2V5OiBibGFua05vZGVzS2V5LCBsb2dzOiBJTm9kZUxvZ3MgfCBJTm9kZVRlcm1Mb2dzKSA9PlxuICB1bmlxdWUoW1xuICAgIC4uLihjb25maWc/Lm1vZGVscyB8fCBbXSlcbiAgICAgIC5mbGF0KClcbiAgICAgIC5maWx0ZXIobSA9PiBtLmtleSA9PT0ga2V5KVxuICAgICAgLm1hcChtID0+IG0udmFsdWUpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZmlsdGVyKHYgPT4gIWlzR2VuZXJpY1Rlcm0odikpLFxuICAgIC8vIG1hdGNoIGxvZ3Mgd2l0aCBhIGNvbmZpZ3VyYXRpb25cbiAgICAuLi5PYmplY3QuZW50cmllcyhsb2dzIHx8IHt9KVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtfaWQsIHZhbHVlXSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXModmFsdWUpLnNvbWUoKFttb2RlbCwgdl06IFttb2RlbDogc3RyaW5nLCB2YWx1ZTogYW55XSkgPT5cbiAgICAgICAgICAgIGZpbmRPcmNoZXN0cmF0b3JNb2RlbChjb25maWcsIHsga2V5LCBtb2RlbCwgdmFsdWU6IHYubW9kZWxfa2V5IH0pXG4gICAgICAgICAgKVxuICAgICAgKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSlcbiAgXSk7XG5cbi8qKlxuICogRXh0ZW5kIHRlcm1zIGJ5IGZpbmRpbmcgYWxsIHRlcm1zIGluIHRob3NlIGB0ZXJtVHlwZWAuXG4gKi9cbmNvbnN0IG1hdGNoVGVybVR5cGVGcm9tS2V5OiB7XG4gIFtrZXkgaW4gQmxhbmtOb2Rlc0tleV0/OiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIC8vIEN5Y2xlXG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IGVtaXNzaW9uVGVybVRlcm1UeXBlLnRlcm0sXG4gIC8vIFNpdGVcbiAgW0JsYW5rTm9kZXNLZXkubWVhc3VyZW1lbnRzXTogbWVhc3VyZW1lbnRUZXJtVGVybVR5cGUudGVybSxcbiAgLy8gSW1wYWN0QXNzZXNzbWVudFxuICAvLyBkaXNhYmxlZCBhcyBpdCB3aWxsIHNob3cgdGVybXMgaW4gYm90aCBgZW1pc3Npb25zYCBhbmQgYHJlc291cmNlVXNlYCBjYXRlZ29yaWVzLCBzZWUgaXNzdWUgIzI3M1xuICAvLyBlbWlzc2lvbnNSZXNvdXJjZVVzZTogaW1wYWN0QXNzZXNzbWVudFRlcm1UZXJtVHlwZS5lbWlzc2lvbnNSZXNvdXJjZVVzZS50ZXJtLFxuICBbQmxhbmtOb2Rlc0tleS5pbXBhY3RzXTogaW1wYWN0QXNzZXNzbWVudFRlcm1UZXJtVHlwZS5pbXBhY3RzLnRlcm0sXG4gIFtCbGFua05vZGVzS2V5LmVuZHBvaW50c106IGltcGFjdEFzc2Vzc21lbnRUZXJtVGVybVR5cGUuZW5kcG9pbnRzLnRlcm1cbn07XG5cbi8qKlxuICogUmVzdHJpY3QgdGVybXMgZm91bmQgaW4gdGhlIGxvZ3MgYnkgdGhlc2UgYHRlcm1UeXBlYC5cbiAqL1xuY29uc3QgcmVzdHJpY3RUZXJtVHlwZUZyb21LZXk6IHtcbiAgW2tleSBpbiBCbGFua05vZGVzS2V5XT86IFRlcm1UZXJtVHlwZVtdO1xufSA9IHtcbiAgW0JsYW5rTm9kZXNLZXkuaW5wdXRzXTogaW5wdXRUZXJtVGVybVR5cGUudGVybSxcbiAgW0JsYW5rTm9kZXNLZXkucHJvZHVjdHNdOiBwcm9kdWN0VGVybVRlcm1UeXBlLnRlcm0sXG4gIC4uLm1hdGNoVGVybVR5cGVGcm9tS2V5XG59O1xuXG5jb25zdCBmaWx0ZXJCbGFua05vZGUgPSAoXG4gIHsgdGVybTogeyBuYW1lLCAnQGlkJzogaWQgfSwgc3ViVmFsdWVzLCAuLi5sb2cgfTogSUJsYW5rTm9kZUxvZyxcbiAgc2VsZWN0ZWRUZXJtPzogc3RyaW5nLFxuICBmaWx0ZXJUZXJtVHlwZXM/OiBUZXJtVGVybVR5cGVbXSxcbiAgb25seVJlcXVpcmVkPzogYm9vbGVhblxuKSA9PlxuICBzZWxlY3RlZFRlcm1cbiAgICA/IG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWxlY3RlZFRlcm0udG9Mb3dlckNhc2UoKSlcbiAgICA6ICFmaWx0ZXJUZXJtVHlwZXM/Lmxlbmd0aCB8fCAhb25seVJlcXVpcmVkIHx8IGlzU3lzdGVtQm91bmRhcnkoaWQpKGxvZykgfHwgc3ViVmFsdWVzLnNvbWUoaXNTeXN0ZW1Cb3VuZGFyeShpZCkpO1xuXG5jb25zdCB0ZXJtU2VhcmNoID0gKHRlcm0gPSAnJykgPT4gdGVybS5yZXBsYWNlKC9bLFxcc10vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbmNvbnN0IGxpc3RUZXJtSWQgPSAodGVybXM6IElUZXJtSlNPTkxEW10pID0+XG4gIHRlcm1zXG4gICAgLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpXG4gICAgLnNvcnQoKVxuICAgIC5qb2luKCcsJyk7XG5cbmNvbnN0IGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4ID0gJ19jb21wbGV0ZSc7XG5jb25zdCBjb21wbGV0ZW5lc3NJbmNvbXBsZXRlU3VmZml4ID0gJ19pbmNvbXBsZXRlJztcbmNvbnN0IHBhcnNlTG9nQ29tcGxldGVuZXNzID0gKGtleTogc3RyaW5nKSA9PlxuICBbXG4gICAga2V5LnN0YXJ0c1dpdGgoJ3Rlcm1fdHlwZV8nKSxcbiAgICBrZXkuZW5kc1dpdGgoY29tcGxldGVuZXNzQ29tcGxldGVTdWZmaXgpIHx8IGtleS5lbmRzV2l0aChjb21wbGV0ZW5lc3NJbmNvbXBsZXRlU3VmZml4KVxuICBdLmV2ZXJ5KEJvb2xlYW4pXG4gICAgPyB7XG4gICAgICAgIGtleToga2V5XG4gICAgICAgICAgLnJlcGxhY2UoJ3Rlcm1fdHlwZV8nLCAnJylcbiAgICAgICAgICAucmVwbGFjZShjb21wbGV0ZW5lc3NDb21wbGV0ZVN1ZmZpeCwgJycpXG4gICAgICAgICAgLnJlcGxhY2UoY29tcGxldGVuZXNzSW5jb21wbGV0ZVN1ZmZpeCwgJycpLFxuICAgICAgICB2YWx1ZToga2V5LmVuZHNXaXRoKGNvbXBsZXRlbmVzc0NvbXBsZXRlU3VmZml4KVxuICAgICAgfVxuICAgIDogbnVsbDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtbm9kZS1sb2dzLW1vZGVscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZhSWNvbkNvbXBvbmVudCxcbiAgICBEYXRhVGFibGVDb21wb25lbnQsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTmdiVHlwZWFoZWFkLFxuICAgIE5vZGVMaW5rQ29tcG9uZW50LFxuICAgIEJsYW5rTm9kZVZhbHVlRGVsdGFDb21wb25lbnQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBOZ2JQb3BvdmVyLFxuICAgIENsaXBib2FyZENvbXBvbmVudCxcbiAgICBDb21wb3VuZFBpcGUsXG4gICAgRGVmYXVsdFBpcGUsXG4gICAgS2V5c1BpcGUsXG4gICAgUGx1cmFsaXplUGlwZSxcbiAgICBLZXlUb0xhYmVsUGlwZSxcbiAgICBQcmVjaXNpb25QaXBlLFxuICAgIFRpbWVzUGlwZSxcbiAgICBJc0FycmF5UGlwZSxcbiAgICBJc09iamVjdFBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTG9nc01vZGVsc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgbm9kZVNlcnZpY2UgPSBpbmplY3QoSGVOb2RlU2VydmljZSk7XG4gIHByaXZhdGUgc2VhcmNoU2VydmljZSA9IGluamVjdChIZVNlYXJjaFNlcnZpY2UpO1xuICBwcml2YXRlIGVuZ2luZVNlcnZpY2UgPSBpbmplY3QoSGVFbmdpbmVTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFFeHRlcm5hbExpbmtBbHQgPSBmYUV4dGVybmFsTGlua0FsdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRXhjbGFtYXRpb25UcmlhbmdsZSA9IGZhRXhjbGFtYXRpb25UcmlhbmdsZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhVGltZXMgPSBmYVRpbWVzO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFBbmdsZURvd24gPSBmYUFuZ2xlRG93bjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhQW5nbGVSaWdodCA9IGZhQW5nbGVSaWdodDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhU3Bpbm5lciA9IGZhU3Bpbm5lcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhckNsb25lID0gZmFyQ2xvbmU7XG5cbiAgcHJvdGVjdGVkIG5vZGUgPSBpbnB1dC5yZXF1aXJlZDxJSlNPTk5vZGU+KCk7XG4gIHByaXZhdGUgbm9kZSQgPSB0b09ic2VydmFibGUodGhpcy5ub2RlKTtcbiAgcHJpdmF0ZSBkYXRhJCA9IHRoaXMubm9kZSQucGlwZShcbiAgICBmaWx0ZXIobm9kZSA9PiAhaXNVbmRlZmluZWQobm9kZSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkRGVlcCgpLFxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KHRydWUpKSxcbiAgICBtZXJnZU1hcChub2RlID0+XG4gICAgICBmb3JrSm9pbih7XG4gICAgICAgIGxvZ3M6IHRoaXMubm9kZVNlcnZpY2UuZ2V0TG9nKHsgLi4ubm9kZSwgZGF0YVN0YXRlOiBEYXRhU3RhdGUucmVjYWxjdWxhdGVkIH0pLFxuICAgICAgICBjb25maWc6IHRoaXMuZW5naW5lU2VydmljZS5vY2hlc3RyYXRvckNvbmZpZyQobm9kZVR5cGUobm9kZSksIG5vZGVJZChub2RlKSlcbiAgICAgIH0pXG4gICAgKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nLnNldChmYWxzZSkpXG4gICk7XG5cbiAgcHJvdGVjdGVkIG5vZGVLZXkgPSBpbnB1dC5yZXF1aXJlZDxibGFua05vZGVzS2V5IHwgbm9uQmxhbmtOb2Rlc0tleT4oKTtcbiAgcHJvdGVjdGVkIG9yaWdpbmFsVmFsdWVzID0gaW5wdXQoW10gYXMgYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdIHwgbm9uQmxhbmtOb2Rlc1R5cGVWYWx1ZSk7XG4gIHByb3RlY3RlZCByZWNhbGN1bGF0ZWRWYWx1ZXMgPSBpbnB1dChbXSBhcyBibGFua05vZGVzVHlwZVZhbHVlW10gfCBub25CbGFua05vZGVzVHlwZVZhbHVlKTtcbiAgcHJvdGVjdGVkIHRlcm1zID0gaW5wdXQoW10gYXMgSVRlcm1KU09OTERbXSk7XG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtVHlwZXMgPSBpbnB1dChbXSBhcyBUZXJtVGVybVR5cGVbXSk7XG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtVHlwZXNMYWJlbCA9IGlucHV0KCcnKTtcbiAgcHJvdGVjdGVkIGxvZ3NLZXkgPSBpbnB1dCgnJyk7XG4gIHByb3RlY3RlZCBub0RhdGFNZXNzYWdlID0gaW5wdXQoJycpO1xuXG4gIHByb3RlY3RlZCBiYXNlVXJsID0gYmFzZVVybCgpO1xuICBwcm90ZWN0ZWQgaXNFeHRlcm5hbCA9IGlzRXh0ZXJuYWwoKTtcbiAgcHJvdGVjdGVkIEN5Y2xlRnVuY3Rpb25hbFVuaXQgPSBDeWNsZUZ1bmN0aW9uYWxVbml0O1xuICBwcm90ZWN0ZWQgRW1pc3Npb25NZXRob2RUaWVyID0gRW1pc3Npb25NZXRob2RUaWVyO1xuICBwcm90ZWN0ZWQgTG9nU3RhdHVzID0gTG9nU3RhdHVzO1xuICBwcm90ZWN0ZWQgbG9nSWNvbiA9IGxvZ0ljb247XG4gIHByb3RlY3RlZCBsb2dDb2xvciA9IGxvZ0NvbG9yO1xuICBwcm90ZWN0ZWQgZ2V0TW9kZWxzQXQgPSBnZXRNb2RlbHNBdDtcbiAgcHJvdGVjdGVkIHJlcXVpcmVtZW50S2V5cyA9IHJlcXVpcmVtZW50S2V5cztcbiAgcHJvdGVjdGVkIHJlcXVpcmVtZW50Q29sb3IgPSByZXF1aXJlbWVudENvbG9yO1xuICBwcm90ZWN0ZWQgbG9nVmFsdWVBcnJheSA9IGxvZ1ZhbHVlQXJyYXk7XG4gIHByb3RlY3RlZCByZXF1aXJlbWVudExpbmtlZE5vZGUgPSByZXF1aXJlbWVudExpbmtlZE5vZGU7XG4gIHByb3RlY3RlZCBpc1N5c3RlbUJvdW5kYXJ5ID0gaXNTeXN0ZW1Cb3VuZGFyeTtcbiAgcHJvdGVjdGVkIHBhcnNlTG9nQ29tcGxldGVuZXNzID0gcGFyc2VMb2dDb21wbGV0ZW5lc3M7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsKHRydWUpO1xuICBwcm90ZWN0ZWQgc2hvd0xlZ2VuZCA9IHRydWU7XG5cbiAgcHJvdGVjdGVkIG9ubHlSZXF1aXJlZCA9IHNpZ25hbCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgZmlsdGVyZWRUeXBlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5maWx0ZXJUZXJtVHlwZXNMYWJlbCgpIHx8IHRoaXMuZmlsdGVyVGVybVR5cGVzKCk/Lm1hcCh0ZXJtVHlwZUxhYmVsKS5qb2luKCcgJiAnKVxuICApO1xuICBwcm90ZWN0ZWQgZnVuY3Rpb25hbFVuaXQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5ub2RlKCkgYXMgSUN5Y2xlSlNPTkxEKT8uZnVuY3Rpb25hbFVuaXQpO1xuXG4gIHByb3RlY3RlZCBsb2dzVXJsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ub2RlU2VydmljZS5ub2RlTG9nc1VybCh0aGlzLm5vZGUoKSkpO1xuICBwcm90ZWN0ZWQgbm9kZVR5cGUgPSBjb21wdXRlZCgoKSA9PiBub2RlVHlwZSh0aGlzLm5vZGUoKSkpO1xuICBwcml2YXRlIG5vZGVJZCA9IGNvbXB1dGVkKCgpID0+IG5vZGVJZCh0aGlzLm5vZGUoKSkpO1xuICBwcml2YXRlIGNvbmZpZyA9IHNpZ25hbCh1bmRlZmluZWQgYXMgSU9yY2hlc3RyYXRvckNvbmZpZyk7XG5cbiAgcHJpdmF0ZSBhbGxMb2dzID0gc2lnbmFsKCcnKTtcbiAgcHJpdmF0ZSBncm91cGVkTG9ncyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmFsbExvZ3MoKSA/IGdyb3VwTG9nc0J5TW9kZWwodGhpcy5hbGxMb2dzKCkpIDoge30pKTtcbiAgcHJpdmF0ZSBsb2dzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubG9nc0tleSgpID8gdGhpcy5ncm91cGVkTG9ncygpPy5bdGhpcy5sb2dzS2V5KCldIDogdGhpcy5ncm91cGVkTG9ncygpKSB8fCB7fSk7XG5cbiAgcHJpdmF0ZSBhbGxCbGFua05vZGVzID0gc2lnbmFsKFtdIGFzIChJQmxhbmtOb2RlTG9nIHwgSU5vbkJsYW5rTm9kZUxvZylbXSk7XG4gIHByb3RlY3RlZCBibGFua05vZGVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmFsbEJsYW5rTm9kZXMoKS5maWx0ZXIoXG4gICAgICBsb2cgPT4gISgndGVybScgaW4gbG9nKSB8fCBmaWx0ZXJCbGFua05vZGUobG9nLCB0aGlzLnRlcm0oKSwgdGhpcy5maWx0ZXJUZXJtVHlwZXMoKSwgdGhpcy5vbmx5UmVxdWlyZWQoKSlcbiAgICApXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlzQmxhbmtOb2RlcyA9IGNvbXB1dGVkKFxuICAgICgpID0+IEFycmF5LmlzQXJyYXkodGhpcy5vcmlnaW5hbFZhbHVlcygpKSB8fCBBcnJheS5pc0FycmF5KHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzKCkpXG4gICk7XG4gIHByb3RlY3RlZCBtZXRob2RNb2RlbHNDb3VudCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5hbGxCbGFua05vZGVzKCk/Lmxlbmd0aCAmJiAndGVybScgaW4gdGhpcy5hbGxCbGFua05vZGVzKClbMF1cbiAgICAgID8gbW9kZWxDb3VudCh0aGlzLmFsbEJsYW5rTm9kZXMoKSBhcyBJQmxhbmtOb2RlTG9nW10pXG4gICAgICA6IDFcbiAgKTtcblxuICBwcml2YXRlIGV4dHJhVGVybXNCeUlkcyA9IHNpZ25hbChbXSBhcyBJVGVybUpTT05MRFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBleHRyYVRlcm1UeXBlcyQgPSBmb3JrSm9pbih7XG4gICAgbm9kZUtleTogdG9PYnNlcnZhYmxlKHRoaXMubm9kZUtleSksXG4gICAgdGVybVR5cGVzOiB0b09ic2VydmFibGUodGhpcy5maWx0ZXJUZXJtVHlwZXMpXG4gIH0pLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHByaXZhdGUgZXh0cmFUZXJtc0J5VGVybVR5cGVzID0gc2lnbmFsKFtdIGFzIElUZXJtSlNPTkxEW10pO1xuICBwcml2YXRlIGV4dHJhVGVybXMgPSBjb21wdXRlZCgoKSA9PiBbLi4udGhpcy5leHRyYVRlcm1zQnlJZHMoKSwgLi4udGhpcy5leHRyYVRlcm1zQnlUZXJtVHlwZXMoKV0pO1xuICBwcml2YXRlIGFsbFRlcm1zID0gY29tcHV0ZWQoKCkgPT5cbiAgICBjb21wdXRlVGVybXMoXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzKCkgYXMgYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdLFxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMoKSBhcyBibGFua05vZGVzVHlwZVZhbHVlW10sXG4gICAgICB0aGlzLnRlcm1zKCksXG4gICAgICB0aGlzLmZpbHRlclRlcm1UeXBlcygpLFxuICAgICAgdGhpcy5leHRyYVRlcm1zKClcbiAgICApXG4gICk7XG5cbiAgcHJpdmF0ZSBtZXRob2RzQnlJZCA9IHRvU2lnbmFsKFxuICAgIHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgYm9vbDoge1xuICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pLCBtYXRjaFRlcm1UeXBlKFRlcm1UZXJtVHlwZS5tb2RlbCldXG4gICAgICB9XG4gICAgfSkucGlwZShcbiAgICAgIG1lcmdlQWxsKCksXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxuICAgICAgZGlzdGluY3QodiA9PiB2WydAaWQnXSksXG4gICAgICByZWR1Y2UoKHByZXYsIGN1cnIpID0+ICh7IC4uLnByZXYsIFtjdXJyWydAaWQnXV06IGN1cnIgfSksIHt9IGFzIElUZXJtc0J5SWRNYXBwaW5nKVxuICAgIClcbiAgKTtcblxuICBwcml2YXRlIHRlcm1zQnlJZCA9IHNpZ25hbCh7fSBhcyBJVGVybXNCeUlkTWFwcGluZyk7XG5cbiAgLy8gZnJvbSBgbW9kZWwtbGlua3MuanNvbmAgZmlsZVxuICBwcml2YXRlIGVuZ2luZU1vZGVscyA9IHRvU2lnbmFsKHRoaXMuZW5naW5lU2VydmljZS5hbGxNb2RlbHMkKCkpO1xuXG4gIHByb3RlY3RlZCBlbmdpbmVNb2RlbFZlcnNpb24gPSB0b1NpZ25hbCh0aGlzLmVuZ2luZVNlcnZpY2UubGF0ZXN0VmVyc2lvbiQpO1xuICBwcm90ZWN0ZWQgY3VycmVudE1vZGVsVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IG5vZGVWZXJzaW9uKHRoaXMubm9kZSgpKSk7XG4gIHByb3RlY3RlZCBzaG93T3V0ZGF0ZWRMb2dzID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBmaWx0ZXIgbGlzdCBvZiByZXN1bHRzIGJ5IGEgc2luZ2xlIFRlcm1cbiAgcHJvdGVjdGVkIHRlcm0gPSBzaWduYWwoJycpO1xuICBwcm90ZWN0ZWQgZW5hYmxlRmlsdGVyQnlUZXJtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hbGxUZXJtcygpPy5sZW5ndGggPiAwKTtcbiAgcHJvdGVjdGVkIHN1Z2dlc3RUZXJtID0gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCQucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtYXAodiA9PiB0aGlzLnN1Z2dlc3RCeVRlcm0odikpXG4gICAgKTtcblxuICBwcm90ZWN0ZWQgdHlwZWFoZWFkRm9jdXMgPSB0eXBlYWhlYWRGb2N1cztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRhdGEkLnN1YnNjcmliZSgoeyBsb2dzLCBjb25maWcgfSkgPT4ge1xuICAgICAgdGhpcy5jb25maWcuc2V0KGNvbmZpZyk7XG4gICAgICB0aGlzLmFsbExvZ3Muc2V0KGxvZ3MpO1xuICAgIH0pO1xuXG4gICAgY29tYmluZUxhdGVzdChbdG9PYnNlcnZhYmxlKHRoaXMubm9kZUtleSksIHRvT2JzZXJ2YWJsZSh0aGlzLmZpbHRlclRlcm1UeXBlcyldKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcih2YWx1ZXMgPT4gdmFsdWVzLmV2ZXJ5KHZhbHVlID0+ICFpc1VuZGVmaW5lZCh2YWx1ZSkpKSxcbiAgICAgICAgbWFwKChbbm9kZUtleSwgdGVybVR5cGVzXSkgPT4gWy4uLihtYXRjaFRlcm1UeXBlRnJvbUtleVtub2RlS2V5XSB8fCBbXSksIC4uLih0ZXJtVHlwZXMgfHwgW10pXSksXG4gICAgICAgIG1lcmdlTWFwKHZhbHVlcyA9PlxuICAgICAgICAgIHZhbHVlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IHRoaXMuc2VhcmNoVGVybXMoe1xuICAgICAgICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgICAgICAgIG11c3Q6IFttYXRjaFR5cGUoTm9kZVR5cGUuVGVybSldLFxuICAgICAgICAgICAgICAgICAgc2hvdWxkOiB2YWx1ZXMubWFwKG1hdGNoVGVybVR5cGUpLFxuICAgICAgICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG9mKFtdKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlcyA9PiB0aGlzLmV4dHJhVGVybXNCeVRlcm1UeXBlcy5zZXQodmFsdWVzKSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZGF0YSQucGlwZShtYXAoKHsgY29uZmlnIH0pID0+IGNvbmZpZykpLFxuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMubm9kZUtleSBhcyBTaWduYWw8YmxhbmtOb2Rlc0tleT4pLFxuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMubG9ncylcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcih2YWx1ZXMgPT4gdmFsdWVzLmV2ZXJ5KHZhbHVlID0+ICFpc1VuZGVmaW5lZCh2YWx1ZSkpKSxcbiAgICAgICAgbWFwKChbY29uZmlnLCBub2RlS2V5LCBsb2dzXSkgPT4gZXh0cmFUZXJtSWRzRnJvbUNvbmZpZyhjb25maWcsIG5vZGVLZXksIGxvZ3MpKSxcbiAgICAgICAgbWVyZ2VNYXAodmFsdWVzID0+XG4gICAgICAgICAgdmFsdWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gdGhpcy5zZWFyY2hUZXJtcyh7XG4gICAgICAgICAgICAgICAgYm9vbDoge1xuICAgICAgICAgICAgICAgICAgbXVzdDogW21hdGNoVHlwZShOb2RlVHlwZS5UZXJtKV0sXG4gICAgICAgICAgICAgICAgICBzaG91bGQ6IHZhbHVlcy5tYXAobWF0Y2hJZCksXG4gICAgICAgICAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogb2YoW10pXG4gICAgICAgICksXG4gICAgICAgIG1hcCh0ZXJtcyA9PlxuICAgICAgICAgIHRoaXMubm9kZUtleSgpIGluIHJlc3RyaWN0VGVybVR5cGVGcm9tS2V5XG4gICAgICAgICAgICA/IHRlcm1zLmZpbHRlcih0ZXJtID0+IHJlc3RyaWN0VGVybVR5cGVGcm9tS2V5W3RoaXMubm9kZUtleSgpXS5pbmNsdWRlcyh0ZXJtLnRlcm1UeXBlKSlcbiAgICAgICAgICAgIDogdGVybXNcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh2YWx1ZXMgPT4gdGhpcy5leHRyYVRlcm1zQnlJZHMuc2V0KHZhbHVlcykpO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBvZih0aGlzLmlzQmxhbmtOb2RlcygpKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1lcmdlTWFwKGlzQmxhbmtOb2RlcyA9PiAoaXNCbGFua05vZGVzID8gdGhpcy5sb2FkQmxhbmtOb2RlcygpIDogdGhpcy5sb2FkTm9uQmxhbmtOb2RlcygpKSlcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZXMgPT4gdGhpcy5hbGxCbGFua05vZGVzLnNldCh2YWx1ZXMpKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmxhbmtOb2RlcygpIHtcbiAgICByZXR1cm4gb2YodGhpcy5hbGxUZXJtcygpKS5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IGxpc3RUZXJtSWQocHJldikgIT09IGxpc3RUZXJtSWQoY3VycikpLFxuICAgICAgbWVyZ2VBbGwoKSxcbiAgICAgIG1hcChcbiAgICAgICAgZ3JvdXBMb2dzQnlUZXJtKFxuICAgICAgICAgIHRoaXMubm9kZVR5cGUoKSxcbiAgICAgICAgICB0aGlzLmxvZ3MoKSxcbiAgICAgICAgICB0aGlzLmVuZ2luZU1vZGVscygpLFxuICAgICAgICAgIHRoaXMuY29uZmlnKCksXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpIGFzIGJsYW5rTm9kZXNUeXBlVmFsdWVbXSxcbiAgICAgICAgICB0aGlzLnJlY2FsY3VsYXRlZFZhbHVlcygpIGFzIGJsYW5rTm9kZXNUeXBlVmFsdWVbXSxcbiAgICAgICAgICB0aGlzLm5vZGVLZXkoKSBhcyBibGFua05vZGVzS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWx0ZXIoc2hvdWxkU2hvd0JsYW5rTm9kZSksXG4gICAgICB0b0FycmF5KCksXG4gICAgICBtZXJnZU1hcCh2YWx1ZXMgPT4gdGhpcy5mZXRjaFRlcm1JZHModmFsdWVzKS5waXBlKG1hcCgoKSA9PiB2YWx1ZXMpKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTm9uQmxhbmtOb2RlcygpIHtcbiAgICBjb25zdCBtYXBGdW5jID0gZ3JvdXBkTG9nc0J5S2V5KFxuICAgICAgdGhpcy5ub2RlVHlwZSgpLFxuICAgICAgdGhpcy5ub2RlS2V5KCkgYXMgbm9uQmxhbmtOb2Rlc0tleSxcbiAgICAgIHRoaXMubG9ncygpLFxuICAgICAgdGhpcy5lbmdpbmVNb2RlbHMoKSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSBhcyBub25CbGFua05vZGVzVHlwZVZhbHVlLFxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMoKSBhcyBub25CbGFua05vZGVzVHlwZVZhbHVlXG4gICAgKTtcbiAgICBjb25zdCBrZXlzID0gY29tcHV0ZUtleXMoXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzKCkgYXMgbm9uQmxhbmtOb2Rlc1R5cGVWYWx1ZSxcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVkVmFsdWVzKCkgYXMgbm9uQmxhbmtOb2Rlc1R5cGVWYWx1ZVxuICAgICk7XG4gICAgcmV0dXJuIGZyb20oa2V5cykucGlwZShtYXAobWFwRnVuYyksIHRvQXJyYXkoKSk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoVGVybUlkcyh2YWx1ZXM6IElCbGFua05vZGVMb2dbXSkge1xuICAgIHJldHVybiBvZih2YWx1ZXMpLnBpcGUoXG4gICAgICBtZXJnZU1hcCh2ID0+IHYuZmxhdE1hcCh2diA9PiB2di5zdWJWYWx1ZXMpKSxcbiAgICAgIG1hcCh2ID0+IHYuaWQpLFxuICAgICAgZGlzdGluY3QoKSxcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXG4gICAgICB0b0FycmF5KCksXG4gICAgICBtZXJnZU1hcCgoaWRzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgaWRzLmxlbmd0aFxuICAgICAgICAgID8gdGhpcy5zZWFyY2hUZXJtcyh7XG4gICAgICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKE5vZGVUeXBlLlRlcm0pXSxcbiAgICAgICAgICAgICAgICBzaG91bGQ6IGlkcy5tYXAoaWQgPT4gbWF0Y2hFeGFjdFF1ZXJ5KCdAaWQnLCBpZCkpLFxuICAgICAgICAgICAgICAgIG1pbmltdW1fc2hvdWxkX21hdGNoOiAxXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBvZihbXSlcbiAgICAgICksXG4gICAgICByZWR1Y2UoKHByZXYsIGN1cnIpID0+ICh7IC4uLnByZXYsIFtjdXJyWydAaWQnXV06IGN1cnIgfSksIHt9IGFzIElUZXJtc0J5SWRNYXBwaW5nKSxcbiAgICAgIHRhcCh2YWx1ZXMgPT4gdGhpcy50ZXJtc0J5SWQuc2V0KHZhbHVlcykpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3VnZ2VzdEJ5VGVybSh0ZXJtOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hbGxUZXJtcygpXG4gICAgICAubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSlcbiAgICAgIC5maWx0ZXIodiA9PiB0ZXJtU2VhcmNoKHYpLmluY2x1ZGVzKHRlcm1TZWFyY2godGVybSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VhcmNoVGVybXMocXVlcnk6IGFueSkge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoU2VydmljZVxuICAgICAgLnNlYXJjaCQ8SVRlcm1KU09OTEQsIE5vZGVUeXBlLlRlcm0+KHtcbiAgICAgICAgZmllbGRzOiBbJ0B0eXBlJywgJ0BpZCcsICduYW1lJywgJ3VuaXRzJywgJ3Rlcm1UeXBlJ10sXG4gICAgICAgIGxpbWl0OiAxMDAwMCxcbiAgICAgICAgcXVlcnlcbiAgICAgIH0pXG5cbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nLnNldChmYWxzZSkpLFxuICAgICAgICBtYXAoKHsgcmVzdWx0cyB9KSA9PiByZXN1bHRzKVxuICAgICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0cmFja0J5QmxhbmtOb2RlKF9pbmRleDogbnVtYmVyLCBub2RlOiBhbnkpIHtcbiAgICByZXR1cm4gbm9kZS50ZXJtSWQgfHwgbm9kZS5rZXk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWV0aG9kTmFtZSh7IG1ldGhvZElkLCBtb2RlbCB9OiBJQ29uZmlnTW9kZWwpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RzQnlJZCgpPy5bbWV0aG9kSWRdPy5uYW1lIHx8IG1ldGhvZElkTGFiZWwobWV0aG9kSWQsIG1vZGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNNZXRob2RUaWVyKHZhbHVlczogYmxhbmtOb2Rlc1R5cGVWYWx1ZVtdLCBtZXRob2RUaWVyOiBFbWlzc2lvbk1ldGhvZFRpZXIpIHtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUodiA9PiAnbWV0aG9kVGllcicgaW4gdiAmJiB2Lm1ldGhvZFRpZXIgPT09IG1ldGhvZFRpZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRlcm1CeUlkKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy50ZXJtc0J5SWQoKT8uW2lkXSB8fFxuICAgICAgKHtcbiAgICAgICAgJ0B0eXBlJzogTm9kZVR5cGUuVGVybSxcbiAgICAgICAgJ0BpZCc6IGlkLFxuICAgICAgICBuYW1lOiB0ZXJtVHlwZUxhYmVsKGlkKVxuICAgICAgfSBhcyBJVGVybUpTT05MRClcbiAgICApO1xuICB9XG59XG4iLCJAaWYgKHNob3dPdXRkYXRlZExvZ3MoKSB8fCBlbmdpbmVNb2RlbFZlcnNpb24oKSA9PT0gY3VycmVudE1vZGVsVmVyc2lvbigpKSB7XG4gIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIj5cbiAgICBAaWYgKCFpc0V4dGVybmFsICYmIGxvZ3NVcmwoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LXJpZ2h0IGlzLW1iLTJcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiBbaHJlZl09XCJsb2dzVXJsKClcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUV4dGVybmFsTGlua0FsdFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5PcGVuIEZ1bGwgTG9nczwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggaXMtbmFycm93IGlzLXN0cmlwZWRcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPlxuICAgICAgICAgICAgICBAaWYgKGVuYWJsZUZpbHRlckJ5VGVybSgpKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZCBoYXMtaWNvbnMtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCBzZWFyY2gtaW5wdXQgaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInRlcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInRlcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGVudHJ5IGJ5IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic3VnZ2VzdFRlcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb2N1c0ZpcnN0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJ0eXBlYWhlYWRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0SXRlbSk9XCJ0ZXJtLnNldCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImljb24gaXMtc21hbGwgaXMtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiF0ZXJtKClcIiAoY2xpY2spPVwidGVybS5zZXQoJycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFUaW1lc1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICBAaWYgKGlzQmxhbmtOb2RlcygpKSB7XG4gICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXByLTFcIj5Vbml0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4ocGVyJm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoZnVuY3Rpb25hbFVuaXQoKSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoQ3ljbGVGdW5jdGlvbmFsVW5pdFsnMSBoYSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGVjdGFyZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgICBrZyBwcm9kdWN0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+KTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDx0aD5PcmlnaW5hbDwvdGg+XG4gICAgICAgICAgICA8dGg+UmVjYWxjdWxhdGVkPC90aD5cbiAgICAgICAgICAgIEBpZiAoaXNCbGFua05vZGVzKCkpIHtcbiAgICAgICAgICAgICAgPHRoPkRpZmZlcmVuY2U8L3RoPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGZvciAoYyBvZiBtZXRob2RNb2RlbHNDb3VudCgpIHwgdGltZXM7IHRyYWNrIGM7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0aD4oe3sgaSArIDEgfX0pPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLXRleHQtY2VudGVyZWRcIiBjb2xzcGFuPVwiNlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYXMtdGV4dC1jZW50ZXIgcHktM1wiPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFTcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCFsb2FkaW5nKCkgJiYgYmxhbmtOb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtdGV4dC1jZW50ZXJlZFwiIGNvbHNwYW49XCI2XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbm9EYXRhTWVzc2FnZSgpIHx8ICdObyBkYXRhJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGJsYW5rTm9kZSBvZiBibGFua05vZGVzKCk7IHRyYWNrIHRyYWNrQnlCbGFua05vZGUoJGluZGV4LCBibGFua05vZGUpKSB7XG4gICAgICAgICAgICA8dHIgW2NsYXNzLmhhcy1zdWItcm93c109XCJibGFua05vZGUuY2FuT3BlblwiIFtjbGFzcy5pcy1vcGVuXT1cImJsYW5rTm9kZS5pc09wZW5cIj5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHQgaXMtbm93cmFwXCJcbiAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCIkYW55KGJsYW5rTm9kZSkudGVybT8ubmFtZSB8fCAkYW55KGJsYW5rTm9kZSkua2V5XCI+XG4gICAgICAgICAgICAgICAgQGlmIChibGFua05vZGUuY2FuT3Blbikge1xuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHByLTIgb3Blbi1ub2RlXCIgKGNsaWNrKT1cImJsYW5rTm9kZS5pc09wZW4gPSAhYmxhbmtOb2RlLmlzT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUFuZ2xlRG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWJsYW5rTm9kZS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhQW5nbGVSaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiYmxhbmtOb2RlLmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmICgkYW55KGJsYW5rTm9kZSkudGVybSkge1xuICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1wcmUtd3JhcFwiIFtub2RlXT1cIiRhbnkoYmxhbmtOb2RlKS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiJGFueShibGFua05vZGUpLnRlcm0ubmFtZSB8IGNvbXBvdW5kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9oZS1ub2RlLWxpbms+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoJGFueShibGFua05vZGUpLmtleSkge1xuICAgICAgICAgICAgICAgICAgQGlmIChub2RlS2V5KCkgPT09ICdjb21wbGV0ZW5lc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9Db21wbGV0ZW5lc3MjJyArICRhbnkoYmxhbmtOb2RlKS5rZXlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAkYW55KGJsYW5rTm9kZSkua2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgJGFueShibGFua05vZGUpLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIEBpZiAoaXNCbGFua05vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcFwiIFtpbm5lckh0bWxdPVwiJGFueShibGFua05vZGUpLnRlcm0/LnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNvcmlnaW5hbFZhbHVlQ29udGVudD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICBAaWYgKGJsYW5rTm9kZS5hbGxQYXJhbGxlbCkge1xuICAgICAgICAgICAgICAgICAgQGZvciAobW9kZWwgb2YgJGFueShibGFua05vZGUpLmNvbmZpZ01vZGVsc1swXTsgdHJhY2sgbW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGJsYW5rTm9kZSkub3JpZ2luYWxWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRyaWdnZXItcG9wb3Zlcl09XCIhISRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbD8uWzBdPy5tZXRob2RNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ2JQb3BvdmVyXT1cImJsYW5rTm9kZU9yaWdpbmFsVmFsdWVEZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgICAgICAgICAgICAgICAgICBwb3BvdmVyQ2xhc3M9XCJpcy1uYXJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAjcD1cIm5nYlBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlUG9wb3Zlcl09XCIhJGFueShibGFua05vZGUpLm9yaWdpbmFsPy5bMF0/Lm1ldGhvZE1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDb250ZXh0XT1cInsgYmxhbmtOb2RlIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gcG9pbnRlcj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGJsYW5rTm9kZSkub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgQGlmICghYmxhbmtOb2RlLmlzT3JpZ2luYWwgfHwgYmxhbmtOb2RlLmlzUmVjYWxjdWxhdGVkKSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKGJsYW5rTm9kZS5hbGxQYXJhbGxlbCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChtb2RlbCBvZiAkYW55KGJsYW5rTm9kZSkuY29uZmlnTW9kZWxzWzBdOyB0cmFjayBtb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGJsYW5rTm9kZSkucmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbm90IHJlY2FsY3VsYXRlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgQGlmIChpc0JsYW5rTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChibGFua05vZGUuYWxsUGFyYWxsZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAobW9kZWwgb2YgJGFueShibGFua05vZGUpLmNvbmZpZ01vZGVsc1swXTsgdHJhY2sgbW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGFueShibGFua05vZGUpLm9yaWdpbmFsVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkYW55KGJsYW5rTm9kZSkucmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkW21vZGVsLm1ldGhvZElkXSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIiRhbnkoYmxhbmtOb2RlKS5yZWNhbGN1bGF0ZWRWYWx1ZUJ5TWV0aG9kSWRbbW9kZWwubWV0aG9kSWRdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3JpZ2luYWxWYWx1ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFZhbHVlQnlNZXRob2RJZFttb2RlbC5tZXRob2RJZF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L2hlLWJsYW5rLW5vZGUtdmFsdWUtZGVsdGE+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmICgkYW55KGJsYW5rTm9kZSkub3JpZ2luYWwubGVuZ3RoICYmIGJsYW5rTm9kZS5pc1JlY2FsY3VsYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYmxhbmtOb2RlLnJlY2FsY3VsYXRlZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcmlnaW5hbFZhbHVlXT1cIiRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFZhbHVlXCI+PC9oZS1ibGFuay1ub2RlLXZhbHVlLWRlbHRhPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAtXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbHM7IGNvbnRleHQ6IHsgZGF0YTogYmxhbmtOb2RlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICBAZm9yIChzdWJWYWx1ZSBvZiAkYW55KGJsYW5rTm9kZSkua2V5czsgdHJhY2sgc3ViVmFsdWUpIHtcbiAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhYmxhbmtOb2RlLmlzT3BlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1zdWItcm93c109XCIkYW55KGJsYW5rTm9kZSkuc3ViVmFsdWVzPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zdWItcm93XT1cImJsYW5rTm9kZS5jYW5PcGVuXCI+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0IGlzLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tdG9wIHBsLTMgcHItMSBmaWVsZC1ub2RlXCI+RmllbGQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChibGFua05vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLXByZS13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGJsYW5rTm9kZS50eXBlICsgJyMnICsgc3ViVmFsdWUua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJzdWJWYWx1ZS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdWJWYWx1ZS5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIWJsYW5rTm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcFwiPnt7IHN1YlZhbHVlLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIEBpZiAoaXNCbGFua05vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICBAaWYgKHN1YlZhbHVlLm9yaWdpbmFsVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3sgc3ViVmFsdWUub3JpZ2luYWxWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgQGlmIChzdWJWYWx1ZS5pc1JlY2FsY3VsYXRlZCB8fCBzdWJWYWx1ZS5rZXkgPT09ICdpbXBhY3RBc3Nlc3NtZW50Jykge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzdWJWYWx1ZS5yZWNhbGN1bGF0ZWRWYWx1ZSB8IHByZWNpc2lvbjogMyB8IGRlZmF1bHQ6ICctJyB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm90IHJlY2FsY3VsYXRlZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgQGlmIChpc0JsYW5rTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgPHRkPi08L3RkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmxhbmtOb2RlTW9kZWxzOyBjb250ZXh0OiB7IGRhdGE6IHN1YlZhbHVlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKHN1YlZhbHVlIG9mICRhbnkoYmxhbmtOb2RlKS5zdWJWYWx1ZXM7IHRyYWNrIHN1YlZhbHVlKSB7XG4gICAgICAgICAgICAgIDx0ciBbY2xhc3MuaXMtaGlkZGVuXT1cIiFibGFua05vZGUuaXNPcGVuXCIgW2NsYXNzLmlzLXN1Yi1yb3ddPVwiYmxhbmtOb2RlLmNhbk9wZW5cIj5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLXRvcCBwbC0zXCI+e3sgc3ViVmFsdWUua2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoc3ViVmFsdWUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIiBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi10b3AgcHItMVwiPjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKHN1YlZhbHVlLmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnYmFja2dyb3VuZERhdGEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWlubGluZS1ibG9ja1wiPnt7IHN1YlZhbHVlLmlkIHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWJsb2NrIHBsLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJ0ZXJtQnlJZChzdWJWYWx1ZS5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJ0ZXJtQnlJZChzdWJWYWx1ZS5pZCkubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cInRlcm1CeUlkKHN1YlZhbHVlLmlkKS5uYW1lIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIEBpZiAoaXNCbGFua05vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzdWJWYWx1ZS5zaG93VW5pdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcFwiIFtpbm5lckh0bWxdPVwiJGFueShibGFua05vZGUpLnRlcm0/LnVuaXRzIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgIEBpZiAoc3ViVmFsdWUub3JpZ2luYWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzdWJWYWx1ZS5vcmlnaW5hbFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAtXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICBAaWYgKHN1YlZhbHVlLmlzUmVjYWxjdWxhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IHN1YlZhbHVlLnJlY2FsY3VsYXRlZFZhbHVlIHwgcHJlY2lzaW9uOiAzIHwgZGVmYXVsdDogJy0nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub3QgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICBAaWYgKGlzQmxhbmtOb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICA8dGQ+LTwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbHM7IGNvbnRleHQ6IHsgZGF0YTogc3ViVmFsdWUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9oZS1kYXRhLXRhYmxlPlxuICAgIDxkaXYgY2xhc3M9XCJpcy1zaXplLTcgaXMtaXRhbGljXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy0xIG15LTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIHByLTJcIiAoY2xpY2spPVwic2hvd0xlZ2VuZCA9ICFzaG93TGVnZW5kXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhQW5nbGVEb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhc2hvd0xlZ2VuZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFBbmdsZVJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJzaG93TGVnZW5kXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIj5MZWdlbmQ6PC9zcGFuPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJjb250ZW50IHBsLTJcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFzaG93TGVnZW5kXCI+XG4gICAgICAgICAgICBAZm9yIChzdGF0dXMgb2YgTG9nU3RhdHVzIHwga2V5czsgdHJhY2sgc3RhdHVzKSB7XG4gICAgICAgICAgICAgIEBpZiAobG9nSWNvbltzdGF0dXMudmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiaGFzLXRleHQte3sgbG9nQ29sb3Jbc3RhdHVzLnZhbHVlXSB9fVwiPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwibG9nSWNvbltzdGF0dXMudmFsdWVdXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3sgc3RhdHVzLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChmaWx0ZXJlZFR5cGUoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaGFzLXRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImlzLWlubGluZS1ibG9jayBjaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9ubHlSZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbmx5UmVxdWlyZWQuc2V0KCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXRlcm0oKVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPlxuICAgICAgICAgICAgICAgIFNob3cgb25seSB7eyBmaWx0ZXJlZFR5cGUoKSB8IHBsdXJhbGl6ZSB9fSBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCBIRVNUSUEgc3lzdGVtIGJvdW5kYXJ5XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn0gQGVsc2Uge1xuICA8ZGl2IGNsYXNzPVwiaXMtMyBoYXMtdGV4dC1jZW50ZXJlZFwiPlxuICAgIDxwIGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgPGZhLWljb24gY2xhc3M9XCJpcy1wci0yXCIgW2ljb25dPVwiZmFFeGNsYW1hdGlvblRyaWFuZ2xlXCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4+VGhlc2UgbG9ncyBtaWdodCBiZSBpbmNvcnJlY3QgYXMgdGhlIGNhbGN1bGF0aW9ucyBhcmUgb3V0ZGF0ZWQuPC9zcGFuPlxuICAgIDwvcD5cbiAgICA8cCBjbGFzcz1cImlzLXVuZGVybGluZWQgaXMtc2l6ZS03XCI+PGEgKGNsaWNrKT1cInNob3dPdXRkYXRlZExvZ3Muc2V0KHRydWUpXCI+VmlldyBsb2dzIGFueXdheS48L2E+PC9wPlxuICA8L2Rpdj5cbn1cblxuPG5nLXRlbXBsYXRlICNibGFua05vZGVPcmlnaW5hbFZhbHVlRGV0YWlscyBsZXQtYmxhbmtOb2RlPVwiYmxhbmtOb2RlXCI+XG4gIDxzcGFuIGNsYXNzPVwiaXMtcHItMVwiPlRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgcmVwb3J0ZWQgdXNpbmc6PC9zcGFuPlxuICA8aGUtbm9kZS1saW5rXG4gICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2tcIlxuICAgIGxpbmtDbGFzcz1cImlzLWRhcmtcIlxuICAgIFtub2RlXT1cIiRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFswXS5tZXRob2RNb2RlbFwiXG4gICAgW3Nob3dFeHRlcm5hbExpbmtdPVwidHJ1ZVwiPlxuICAgIDxzcGFuPnt7ICRhbnkoYmxhbmtOb2RlKS5vcmlnaW5hbFswXS5tZXRob2RNb2RlbC5uYW1lIH19PC9zcGFuPlxuICA8L2hlLW5vZGUtbGluaz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYmxhbmtOb2RlTW9kZWxzIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8bmctdGVtcGxhdGUgI25vdEluU3lzdGVtQm91bmRhcnk+XG4gICAgPHRkIFthdHRyLmNvbHNwYW5dPVwibWV0aG9kTW9kZWxzQ291bnQoKVwiPlxuICAgICAgPHNwYW4+Tm90IGluIEhFU1RJQSBzeXN0ZW0gYm91bmRhcnk8L3NwYW4+XG4gICAgPC90ZD5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICBAaWYgKGlzU3lzdGVtQm91bmRhcnkoZGF0YSkpIHtcbiAgICBAZm9yIChjIG9mIG1ldGhvZE1vZGVsc0NvdW50KCkgfCB0aW1lczsgdHJhY2sgYzsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDx0ZCBjbGFzcz1cImJsYW5rLW5vZGUtaW5kZXgte3sgaSB9fVwiPlxuICAgICAgICBAaWYgKGdldE1vZGVsc0F0KGRhdGEsIGkpOyBhcyBtb2RlbHMpIHtcbiAgICAgICAgICBAaWYgKCRhbnkobW9kZWxzKSB8IGlzQXJyYXkpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIEBmb3IgKG1vZGVsIG9mICRhbnkobW9kZWxzKTsgdHJhY2sgbW9kZWwpIHtcbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbDsgY29udGV4dDogeyBtb2RlbCwgZGF0YSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJibGFua05vZGVNb2RlbDsgY29udGV4dDogeyBtb2RlbDogbW9kZWxzLCBkYXRhIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIC1cbiAgICAgICAgfVxuICAgICAgPC90ZD5cbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIC1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNibGFua05vZGVNb2RlbCBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8c3BhblxuICAgIGNsYXNzPVwiaXMtbm93cmFwXCJcbiAgICBbY2xhc3MudHJpZ2dlci1wb3BvdmVyXT1cIm1vZGVsLnNob3dMb2dzXCJcbiAgICBbbmdiUG9wb3Zlcl09XCJsb2dEZXRhaWxzXCJcbiAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXG4gICAgI3A9XCJuZ2JQb3BvdmVyXCJcbiAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAoY2xpY2spPVwicC5pc09wZW4oKSA/IHAuY2xvc2UoKSA6IG1vZGVsLnNob3dMb2dzID8gcC5vcGVuKHsgbG9nczogbW9kZWwubG9ncyB9KSA6IG51bGxcIj5cbiAgICA8c3BhbiBjbGFzcz1cImlzLWNhcGl0YWxpemVkXCI+e3sgbWV0aG9kTmFtZShtb2RlbCkgfX08L3NwYW4+XG4gICAgQGlmIChtb2RlbC5sb2dzPy5tZXRob2RUaWVyIHx8IG1vZGVsLm1vZGVsPy5tZXRob2RUaWVyKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5be3sgbW9kZWwubG9ncz8ubWV0aG9kVGllciB8fCBtb2RlbC5tb2RlbD8ubWV0aG9kVGllciB9fV08L3NwYW4+XG4gICAgfVxuXG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwicGwtMSBoYXMtdGV4dC17eyBsb2dDb2xvclttb2RlbC5zdGF0dXNdIH19IHRyaWdnZXItcG9wb3ZlclwiXG4gICAgICBbbmdiUG9wb3Zlcl09XCJsb2dTdGF0dXNEZXRhaWxzXCJcbiAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXG4gICAgICAjcDE9XCJuZ2JQb3BvdmVyXCJcbiAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwMS5pc09wZW4oKSA/IHAxLmNsb3NlKCkgOiBwMS5vcGVuKHsgbW9kZWwsIGRhdGEgfSlcIj5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cImxvZ0ljb25bbW9kZWwuc3RhdHVzXVwiPjwvZmEtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICBAaWYgKG1vZGVsLm1vZGVsKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5cbiAgICAgICAgKFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZG9jc0xpbms7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBtb2RlbC5tb2RlbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIClcbiAgICAgIDwvc3Bhbj5cbiAgICB9XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nRGV0YWlscyBsZXQtbG9ncz1cImxvZ3NcIj5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWRhcmsgaXMtZnVsbHdpZHRoXCI+XG4gICAgICA8dGJvZHk+XG4gICAgICAgIEBpZiAobG9ncz8ucmVxdWlyZW1lbnRzKSB7XG4gICAgICAgICAgQGZvciAoa2V5IG9mIHJlcXVpcmVtZW50S2V5cyhsb2dzLnJlcXVpcmVtZW50cyk7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmU7IGNvbnRleHQ6IHsga2V5LCB2YWx1ZTogbG9ncy5yZXF1aXJlbWVudHNba2V5XSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChsb2dzPy5sb2dzKSB7XG4gICAgICAgICAgQGZvciAoa2V5IG9mIGxvZ3MubG9ncyB8IGtleXM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvZ0xpbmU7IGNvbnRleHQ6IGtleVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cblxuICBAaWYgKGxvZ3M/Lm1pc3NpbmdMb29rdXBzPy5sZW5ndGgpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaXQtbXQtMlwiPlxuICAgICAgPHA+RGF0YSBtaXNzaW5nIChtaWdodCBiZSBvcHRpb25hbCk6PC9wPlxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lciBkYXRhLXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1kYXJrIGlzLWZ1bGx3aWR0aCBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkZpbGVuYW1lPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkNvbHVtbiBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5Sb3cgKHRlcm0uaWQpPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGxvZ3MubWlzc2luZ0xvb2t1cHM7IHRyYWNrIGRhdGEpIHtcbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0ZD57eyBkYXRhLmZpbGVuYW1lIH19PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+e3sgZGF0YS5jb2x1bW4gfX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD57eyBkYXRhLnRlcm1JZCB9fTwvdGQ+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvZ0xpbmVWYWx1ZSBsZXQta2V5PVwia2V5XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgQGlmIChyZXF1aXJlbWVudExpbmtlZE5vZGUoa2V5LCB2YWx1ZSk7IGFzIGxpbmtlZE5vZGUpIHtcbiAgICA8aGUtbm9kZS1saW5rXG4gICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIlxuICAgICAgbGlua0NsYXNzPVwiaXMtZGFya1wiXG4gICAgICBbbm9kZV09XCJsaW5rZWROb2RlXCJcbiAgICAgIFtzaG93RXh0ZXJuYWxMaW5rXT1cInRydWVcIj48L2hlLW5vZGUtbGluaz5cbiAgfSBAZWxzZSB7XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtYWxpZ24tbWlkZGxlXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nTGluZSBsZXQta2V5PVwia2V5XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgPHRyPlxuICAgIDx0ZCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHQgY29weS1sb2dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLWFsaWduLW1pZGRsZVwiPlxuICAgICAgICBAaWYgKHBhcnNlTG9nQ29tcGxldGVuZXNzKGtleSk7IGFzIGNvbXBsZXRlbmVzcykge1xuICAgICAgICAgIDxzcGFuPkRhdGEgY29tcGxldGVuZXNzIGZvcjwvc3Bhbj5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj57eyBjb21wbGV0ZW5lc3Mua2V5IH19PC9jb2RlPlxuICAgICAgICAgIDxzcGFuPm11c3QgYmU8L3NwYW4+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+e3sgY29tcGxldGVuZXNzLnZhbHVlIH19PC9jb2RlPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAge3sga2V5IHwga2V5VG9MYWJlbCB9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdwcm9wZXJ0eV9pZCcpIHtcbiAgICAgICAgICAgICAgUHJvcGVydHkgVGVybSAmIzY0O2lkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb2R1Y3RfaWQnKSB7XG4gICAgICAgICAgICAgIFByb2R1Y3QgVGVybSAmIzY0O2lkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2Nyb3BfcHJvZHVjdF9pZCcpIHtcbiAgICAgICAgICAgICAgQ3JvcCBQcm9kdWN0IFRlcm0gJiM2NDtpZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdpbnB1dF9pZCcpIHtcbiAgICAgICAgICAgICAgSW5wdXQgVGVybSAmIzY0O2lkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ25vZGVfdHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5JcyB0aGUgY3VycmVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+Tm9kZTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+YWxsb3dlZCB0byBydW4gdGhpcyBtb2RlbDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnc2l0ZVR5cGVfYWxsb3dlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+SXMgdGhlIGN1cnJlbnQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnNpdGVUeXBlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdwcm9kdWN0X2lkX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIFByb2R1Y3Q8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPiYjNjQ7aWQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3Byb2R1Y3RfdGVybVR5cGVfYWxsb3dlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+QXJlIGFueSBvZiB0aGUgUHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+dGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2lucHV0X2lkX2FsbG93ZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPkFyZSBhbnkgb2YgdGhlIElucHV0PC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj4mIzY0O2lkPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdpbnB1dF90ZXJtVHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5BcmUgYW55IG9mIHRoZSBJbnB1dDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+dGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8IS0tIERlcHJlY2F0ZWQgLS0+XG4gICAgICAgICAgICBAY2FzZSAoJ3ByaW1hcnlfcHJvZHVjdF9pZF9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5JcyB0aGUgY3VycmVudCBwcmltYXJ5IHByb2R1Y3Q8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPiYjNjQ7aWQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmFsbG93ZWQgdG8gcnVuIHRoaXMgbW9kZWw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3ByaW1hcnlfcHJvZHVjdF90ZXJtVHlwZV9hbGxvd2VkJykge1xuICAgICAgICAgICAgICA8c3Bhbj5JcyB0aGUgY3VycmVudCBwcmltYXJ5IHByb2R1Y3Q8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnRlcm1UeXBlPC9jb2RlPlxuICAgICAgICAgICAgICA8c3Bhbj5hbGxvd2VkIHRvIHJ1biB0aGlzIG1vZGVsPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdnZW9zcGF0aWFsX2RhdGEnKSB7XG4gICAgICAgICAgICAgIEhhcyBnZW9zcGF0aWFsIGRhdGEgbmVjZXNzYXJ5IHRvIHJ1biB0aGlzIG1vZGVsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2NvbnRhaW5zX2dlb3NwYXRpYWxfZGF0YScpIHtcbiAgICAgICAgICAgICAgSGFzIGdlb3NwYXRpYWwgZGF0YSBuZWNlc3NhcnkgdG8gcnVuIHRoaXMgbW9kZWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnY3VycmVudF9zaXplJykge1xuICAgICAgICAgICAgICBDdXJyZW50IHBvbHlnb24gYXJlYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdtYXhfYXJlYV9zaXplJykge1xuICAgICAgICAgICAgICBNYXhpbXVtIHBvbHlnb24gYXJlYSB0byBydW4gdGhpcyBtb2RlbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdiZWxvd19tYXhfYXJlYV9zaXplJykge1xuICAgICAgICAgICAgICBQb2x5Z29uIGJlbG93IHRoZSBtYXhpbXVtIGFyZWFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgncmVnaW9uX2ZhY3RvcicpIHtcbiAgICAgICAgICAgICAgRmFjdG9yIGZyb20gcmVnaW9uIGxvb2t1cFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdoYXNfcGVzdGljaWRlc19pbnB1dHMnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPkN5Y2xlIGNvbnRhaW5zPC9zcGFuPlxuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5wZXN0aWNpZGVBSTwvY29kZT5cbiAgICAgICAgICAgICAgPHNwYW4+SW5wdXRzPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdhbGxfcGVzdGljaWRlQUlfaGF2ZV9sb29rdXBfdmFsdWUnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPkFsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+cGVzdGljaWRlQUk8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPklucHV0cyBoYXZlIGEgbG9va3VwIHZhbHVlPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdoYXNfY3JvcF9yZXNpZHVlX2J1cm50Jykge1xuICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW1yLTFcIj5hYm92ZUdyb3VuZENyb3BSZXNpZHVlQnVybnQ8L2NvZGU+XG4gICAgICAgICAgICAgIDxzcGFuPmlzIHByZXNlbnQgYXMgUHJvZHVjdDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnbGlxdWlkX3NsdXJyeV9zbHVkZ2VfUCcpIHtcbiAgICAgICAgICAgICAgTGlxdWlkLCBTbHVycnksIGFuZCBTbHVkZ2UgUFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdub19jeWNsZV9pbnB1dHNfZmVlZCcpIHtcbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgQ3ljbGUgaGFzXG4gICAgICAgICAgICAgICAgPGI+bm88L2I+XG4gICAgICAgICAgICAgICAgSW5wdXQgd2l0aFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlPmlzQW5pbWFsRmVlZD10cnVlPC9jb2RlPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdoYXNfY3ljbGVfaW5wdXRzX2ZlZWQnKSB7XG4gICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIEN5Y2xlIGhhc1xuICAgICAgICAgICAgICAgIDxiPnNvbWU8L2I+XG4gICAgICAgICAgICAgICAgSW5wdXQgd2l0aFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlPmlzQW5pbWFsRmVlZD10cnVlPC9jb2RlPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9zcGFuPlxuICAgICAgPGhlLWNsaXBib2FyZFxuICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1hbGlnbi1taWRkbGVcIlxuICAgICAgICBjbGlwYm9hcmRDbGFzcz1cImlzLXNpemUtNyBpcy1wLTFcIlxuICAgICAgICBbaWNvbl09XCJmYXJDbG9uZVwiXG4gICAgICAgIFt2YWx1ZV09XCJrZXlcIlxuICAgICAgICBbaGlkZVRleHRdPVwidHJ1ZVwiPjwvaGUtY2xpcGJvYXJkPlxuICAgIDwvdGQ+XG4gICAgPHRkPlxuICAgICAgQGlmIChsb2dWYWx1ZUFycmF5KHZhbHVlKTsgYXMgdmFsdWVBcnJheSkge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLWRhcmsgaXMtYm9yZGVyZWQgaXMtc3RyaXBlZFwiPlxuICAgICAgICAgICAgQGlmICh2YWx1ZUFycmF5WzBdIHwgaXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHYgb2YgdmFsdWVBcnJheVswXSB8IGtleXM7IHRyYWNrIHYpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLXRleHQtd2hpdGVcIj57eyB2LmtleSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgQGZvciAodiBvZiB2YWx1ZUFycmF5OyB0cmFjayB2KSB7XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgQGlmICh2IHwgaXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAodnYgb2YgdiB8IGtleXM7IHRyYWNrIHZ2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHZ2LnZhbHVlIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyB2IH19PC90ZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2dMaW5lVmFsdWU7IGNvbnRleHQ6IHsga2V5LCB2YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICB9XG4gICAgPC90ZD5cbiAgPC90cj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9nU3RhdHVzRGV0YWlscyBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgIDxzcGFuPlN0YXR1czo8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+e3sgbW9kZWwuc3RhdHVzIH19PC9zcGFuPlxuICA8L2Rpdj5cblxuICBAaWYgKG1vZGVsLnN0YXR1cyA9PT0gTG9nU3RhdHVzLm5vdFJlcXVpcmVkICYmIG1vZGVsLmxvZ3M/LmlzX25vdF9yZWxldmFudCA9PT0gJ1RydWUnKSB7XG4gICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRpc2NcIj5cbiAgICAgIEBpZiAobW9kZWwubG9ncy5sb2dzPy5zaXRlVHlwZV9hbGxvd2VkID09PSAnRmFsc2UnKSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICBUaGVcbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW14LTFcIj5zaXRlLnNpdGVUeXBlPC9jb2RlPlxuICAgICAgICAgIGlzIG5vdCByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICAgIEBpZiAobW9kZWwubG9ncy5sb2dzPy5wcm9kdWN0X2lkX2FsbG93ZWQgPT09ICdGYWxzZScpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIE5vbmUgb2YgdGhlXG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1teC0xXCI+UHJvZHVjdDwvY29kZT5cbiAgICAgICAgICA8Y29kZSBjbGFzcz1cImlzLW1yLTFcIj50ZXJtLiYjNjQ7aWQ8L2NvZGU+XG4gICAgICAgICAgaXMgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgICBAaWYgKG1vZGVsLmxvZ3MubG9ncz8ucHJvZHVjdF90ZXJtVHlwZV9hbGxvd2VkID09PSAnRmFsc2UnKSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPlByb2R1Y3Q8L2NvZGU+XG4gICAgICAgICAgPGNvZGUgY2xhc3M9XCJpcy1tci0xXCI+dGVybS50ZXJtVHlwZTwvY29kZT5cbiAgICAgICAgICBpcyByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICAgIEBpZiAobW9kZWwubG9ncy5sb2dzPy5pbnB1dF9pZF9hbGxvd2VkID09PSAnRmFsc2UnKSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPklucHV0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0uJiM2NDtpZDwvY29kZT5cbiAgICAgICAgICBpcyByZWxldmFudC5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICAgIEBpZiAobW9kZWwubG9ncy5sb2dzPy5pbnB1dF90ZXJtVHlwZV9hbGxvd2VkID09PSAnRmFsc2UnKSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICBOb25lIG9mIHRoZVxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPklucHV0PC9jb2RlPlxuICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXItMVwiPnRlcm0udGVybVR5cGU8L2NvZGU+XG4gICAgICAgICAgaXMgcmVsZXZhbnQuXG4gICAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgPC91bD5cbiAgfVxuXG4gIEBpZiAobW9kZWwubG9ncyAmJiBtb2RlbC5zdGF0dXMgIT09IExvZ1N0YXR1cy5ub3RSZXF1aXJlZCAmJiBtb2RlbC5zdGF0dXMgIT09IExvZ1N0YXR1cy5za2lwSGllcmFyY2h5KSB7XG4gICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRpc2NcIj5cbiAgICAgIEBpZiAobW9kZWwubG9ncz8uc2hvdWxkUnVuT3JjaGVzdHJhdG9yID09PSBmYWxzZSkge1xuICAgICAgICA8bGkgY2xhc3M9XCJpcy1uby1ydW4tb3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgQGlmICghbW9kZWwubG9ncy5ydW5SZXF1aXJlZCkge1xuICAgICAgICAgICAgQGlmIChtb2RlbC5sb2dzLmxvZ3M/Lm5vZGVfdHlwZV9hbGxvd2VkID09PSAnRmFsc2UnKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcnVuLW5vZGUtdHlwZS1ub3QtYWxsb3dlZFwiPlxuICAgICAgICAgICAgICAgIFRoaXMgbW9kZWwgc2hvdWxkIG5vdCBydW4gZm9yIHt7IG5vZGVUeXBlKCkgfCBwbHVyYWxpemU6IDAgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKG1vZGVsLmNvbmZpZykge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpcy1ydW4tc3RyYXRlZ3kte3sgbW9kZWwuY29uZmlnLnJ1blN0cmF0ZWd5IH19XCI+XG4gICAgICAgICAgICAgIEBzd2l0Y2ggKG1vZGVsLmNvbmZpZy5ydW5TdHJhdGVneSkge1xuICAgICAgICAgICAgICAgIEBjYXNlICgnYWx3YXlzJykge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2FkZF9rZXlfaWZfbWlzc2luZycpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPldlIG9ubHkgZ2FwLWZpbGwgdGhpcyBrZXkgaWYgbm90IHByZXNlbnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnYWRkX2JsYW5rX25vZGVfaWZfbWlzc2luZycpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPldlIG9ubHkgZ2FwLWZpbGwgdGhpcyBCbGFuayBOb2RlIGlmIG5vdCBwcmVzZW50Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaXMtbXQtMVwiPlxuICAgICAgICAgICAgICBAaWYgKG1vZGVsLmNvbmZpZy5ydW5BcmdzPy5ydW5Ob25NZWFzdXJlZCAmJiBoYXNNZXRob2RUaWVyKGRhdGEub3JpZ2luYWwsIEVtaXNzaW9uTWV0aG9kVGllci5tZWFzdXJlZCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi13aXRoLW1lYXN1cmVkXCI+XG4gICAgICAgICAgICAgICAgICBUaGVcbiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IG1vZGVsLmNvbmZpZy52YWx1ZSB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICAgIHdhcyByZXBvcnRlZCBhcyBtZWFzdXJlZC5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChtb2RlbC5sb2dzLmxvZ3M/LmlzX2VtcHR5ID09PSAnRmFsc2UnKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXJ1bi1ub3QtZW1wdHlcIj5cbiAgICAgICAgICAgICAgVGhlIHt7IGRhdGEudHlwZSB8fCAnYmxhbmsgbm9kZScgfX0gd2l0aCBUZXJtXG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiaXMtbXgtMVwiPnt7IGRhdGEudGVybUlkIH19PC9jb2RlPlxuICAgICAgICAgICAgICBpcyBhbHJlYWR5IHByZXNlbnQgb3IgYWxyZWFkeSBhZGRlZCBieSBhbm90aGVyIG1vZGVsLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9saT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8bGkgY2xhc3M9XCJpcy1ydW4tb3JjaGVzdHJhdG9yXCI+XG4gICAgICAgICAgQGlmIChtb2RlbC5sb2dzPy5zaG91bGRSdW4pIHtcbiAgICAgICAgICAgIDxwPkFsbCB0aGUgcmVxdWlyZW1lbnRzIHdlcmUgbWV0IHRvIHJ1biB0aGUgbW9kZWwuPC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCFtb2RlbC5sb2dzPy5zaG91bGRSdW4pIHtcbiAgICAgICAgICAgIDxwPlNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cyB3ZXJlIG5vdCBtZXQgdG8gcnVuIHRoZSBtb2RlbC48L3A+XG4gICAgICAgICAgICA8cD5Zb3UgY2FuIGNsaWNrIG9uIHRoZSBtb2RlbCBuYW1lIG9uIHRoZSBsZWZ0IHRvIHZpZXcgdGhlIGRlYnVnZ2luZyBsb2dzLjwvcD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChtb2RlbC5sb2dzPy5sb2dzPy5lcnJvcikge1xuICAgICAgICAgICAgPHA+VGhlIG1vZGVsIGZhaWxlZCB0byBydW4gZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOjwvcD5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8Y29kZT57eyBtb2RlbC5sb2dzLmxvZ3MuZXJyb3IgfX08L2NvZGU+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgICAgQGlmIChtb2RlbC5sb2dzPy5yZXBsYWNlTG93ZXJUaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgVGhlIHJlY2FsY3VsYXRlZFxuICAgICAgICAgICAgPGI+bWV0aG9kVGllcjwvYj5cbiAgICAgICAgICAgIHdhc1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBAaWYgKCFtb2RlbC5sb2dzLnJlcGxhY2VMb3dlclRpZXIpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMSBpcy11bmRlcmxpbmVkXCI+bG93ZXIgdGhhbjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChtb2RlbC5sb2dzLnJlcGxhY2VMb3dlclRpZXIpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMSBpcy11bmRlcmxpbmVkXCI+aGlnaGVyIHRoYW4gb3IgZXF1YWwgdG88L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiPlxuICAgICAgICAgICAgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICA8Yj5tZXRob2RUaWVyPC9iPlxuICAgICAgICAgICAgLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICAgIEBpZiAobW9kZWwubG9ncy5yZXBsYWNlTG93ZXJUaWVyKSB7XG4gICAgICAgIDxsaSBjbGFzcz1cImlzLW1lcmdlLXJlcGxhY2VMb3dlclRpZXJcIj5cbiAgICAgICAgICA8c3Bhbj5UaGUgcmVjYWxjdWxhdGVkPC9zcGFuPlxuICAgICAgICAgIDxiIGNsYXNzPVwiaXMtcGwtMVwiPnt7IG1vZGVsLmNvbmZpZz8ubWVyZ2VBcmdzPy5yZXBsYWNlVGhyZXNob2xkPy5bMF0gfHwgJ3ZhbHVlJyB9fTwvYj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj53YXM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCI+XG4gICAgICAgICAgICBAaWYgKG1vZGVsLmNvbmZpZz8ubWVyZ2VBcmdzKSB7XG4gICAgICAgICAgICAgIEBpZiAoIW1vZGVsLmxvZ3MucmVwbGFjZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiPmxlc3MgdGhhbjwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKG1vZGVsLmxvZ3MucmVwbGFjZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiPm1vcmUgdGhhbiBvciBlcXVhbCB0bzwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8YiBjbGFzcz1cImlzLXBsLTFcIj57eyBtb2RlbC5jb25maWcubWVyZ2VBcmdzLnJlcGxhY2VUaHJlc2hvbGRbMV0gKiAxMDAgfX0lPC9iPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghbW9kZWwuY29uZmlnPy5tZXJnZUFyZ3MpIHtcbiAgICAgICAgICAgICAgQGlmICghbW9kZWwubG9ncy5yZXBsYWNlVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy11bmRlcmxpbmVkXCI+bm90IHN1ZmZpY2llbnRseTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKG1vZGVsLmxvZ3MucmVwbGFjZVRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtdW5kZXJsaW5lZFwiPnN1ZmZpY2llbnRseTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIj5kaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWw8L3NwYW4+XG4gICAgICAgICAgPGIgY2xhc3M9XCJpcy1wbC0xXCI+e3sgbW9kZWwuY29uZmlnPy5tZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ/LlswXSB8fCAndmFsdWUnIH19LjwvYj5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICA8L3VsPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RvY3NMaW5rIGxldC1tb2RlbD5cbiAgPGEgW2hyZWZdPVwibW9kZWwuYXBpRG9jc1BhdGggfHwgbW9kZWwuZG9jUGF0aCB8fCBtb2RlbC5wYXRoXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxzcGFuPkRvY3M8L3NwYW4+XG4gICAgPGZhLWljb24gY2xhc3M9XCJtbC0xXCIgW2ljb25dPVwiZmFFeHRlcm5hbExpbmtBbHRcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gIDwvYT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|