@hestia-earth/ui-components 0.28.9 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
- import { ITermJSONLD, NodeType } from '@hestia-earth/schema';
2
- import { IOrchestratorConfig, IOrchestratorModelConfig, IModel } from '../engine.service';
1
+ import { ITermJSONLD } from '@hestia-earth/schema';
2
+ import { allowedType, IOrchestratorConfig, IOrchestratorModelConfig } from '@hestia-earth/config';
3
+ import { IModel } from '../engine.service';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class EngineOrchestratorEditComponent {
5
6
  private readonly hestiaEngineService;
@@ -10,14 +11,14 @@ export declare class EngineOrchestratorEditComponent {
10
11
  protected readonly faList: import("@fortawesome/fontawesome-common-types").IconDefinition;
11
12
  protected readonly faTable: import("@fortawesome/fontawesome-common-types").IconDefinition;
12
13
  protected readonly config: import("@angular/core").InputSignal<IOrchestratorConfig>;
13
- protected readonly nodeType: import("@angular/core").InputSignal<NodeType>;
14
+ protected readonly nodeType: import("@angular/core").InputSignal<allowedType>;
14
15
  private readonly allModels;
15
16
  private readonly termIds;
16
17
  private readonly terms;
17
18
  protected readonly termsById: import("@angular/core").Signal<{
18
19
  [id: string]: ITermJSONLD;
19
20
  }>;
20
- protected readonly configUrl: import("@angular/core").Signal<string>;
21
+ protected readonly configUrl: string;
21
22
  protected readonly modelKeyName: (modelKey: string) => string;
22
23
  protected readonly modelKeyUrl: ({ modelKey }: IModel, model: string) => string;
23
24
  protected readonly isArray: (arg: any) => arg is any[];
@@ -2,10 +2,10 @@ import { InjectionToken } from '@angular/core';
2
2
  import { HttpClient } from '@angular/common/http';
3
3
  import { Observable } from 'rxjs';
4
4
  import { EmissionMethodTier, JSONLD, NodeType, SchemaType, SiteSiteType, TermTermType, blankNodesType } from '@hestia-earth/schema';
5
+ import { allowedType, IOrchestratorConfig, IOrchestratorModelConfig } from '@hestia-earth/config';
5
6
  import { HeCommonService } from '../common/common.service';
6
7
  import * as i0 from "@angular/core";
7
8
  export declare const HE_CALCULATIONS_BASE_URL: InjectionToken<string>;
8
- export declare const HE_ORCHESTRATOR_BASE_URL: InjectionToken<string>;
9
9
  export declare const engineGitBaseUrl: () => string;
10
10
  export declare const engineGitUrl: () => string;
11
11
  export declare const findModels: (models: IModel[], termId: string) => IModel[];
@@ -75,27 +75,14 @@ export interface ICalculationsModel {
75
75
  model: string;
76
76
  key: string;
77
77
  }
78
- export interface IOrchestratorModelConfig {
79
- key: string;
80
- model: string;
81
- value: string;
82
- runStrategy: 'always' | 'add_key_if_missing' | 'add_blank_node_if_missing';
83
- runArgs?: any;
84
- mergeStrategy: 'default' | 'append' | 'list' | 'node';
85
- mergeArgs?: any;
86
- }
87
- export interface IOrchestratorConfig {
88
- models: (IOrchestratorModelConfig | IOrchestratorModelConfig[])[];
89
- }
90
78
  export declare const findOrchestratorModel: ({ models }: IOrchestratorConfig, model: Partial<IOrchestratorModelConfig>) => IOrchestratorModelConfig;
91
79
  export declare class HeEngineService {
92
- private _calculationsBaseUrl;
93
- private _orchestratorBaseUrl;
94
- protected http: HttpClient;
95
- protected commonService: HeCommonService;
80
+ private readonly _calculationsBaseUrl;
81
+ protected readonly http: HttpClient;
82
+ protected readonly commonService: HeCommonService;
96
83
  private modelsLoading;
97
84
  private modelsLoaded;
98
- private _models;
85
+ private readonly _models;
99
86
  private _recommendations;
100
87
  private _requirements;
101
88
  latestVersion$: Observable<string>;
@@ -114,9 +101,7 @@ export declare class HeEngineService {
114
101
  getRequirements$(params: ICalculationsRequirementsParams): Observable<JSONLD<NodeType>>;
115
102
  getRequirements(params: ICalculationsRequirementsParams): Promise<JSONLD<NodeType>>;
116
103
  getTermIds$(params: ICalculationsRequirementsParams): Observable<string[]>;
117
- orchestratorConfigUrl(type?: NodeType): string;
118
- ochestratorConfig$(type: NodeType, id?: string): Observable<IOrchestratorConfig>;
119
- ochestratorConfig(type: NodeType, id?: string): Promise<IOrchestratorConfig>;
104
+ ochestratorConfig$(type: allowedType, id?: string): Observable<IOrchestratorConfig>;
120
105
  static ɵfac: i0.ɵɵFactoryDeclaration<HeEngineService, never>;
121
106
  static ɵprov: i0.ɵɵInjectableDeclaration<HeEngineService>;
122
107
  }
@@ -1,13 +1,14 @@
1
1
  import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';
2
2
  import { NgTemplateOutlet, AsyncPipe, JsonPipe, KeyValuePipe } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
3
4
  import { toObservable, toSignal } from '@angular/core/rxjs-interop';
4
5
  import { NodeType, SchemaType } from '@hestia-earth/schema';
6
+ import { loadConfig } from '@hestia-earth/config';
5
7
  import { keyToLabel, unique } from '@hestia-earth/utils';
6
- import { FormsModule } from '@angular/forms';
7
8
  import { FaIconComponent } from '@fortawesome/angular-fontawesome';
8
9
  import { NgbDropdownModule, NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
9
10
  import { faCog, faExternalLinkAlt, faList, faTable, faTimes } from '@fortawesome/free-solid-svg-icons';
10
- import { combineLatest, from, of } from 'rxjs';
11
+ import { combineLatest, from } from 'rxjs';
11
12
  import { filter, groupBy, map, mergeMap, reduce, startWith, toArray } from 'rxjs/operators';
12
13
  import { HeEngineService, engineGitUrl } from '../engine.service';
13
14
  import { Repository, schemaBaseUrl, gitBranch, gitHome } from '../../common/utils';
@@ -67,7 +68,7 @@ export class EngineOrchestratorEditComponent {
67
68
  this.faTable = faTable;
68
69
  this.config = input();
69
70
  this.nodeType = input();
70
- this.allModels = toSignal(combineLatest([toObservable(this.config), toObservable(this.nodeType)]).pipe(distinctUntilChangedDeep(), mergeMap(([config, nodeType]) => (config ? of(config) : this.hestiaEngineService.ochestratorConfig$(nodeType))), map(({ models }) => models), startWith([])));
71
+ this.allModels = toSignal(combineLatest([toObservable(this.config), toObservable(this.nodeType)]).pipe(distinctUntilChangedDeep(), map(([config, nodeType]) => (config ? config : loadConfig(nodeType))), map(({ models }) => models), startWith([])));
71
72
  this.termIds = computed(() => unique(this.allModels()
72
73
  .flat()
73
74
  .flatMap(model => [model.model, model.value])
@@ -84,7 +85,7 @@ export class EngineOrchestratorEditComponent {
84
85
  }
85
86
  })), map(({ results }) => results)));
86
87
  this.termsById = computed(() => (this.terms() ?? []).reduce((p, c) => ({ ...p, [c['@id']]: c }), {}));
87
- this.configUrl = computed(() => this.hestiaEngineService.orchestratorConfigUrl(this.nodeType()));
88
+ this.configUrl = [gitHome, 'hestia-engine-config'].join('/');
88
89
  this.modelKeyName = modelKeyName;
89
90
  this.modelKeyUrl = modelKeyUrl;
90
91
  this.isArray = Array.isArray;
@@ -131,4 +132,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
131
132
  KeyToLabelPipe
132
133
  ], template: "<p>\n <i>\n The configuration below is a preview of the\n <a [href]=\"configUrl\" target=\"_blank\">JSON configuration file</a>\n used for the orchestration of the HESTIA's calculations.\n </i>\n</p>\n<p>\n <i>Note: not all models might be represented accurately.</i>\n</p>\n\n<div class=\"is-size-7 is-italic\">\n <div class=\"columns is-mobile is-multiline is-vcentered is-variable is-1 my-0\">\n <div class=\"column\">\n <div class=\"pl-3 model-parallel my-3\">\n <span>Models running in parallel</span>\n </div>\n </div>\n\n <div class=\"column is-narrow\">\n <div ngbDropdown #optionDd=\"ngbDropdown\" container=\"body\" placement=\"bottom-end\" autoClose=\"outside\">\n <button\n ngbDropdownToggle\n class=\"button is-ghost\"\n aria-haspopup=\"true\"\n aria-controls=\"option-menu\"\n ngbTooltip=\"Options\"\n placement=\"bottom\"\n container=\"body\"\n [disableTooltip]=\"optionDd.isOpen()\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"faCog\" aria-hidden=\"true\" />\n </span>\n </button>\n <div ngbDropdownMenu id=\"option-menu\" role=\"menu\">\n <div class=\"dropdown-content | is-dropdown-filters\">\n <div class=\"dropdown-item\">\n <div class=\"field\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input search-input is-secondary is-small\"\n [ngModel]=\"search()\"\n name=\"collection\"\n placeholder=\"Filter by key, name or model\"\n (input)=\"search.set($event.target.value)\" />\n <a class=\"icon is-small is-right\" (click)=\"search.set('')\">\n <fa-icon [icon]=\"faTimes\" />\n </a>\n </div>\n </div>\n\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"switch is-small is-rounded is-secondary\"\n [ngModel]=\"showAdvanced()\"\n id=\"showAdvanced\"\n (change)=\"showAdvanced.set($event.target.checked)\" />\n <label class=\"is-size-7\" for=\"showAdvanced\">\n <span>Show advanced data</span>\n </label>\n </div>\n\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"switch is-small is-rounded is-secondary\"\n [ngModel]=\"onlyGapFilled()\"\n id=\"onlyGapFilled\"\n (change)=\"onlyGapFilled.set($event.target.checked)\" />\n <label class=\"is-size-7\" for=\"onlyGapFilled\">\n <span>Show only gap-filled data</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"column is-narrow\">\n <div ngbDropdown #optionDd=\"ngbDropdown\" container=\"body\" placement=\"bottom-end\">\n <button\n ngbDropdownToggle\n class=\"button is-ghost\"\n aria-haspopup=\"true\"\n aria-controls=\"display-menu\"\n ngbTooltip=\"Display options\"\n placement=\"bottom\"\n container=\"body\"\n [disableTooltip]=\"optionDd.isOpen()\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"displayBy() === 'list' ? faList : faTable\" aria-hidden=\"true\" />\n </span>\n </button>\n <div ngbDropdownMenu id=\"display-menu\" role=\"menu\">\n <div class=\"dropdown-content\">\n <a ngbDropdownItem [class.is-selected]=\"displayBy() === 'list'\" (click)=\"displayBy.set('list')\">\n <fa-icon [icon]=\"faList\" aria-hidden=\"true\" />\n <span class=\"pl-2\">Display by Priority</span>\n </a>\n <a ngbDropdownItem [class.is-selected]=\"displayBy() === 'type'\" (click)=\"displayBy.set('type')\">\n <fa-icon [icon]=\"faTable\" aria-hidden=\"true\" />\n <span class=\"pl-2\">Display by Type</span>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n@if (displayBy() === 'list' && models()) {\n <div class=\"pl-3\">\n <ng-container *ngTemplateOutlet=\"modelList; context: { $implicit: models() }\" />\n </div>\n}\n\n@if (displayBy() === 'type' && groupedModels()) {\n <div class=\"tabs\">\n <ul>\n @for (group of groupedModels() | keyvalue; track group.key) {\n <li [class.is-active]=\"selectedGroupedKey() === group.key\">\n <a (click)=\"selectedGroupedKey.set(group.key)\">\n <span class=\"pl-2\">{{ group.key }} ({{ group.value.length }})</span>\n </a>\n </li>\n }\n </ul>\n </div>\n <div class=\"pl-3\">\n <ng-container *ngTemplateOutlet=\"modelList; context: { $implicit: groupedModels()[selectedGroupedKey()] }\" />\n </div>\n}\n\n<ng-template #termLink let-value>\n @if (termsById()[value]) {\n <he-node-link [node]=\"termsById()[value]\" [showExternalLink]=\"true\">\n <span>{{ termsById()[value].name }}</span>\n </he-node-link>\n } @else {\n <span>{{ value | keyToLabel }}</span>\n }\n</ng-template>\n\n<ng-template #modelList let-data>\n @for (v of data; track v) {\n <div>\n <ng-container *ngTemplateOutlet=\"model; context: { $implicit: v }\" />\n </div>\n }\n</ng-template>\n\n<ng-template #model let-data>\n @if (isArray(data) && data.length) {\n <div class=\"pl-3 model-parallel\">\n <ng-container *ngTemplateOutlet=\"modelList; context: { $implicit: data }\" />\n </div>\n <hr />\n }\n @if (!isArray(data)) {\n <div class=\"card mb-2 model-serie is-size-6\">\n <div class=\"card-content p-3\">\n <span class=\"is-capitalized\">{{ data.key | keyToLabel }}</span>\n :\n @if (modelLink$(data) | async; as link) {\n <ng-container *ngTemplateOutlet=\"modelLink; context: { model: data.model, value: data.value, link }\" />\n } @else {\n @if (modelPathLink$(data) | async; as link) {\n <ng-container *ngTemplateOutlet=\"modelPathLink; context: { model: data.model, value: data.value, link }\" />\n } @else {\n <span class=\"default-value\">{{ data.value }}</span>\n <p>\n <span class=\"pr-1\">Model:</span>\n <span class=\"pr-2\">\n <ng-container *ngTemplateOutlet=\"termLink; context: { $implicit: data.model }\" />\n </span>\n </p>\n }\n }\n @if (showAdvanced()) {\n <div>\n @if (data.runStrategy) {\n <div>\n <span class=\"pr-1\">Run strategy:</span>\n <ng-container\n *ngTemplateOutlet=\"strategiesLink; context: { strategy: data.runStrategy, type: 'run' }\" />\n @if (data.runArgs) {\n <div class=\"pl-3 is-size-7\">\n <p><b>Run arguments:</b></p>\n <ng-container *ngTemplateOutlet=\"strategiesArgs; context: { $implicit: data.runArgs }\" />\n </div>\n }\n </div>\n }\n @if (data.mergeStrategy) {\n <div>\n <span class=\"pr-1\">Merge strategy:</span>\n <ng-container\n *ngTemplateOutlet=\"strategiesLink; context: { strategy: data.mergeStrategy, type: 'merge' }\" />\n @if (data.mergeArgs) {\n <div class=\"pl-3 is-size-7\">\n <p><b>Merge arguments:</b></p>\n <ng-container *ngTemplateOutlet=\"strategiesArgs; context: { $implicit: data.mergeArgs }\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n\n<ng-template #modelLinkKey let-model=\"model\" let-link=\"link\">\n <a [href]=\"modelKeyUrl(link, model)\" target=\"_blank\">{{ modelKeyName(link.modelKey) }}</a>\n</ng-template>\n\n<ng-template #modelLink let-model=\"model\" let-link=\"link\" let-value=\"value\">\n @if (link.term) {\n <ng-container *ngTemplateOutlet=\"termLink; context: { $implicit: link.term }\" />\n }\n\n @if (!link.term && !link?.modelKey) {\n <span class=\"default-value\">{{ value }}</span>\n }\n\n @if (!link.term && link?.modelKey) {\n <ng-container *ngTemplateOutlet=\"modelLinkKey; context: { link, model }\" />\n }\n\n <p class=\"model-link\">\n <span class=\"pr-1\">Model:</span>\n <span class=\"pr-2\">\n <ng-container *ngTemplateOutlet=\"termLink; context: { $implicit: model }\" />\n </span>\n\n <a class=\"is-size-7\" [href]=\"link.docPath\" target=\"_blank\">\n <span class=\"pr-1\">(View Docs)</span>\n <fa-icon [icon]=\"faExternalLinkAlt\" />\n </a>\n </p>\n</ng-template>\n\n<ng-template #modelPathLink let-model=\"model\" let-link=\"link\" let-value=\"value\">\n @if (!link?.modelKey) {\n <span class=\"default-value\">{{ value }}</span>\n }\n\n @if (link?.modelKey) {\n <ng-container *ngTemplateOutlet=\"modelLinkKey; context: { link, model }\" />\n }\n\n <p class=\"model-path-link\">\n <span class=\"pr-1\">Model:</span>\n <span class=\"pr-2\">\n <ng-container *ngTemplateOutlet=\"termLink; context: { $implicit: model }\" />\n </span>\n\n <a class=\"is-size-7\" [href]=\"link.docPath\" target=\"_blank\">\n <span class=\"pr-1\">(View Docs)</span>\n <fa-icon [icon]=\"faExternalLinkAlt\" />\n </a>\n </p>\n</ng-template>\n\n<ng-template #strategiesLink let-strategy=\"strategy\" let-type=\"type\">\n <span class=\"pr-2 is-inline-block\">\n <code>{{ strategy }}</code>\n </span>\n\n <a\n class=\"is-size-7\"\n [href]=\"strategiesDocs + '/' + type + '/' + (type === 'merge' ? 'merge_' : '') + strategy + '.md'\"\n target=\"_blank\">\n <span class=\"pr-1\">(View Docs)</span>\n <fa-icon [icon]=\"faExternalLinkAlt\" />\n </a>\n</ng-template>\n\n<ng-template #strategiesArgs let-args>\n <div class=\"pl-2\">\n @for (arg of args | keyvalue; track arg) {\n <p>\n <span class=\"has-text-underline\">{{ arg.key }}</span>\n :\n <code>{{ arg.value | json }}</code>\n </p>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block}.model-parallel{border-left:3px solid #4a4a4a}.dropdown-content.is-dropdown-filters{min-width:250px}\n"] }]
133
134
  }], ctorParameters: () => [] });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLW9yY2hlc3RyYXRvci1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9lbmdpbmUvZW5naW5lLW9yY2hlc3RyYXRvci1lZGl0L2VuZ2luZS1vcmNoZXN0cmF0b3ItZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvZW5naW5lL2VuZ2luZS1vcmNoZXN0cmF0b3ItZWRpdC9lbmdpbmUtb3JjaGVzdHJhdG9yLWVkaXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFlLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RyxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFB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cG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgQXN5bmNQaXBlLCBKc29uUGlwZSwgS2V5VmFsdWVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBJVGVybUpTT05MRCwgTm9kZVR5cGUsIFNjaGVtYVR5cGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBrZXlUb0xhYmVsLCB1bmlxdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgTmdiRHJvcGRvd25Nb2R1bGUsIE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBmYUNvZywgZmFFeHRlcm5hbExpbmtBbHQsIGZhTGlzdCwgZmFUYWJsZSwgZmFUaW1lcyB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBncm91cEJ5LCBtYXAsIG1lcmdlTWFwLCByZWR1Y2UsIHN0YXJ0V2l0aCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgSGVFbmdpbmVTZXJ2aWNlLFxuICBJT3JjaGVzdHJhdG9yQ29uZmlnLFxuICBJT3JjaGVzdHJhdG9yTW9kZWxDb25maWcsXG4gIGVuZ2luZUdpdFVybCxcbiAgSU1vZGVsXG59IGZyb20gJy4uL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9zaXRvcnksIHNjaGVtYUJhc2VVcmwsIGdpdEJyYW5jaCwgZ2l0SG9tZSB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAgfSBmcm9tICcuLi8uLi9jb21tb24vcnhqcy11dGlscyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vcGx1cmFsaXplJztcbmltcG9ydCB7IEhlU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBtYXRjaElkLCBtYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IEtleVRvTGFiZWxQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2tleS10by1sYWJlbC5waXBlJztcbmltcG9ydCB7IE5vZGVMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWxpbmsvbm9kZS1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGlja091dHNpZGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb21tb24vY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUnO1xuXG50eXBlIGNvbmZpZ3MgPSAoSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnIHwgSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnW10pW107XG5cbmNvbnN0IGdpdFVybCA9IGAke2dpdEhvbWV9LyR7UmVwb3NpdG9yeS5vcmNoZXN0cmF0b3J9Ly0vYmxvYi8ke2dpdEJyYW5jaCgpfWA7XG5jb25zdCBnZW5lcmFsRG9jc1VybCA9IGAke2dpdFVybH0vaGVzdGlhX2VhcnRoL29yY2hlc3RyYXRvci9jb25maWcvUkVBRE1FLm1kYDtcbmNvbnN0IHN0cmF0ZWdpZXNEb2NzID0gYCR7Z2l0VXJsfS9oZXN0aWFfZWFydGgvb3JjaGVzdHJhdG9yL3N0cmF0ZWdpZXNgO1xuXG5jb25zdCBzY2hlbWFUeXBlS2V5cyA9IE9iamVjdC5rZXlzKFNjaGVtYVR5cGUpO1xuXG5jb25zdCB0b1NjaGVtYVR5cGUgPSAodmFsdWU6IHN0cmluZykgPT4ga2V5VG9MYWJlbCh2YWx1ZSkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuY29uc3QgaXNTY2hlbWFUeXBlID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIFtcbiAgICBzY2hlbWFUeXBlS2V5cy5pbmNsdWRlcyh2YWx1ZSksXG4gICAgc2NoZW1hVHlwZUtleXMuaW5jbHVkZXMocGx1cmFsaXplKHZhbHVlLCAxKSksXG4gICAgc2NoZW1hVHlwZUtleXMuaW5jbHVkZXMocGx1cmFsaXplKHRvU2NoZW1hVHlwZSh2YWx1ZSksIDEpKSxcbiAgICBbJ2VtaXNzaW9uc1Jlc291cmNlVXNlJywgJ2ltcGFjdHMnLCAnZW5kcG9pbnRzJ10uaW5jbHVkZXModmFsdWUpXG4gIF0uc29tZShCb29sZWFuKTtcblxuY29uc3QgaXNHYXBGaWxsZWQgPSAoeyBydW5TdHJhdGVneSwgbWVyZ2VTdHJhdGVneSwgbWVyZ2VBcmdzIH06IElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZykgPT5cbiAgWydhZGRfYmxhbmtfbm9kZV9pZl9taXNzaW5nJywgJ2FkZF9rZXlfaWZfbWlzc2luZyddLmluY2x1ZGVzKHJ1blN0cmF0ZWd5KSAmJlxuICAobWVyZ2VTdHJhdGVneSAhPT0gJ2xpc3QnIHx8ICFtZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQpO1xuXG5jb25zdCBpc1JlY2FsY3VsYXRlZCA9ICh7IHJ1blN0cmF0ZWd5LCBtZXJnZVN0cmF0ZWd5LCBtZXJnZUFyZ3MgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSA9PlxuICBbJ2FkZF9ibGFua19ub2RlX2lmX21pc3NpbmcnLCAnYWRkX2tleV9pZl9taXNzaW5nJ10uaW5jbHVkZXMocnVuU3RyYXRlZ3kpICYmXG4gIG1lcmdlU3RyYXRlZ3kgPT09ICdsaXN0JyAmJlxuICBtZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ7XG5cbmNvbnN0IGZpbHRlckdhcEZpbGxlZCA9IChjb25maWdzOiBjb25maWdzLCBvbmx5R2FwRmlsbGVkOiBib29sZWFuKSA9PlxuICBjb25maWdzXG4gICAgLm1hcChtb2RlbCA9PiAoQXJyYXkuaXNBcnJheShtb2RlbCkgJiYgb25seUdhcEZpbGxlZCA/IG1vZGVsLmZpbHRlcihpc0dhcEZpbGxlZCkgOiBtb2RlbCkpXG4gICAgLmZpbHRlcihtb2RlbCA9PiAhb25seUdhcEZpbGxlZCB8fCBBcnJheS5pc0FycmF5KG1vZGVsKSB8fCBpc0dhcEZpbGxlZChtb2RlbCkpO1xuXG5jb25zdCBtb2RlbE1hdGNoID1cbiAgKHRlcm06IHN0cmluZykgPT5cbiAgKHsga2V5LCBtb2RlbCwgdmFsdWUgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSA9PlxuICAgIFtrZXksIG1vZGVsLCB2YWx1ZV0uZmlsdGVyKEJvb2xlYW4pLnNvbWUodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSk7XG5cbmNvbnN0IGZpbHRlck1vZGVscyA9IChjb25maWdzOiBjb25maWdzLCB0ZXJtID0gJycpID0+XG4gIGNvbmZpZ3NcbiAgICAubWFwKG1vZGVsID0+IChBcnJheS5pc0FycmF5KG1vZGVsKSAmJiAhIXRlcm0gPyBtb2RlbC5maWx0ZXIobW9kZWxNYXRjaCh0ZXJtKSkgOiBtb2RlbCkpXG4gICAgLmZpbHRlcihtb2RlbCA9PiAhdGVybSB8fCBBcnJheS5pc0FycmF5KG1vZGVsKSB8fCBtb2RlbE1hdGNoKHRlcm0pKG1vZGVsKSk7XG5cbmNvbnN0IG1vZGVsS2V5TmFtZSA9IChtb2RlbEtleTogc3RyaW5nKSA9PiAobW9kZWxLZXkuaW5jbHVkZXMoJy4nKSA/IG1vZGVsS2V5LnNwbGl0KCcuJylbMV0gOiBtb2RlbEtleSk7XG5cbmNvbnN0IGdyb3VwQ29uZmlnJCA9IChjb25maWdzOiBjb25maWdzKSA9PlxuICBmcm9tKGNvbmZpZ3MuZmxhdCgpKS5waXBlKFxuICAgIGZpbHRlcigoeyBrZXkgfSkgPT4gaXNTY2hlbWFUeXBlKGtleSkpLFxuICAgIGdyb3VwQnkoKHsga2V5IH0pID0+IGtleSksXG4gICAgbWVyZ2VNYXAoZ3JvdXAgPT4gZ3JvdXAucGlwZSh0b0FycmF5KCkpKSxcbiAgICByZWR1Y2UoXG4gICAgICAocHJldiwgY3VycikgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBjdXJyWzBdLmtleTtcbiAgICAgICAgcHJldlt0b1NjaGVtYVR5cGUoa2V5KV0gPSBjdXJyO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7IFtrZXk6IHN0cmluZ106IElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZ1tdIH1cbiAgICApXG4gICk7XG5cbmNvbnN0IG1vZGVsS2V5VXJsID0gKHsgbW9kZWxLZXkgfTogSU1vZGVsLCBtb2RlbDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhcnRzID0gbW9kZWxLZXkuc3BsaXQoJy4nKTtcbiAgY29uc3Qgc2NoZW1hVHlwZSA9IHBhcnRzLmxlbmd0aCA9PT0gMiA/IHBhcnRzWzBdIDogbW9kZWw7XG4gIGNvbnN0IHVybCA9IFtzY2hlbWFCYXNlVXJsKCksIHRvU2NoZW1hVHlwZShzY2hlbWFUeXBlKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy8nKTtcbiAgcmV0dXJuIGlzU2NoZW1hVHlwZShzY2hlbWFUeXBlKSA/IGAke3VybH0jJHtwYXJ0cy5wb3AoKX1gIDogbnVsbDtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWVuZ2luZS1vcmNoZXN0cmF0b3ItZWRpdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbmdpbmUtb3JjaGVzdHJhdG9yLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbmdpbmUtb3JjaGVzdHJhdG9yLWVkaXQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIEpzb25QaXBlLFxuICAgIENsaWNrT3V0c2lkZURpcmVjdGl2ZSxcbiAgICBOZ2JUb29sdGlwLFxuICAgIE5nYkRyb3Bkb3duTW9kdWxlLFxuICAgIEZhSWNvbkNvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5vZGVMaW5rQ29tcG9uZW50LFxuICAgIEtleVRvTGFiZWxQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRW5naW5lT3JjaGVzdHJhdG9yRWRpdENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVzdGlhRW5naW5lU2VydmljZSA9IGluamVjdChIZUVuZ2luZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaFNlcnZpY2UgPSBpbmplY3QoSGVTZWFyY2hTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFFeHRlcm5hbExpbmtBbHQgPSBmYUV4dGVybmFsTGlua0FsdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhVGltZXMgPSBmYVRpbWVzO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFDb2cgPSBmYUNvZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhTGlzdCA9IGZhTGlzdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhVGFibGUgPSBmYVRhYmxlO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWcgPSBpbnB1dDxJT3JjaGVzdHJhdG9yQ29uZmlnPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZVR5cGUgPSBpbnB1dDxOb2RlVHlwZT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbE1vZGVscyA9IHRvU2lnbmFsKFxuICAgIGNvbWJpbmVMYXRlc3QoW3RvT2JzZXJ2YWJsZSh0aGlzLmNvbmZpZyksIHRvT2JzZXJ2YWJsZSh0aGlzLm5vZGVUeXBlKV0pLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAoKSxcbiAgICAgIG1lcmdlTWFwKChbY29uZmlnLCBub2RlVHlwZV0pID0+IChjb25maWcgPyBvZihjb25maWcpIDogdGhpcy5oZXN0aWFFbmdpbmVTZXJ2aWNlLm9jaGVzdHJhdG9yQ29uZmlnJChub2RlVHlwZSkpKSxcbiAgICAgIG1hcCgoeyBtb2RlbHMgfSkgPT4gbW9kZWxzKSxcbiAgICAgIHN0YXJ0V2l0aChbXSBhcyBjb25maWdzKVxuICAgIClcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXJtSWRzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB1bmlxdWUoXG4gICAgICB0aGlzLmFsbE1vZGVscygpXG4gICAgICAgIC5mbGF0KClcbiAgICAgICAgLmZsYXRNYXAobW9kZWwgPT4gW21vZGVsLm1vZGVsLCBtb2RlbC52YWx1ZV0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICApXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVybXMgPSB0b1NpZ25hbChcbiAgICB0b09ic2VydmFibGUodGhpcy50ZXJtSWRzKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoaWRzID0+XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2gkPElUZXJtSlNPTkxELCBOb2RlVHlwZS5UZXJtPih7XG4gICAgICAgICAgZmllbGRzOiBbJ0B0eXBlJywgJ0BpZCcsICduYW1lJywgJ3VuaXRzJ10sXG4gICAgICAgICAgbGltaXQ6IGlkcy5sZW5ndGgsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgICAgbXVzdDogW21hdGNoVHlwZShOb2RlVHlwZS5UZXJtKV0sXG4gICAgICAgICAgICAgIHNob3VsZDogaWRzLm1hcChtYXRjaElkKSxcbiAgICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgbWFwKCh7IHJlc3VsdHMgfSkgPT4gcmVzdWx0cylcbiAgICApXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0ZXJtc0J5SWQgPSBjb21wdXRlZCgoKSA9PlxuICAgICh0aGlzLnRlcm1zKCkgPz8gW10pLnJlZHVjZSgocCwgYykgPT4gKHsgLi4ucCwgW2NbJ0BpZCddXTogYyB9KSwge30gYXMgeyBbaWQ6IHN0cmluZ106IElUZXJtSlNPTkxEIH0pXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ1VybCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGVzdGlhRW5naW5lU2VydmljZS5vcmNoZXN0cmF0b3JDb25maWdVcmwodGhpcy5ub2RlVHlwZSgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZGVsS2V5TmFtZSA9IG1vZGVsS2V5TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZGVsS2V5VXJsID0gbW9kZWxLZXlVcmw7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYWxEb2NzVXJsID0gZ2VuZXJhbERvY3NVcmw7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdHJhdGVnaWVzRG9jcyA9IHN0cmF0ZWdpZXNEb2NzO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWFyY2ggPSBzaWduYWwoJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25seUdhcEZpbGxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93QWR2YW5jZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcGxheUJ5ID0gc2lnbmFsPCdsaXN0JyB8ICd0eXBlJz4oJ2xpc3QnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9kZWxzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBmaWx0ZXJNb2RlbHMoZmlsdGVyR2FwRmlsbGVkKHRoaXMuYWxsTW9kZWxzKCksIHRoaXMub25seUdhcEZpbGxlZCgpKSwgdGhpcy5zZWFyY2goKSlcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyb3VwZWRNb2RlbHMgPSB0b1NpZ25hbCh0b09ic2VydmFibGUodGhpcy5tb2RlbHMpLnBpcGUobWVyZ2VNYXAoZ3JvdXBDb25maWckKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRHcm91cGVkS2V5ID0gc2lnbmFsPHN0cmluZz4odW5kZWZpbmVkKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHRoaXMuZ3JvdXBlZE1vZGVscygpKT8uWzBdO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHcm91cGVkS2V5KCkgJiYga2V5KSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwZWRLZXkuc2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vZGVsTGluayQoeyBtb2RlbCwgdmFsdWUgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVzdGlhRW5naW5lU2VydmljZS5tb2RlbCQoeyBtb2RlbCwgdGVybTogdmFsdWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9kZWxQYXRoTGluayQoeyBtb2RlbCwgdmFsdWUgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVzdGlhRW5naW5lU2VydmljZS5tb2RlbCQoe1xuICAgICAgcGF0aDogYCR7ZW5naW5lR2l0VXJsKCl9L2hlc3RpYV9lYXJ0aC9tb2RlbHMvJHttb2RlbH0vJHsodmFsdWUgfHwgJycpLnJlcGxhY2UoJy4nLCAnLycpfS5weWBcbiAgICB9KTtcbiAgfVxufVxuIiwiPHA+XG4gIDxpPlxuICAgIFRoZSBjb25maWd1cmF0aW9uIGJlbG93IGlzIGEgcHJldmlldyBvZiB0aGVcbiAgICA8YSBbaHJlZl09XCJjb25maWdVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5KU09OIGNvbmZpZ3VyYXRpb24gZmlsZTwvYT5cbiAgICB1c2VkIGZvciB0aGUgb3JjaGVzdHJhdGlvbiBvZiB0aGUgSEVTVElBJ3MgY2FsY3VsYXRpb25zLlxuICA8L2k+XG48L3A+XG48cD5cbiAgPGk+Tm90ZTogbm90IGFsbCBtb2RlbHMgbWlnaHQgYmUgcmVwcmVzZW50ZWQgYWNjdXJhdGVseS48L2k+XG48L3A+XG5cbjxkaXYgY2xhc3M9XCJpcy1zaXplLTcgaXMtaXRhbGljXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy1tdWx0aWxpbmUgaXMtdmNlbnRlcmVkIGlzLXZhcmlhYmxlIGlzLTEgbXktMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwbC0zIG1vZGVsLXBhcmFsbGVsIG15LTNcIj5cbiAgICAgICAgPHNwYW4+TW9kZWxzIHJ1bm5pbmcgaW4gcGFyYWxsZWw8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICA8ZGl2IG5nYkRyb3Bkb3duICNvcHRpb25EZD1cIm5nYkRyb3Bkb3duXCIgY29udGFpbmVyPVwiYm9keVwiIHBsYWNlbWVudD1cImJvdHRvbS1lbmRcIiBhdXRvQ2xvc2U9XCJvdXRzaWRlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZVxuICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLWdob3N0XCJcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgYXJpYS1jb250cm9scz1cIm9wdGlvbi1tZW51XCJcbiAgICAgICAgICBuZ2JUb29sdGlwPVwiT3B0aW9uc1wiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICBbZGlzYWJsZVRvb2x0aXBdPVwib3B0aW9uRGQuaXNPcGVuKClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhQ29nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBpZD1cIm9wdGlvbi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudCB8IGlzLWRyb3Bkb3duLWZpbHRlcnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkIGhhcy1pY29ucy1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCBzZWFyY2gtaW5wdXQgaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29sbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGJ5IGtleSwgbmFtZSBvciBtb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJzZWFyY2guc2V0KCRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiIChjbGljayk9XCJzZWFyY2guc2V0KCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYVRpbWVzXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGlzLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzd2l0Y2ggaXMtc21hbGwgaXMtcm91bmRlZCBpcy1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2hvd0FkdmFuY2VkKClcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJzaG93QWR2YW5jZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzaG93QWR2YW5jZWQuc2V0KCRldmVudC50YXJnZXQuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImlzLXNpemUtN1wiIGZvcj1cInNob3dBZHZhbmNlZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvdyBhZHZhbmNlZCBkYXRhPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBpcy1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3dpdGNoIGlzLXNtYWxsIGlzLXJvdW5kZWQgaXMtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9ubHlHYXBGaWxsZWQoKVwiXG4gICAgICAgICAgICAgICAgICBpZD1cIm9ubHlHYXBGaWxsZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbmx5R2FwRmlsbGVkLnNldCgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpcy1zaXplLTdcIiBmb3I9XCJvbmx5R2FwRmlsbGVkXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5TaG93IG9ubHkgZ2FwLWZpbGxlZCBkYXRhPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gI29wdGlvbkRkPVwibmdiRHJvcGRvd25cIiBjb250YWluZXI9XCJib2R5XCIgcGxhY2VtZW50PVwiYm90dG9tLWVuZFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1naG9zdFwiXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJkaXNwbGF5LW1lbnVcIlxuICAgICAgICAgIG5nYlRvb2x0aXA9XCJEaXNwbGF5IG9wdGlvbnNcIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgW2Rpc2FibGVUb29sdGlwXT1cIm9wdGlvbkRkLmlzT3BlbigpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJkaXNwbGF5QnkoKSA9PT0gJ2xpc3QnID8gZmFMaXN0IDogZmFUYWJsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgaWQ9XCJkaXNwbGF5LW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gW2NsYXNzLmlzLXNlbGVjdGVkXT1cImRpc3BsYXlCeSgpID09PSAnbGlzdCdcIiAoY2xpY2spPVwiZGlzcGxheUJ5LnNldCgnbGlzdCcpXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhTGlzdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkRpc3BsYXkgYnkgUHJpb3JpdHk8L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gW2NsYXNzLmlzLXNlbGVjdGVkXT1cImRpc3BsYXlCeSgpID09PSAndHlwZSdcIiAoY2xpY2spPVwiZGlzcGxheUJ5LnNldCgndHlwZScpXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhVGFibGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5EaXNwbGF5IGJ5IFR5cGU8L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbkBpZiAoZGlzcGxheUJ5KCkgPT09ICdsaXN0JyAmJiBtb2RlbHMoKSkge1xuICA8ZGl2IGNsYXNzPVwicGwtM1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlbExpc3Q7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBtb2RlbHMoKSB9XCIgLz5cbiAgPC9kaXY+XG59XG5cbkBpZiAoZGlzcGxheUJ5KCkgPT09ICd0eXBlJyAmJiBncm91cGVkTW9kZWxzKCkpIHtcbiAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8dWw+XG4gICAgICBAZm9yIChncm91cCBvZiBncm91cGVkTW9kZWxzKCkgfCBrZXl2YWx1ZTsgdHJhY2sgZ3JvdXAua2V5KSB7XG4gICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkR3JvdXBlZEtleSgpID09PSBncm91cC5rZXlcIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cGVkS2V5LnNldChncm91cC5rZXkpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj57eyBncm91cC5rZXkgfX0gKHt7IGdyb3VwLnZhbHVlLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicGwtM1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlbExpc3Q7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBncm91cGVkTW9kZWxzKClbc2VsZWN0ZWRHcm91cGVkS2V5KCldIH1cIiAvPlxuICA8L2Rpdj5cbn1cblxuPG5nLXRlbXBsYXRlICN0ZXJtTGluayBsZXQtdmFsdWU+XG4gIEBpZiAodGVybXNCeUlkKClbdmFsdWVdKSB7XG4gICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJ0ZXJtc0J5SWQoKVt2YWx1ZV1cIiBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCI+XG4gICAgICA8c3Bhbj57eyB0ZXJtc0J5SWQoKVt2YWx1ZV0ubmFtZSB9fTwvc3Bhbj5cbiAgICA8L2hlLW5vZGUtbGluaz5cbiAgfSBAZWxzZSB7XG4gICAgPHNwYW4+e3sgdmFsdWUgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGlzdCBsZXQtZGF0YT5cbiAgQGZvciAodiBvZiBkYXRhOyB0cmFjayB2KSB7XG4gICAgPGRpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHYgfVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kZWwgbGV0LWRhdGE+XG4gIEBpZiAoaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCkge1xuICAgIDxkaXYgY2xhc3M9XCJwbC0zIG1vZGVsLXBhcmFsbGVsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kZWxMaXN0OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0YSB9XCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8aHIgLz5cbiAgfVxuICBAaWYgKCFpc0FycmF5KGRhdGEpKSB7XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMiBtb2RlbC1zZXJpZSBpcy1zaXplLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgcC0zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtY2FwaXRhbGl6ZWRcIj57eyBkYXRhLmtleSB8IGtleVRvTGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDpcbiAgICAgICAgQGlmIChtb2RlbExpbmskKGRhdGEpIHwgYXN5bmM7IGFzIGxpbmspIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kZWxMaW5rOyBjb250ZXh0OiB7IG1vZGVsOiBkYXRhLm1vZGVsLCB2YWx1ZTogZGF0YS52YWx1ZSwgbGluayB9XCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGlmIChtb2RlbFBhdGhMaW5rJChkYXRhKSB8IGFzeW5jOyBhcyBsaW5rKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kZWxQYXRoTGluazsgY29udGV4dDogeyBtb2RlbDogZGF0YS5tb2RlbCwgdmFsdWU6IGRhdGEudmFsdWUsIGxpbmsgfVwiIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRlZmF1bHQtdmFsdWVcIj57eyBkYXRhLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPk1vZGVsOjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0yXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlcm1MaW5rOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0YS5tb2RlbCB9XCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNob3dBZHZhbmNlZCgpKSB7XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIEBpZiAoZGF0YS5ydW5TdHJhdGVneSkge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPlJ1biBzdHJhdGVneTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdHJhdGVnaWVzTGluazsgY29udGV4dDogeyBzdHJhdGVneTogZGF0YS5ydW5TdHJhdGVneSwgdHlwZTogJ3J1bicgfVwiIC8+XG4gICAgICAgICAgICAgICAgQGlmIChkYXRhLnJ1bkFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbC0zIGlzLXNpemUtN1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD48Yj5SdW4gYXJndW1lbnRzOjwvYj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdHJhdGVnaWVzQXJnczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGEucnVuQXJncyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGRhdGEubWVyZ2VTdHJhdGVneSkge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPk1lcmdlIHN0cmF0ZWd5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInN0cmF0ZWdpZXNMaW5rOyBjb250ZXh0OiB7IHN0cmF0ZWd5OiBkYXRhLm1lcmdlU3RyYXRlZ3ksIHR5cGU6ICdtZXJnZScgfVwiIC8+XG4gICAgICAgICAgICAgICAgQGlmIChkYXRhLm1lcmdlQXJncykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTMgaXMtc2l6ZS03XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPjxiPk1lcmdlIGFyZ3VtZW50czo8L2I+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RyYXRlZ2llc0FyZ3M7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBkYXRhLm1lcmdlQXJncyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGlua0tleSBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1saW5rPVwibGlua1wiPlxuICA8YSBbaHJlZl09XCJtb2RlbEtleVVybChsaW5rLCBtb2RlbClcIiB0YXJnZXQ9XCJfYmxhbmtcIj57eyBtb2RlbEtleU5hbWUobGluay5tb2RlbEtleSkgfX08L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGluayBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1saW5rPVwibGlua1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIEBpZiAobGluay50ZXJtKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlcm1MaW5rOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGluay50ZXJtIH1cIiAvPlxuICB9XG5cbiAgQGlmICghbGluay50ZXJtICYmICFsaW5rPy5tb2RlbEtleSkge1xuICAgIDxzcGFuIGNsYXNzPVwiZGVmYXVsdC12YWx1ZVwiPnt7IHZhbHVlIH19PC9zcGFuPlxuICB9XG5cbiAgQGlmICghbGluay50ZXJtICYmIGxpbms/Lm1vZGVsS2V5KSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGVsTGlua0tleTsgY29udGV4dDogeyBsaW5rLCBtb2RlbCB9XCIgLz5cbiAgfVxuXG4gIDxwIGNsYXNzPVwibW9kZWwtbGlua1wiPlxuICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPk1vZGVsOjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInByLTJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXJtTGluazsgY29udGV4dDogeyAkaW1wbGljaXQ6IG1vZGVsIH1cIiAvPlxuICAgIDwvc3Bhbj5cblxuICAgIDxhIGNsYXNzPVwiaXMtc2l6ZS03XCIgW2hyZWZdPVwibGluay5kb2NQYXRoXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInByLTFcIj4oVmlldyBEb2NzKTwvc3Bhbj5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhRXh0ZXJuYWxMaW5rQWx0XCIgLz5cbiAgICA8L2E+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kZWxQYXRoTGluayBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1saW5rPVwibGlua1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIEBpZiAoIWxpbms/Lm1vZGVsS2V5KSB7XG4gICAgPHNwYW4gY2xhc3M9XCJkZWZhdWx0LXZhbHVlXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gIH1cblxuICBAaWYgKGxpbms/Lm1vZGVsS2V5KSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGVsTGlua0tleTsgY29udGV4dDogeyBsaW5rLCBtb2RlbCB9XCIgLz5cbiAgfVxuXG4gIDxwIGNsYXNzPVwibW9kZWwtcGF0aC1saW5rXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+TW9kZWw6PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicHItMlwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlcm1MaW5rOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbW9kZWwgfVwiIC8+XG4gICAgPC9zcGFuPlxuXG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiBbaHJlZl09XCJsaW5rLmRvY1BhdGhcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPihWaWV3IERvY3MpPC9zcGFuPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFFeHRlcm5hbExpbmtBbHRcIiAvPlxuICAgIDwvYT5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdHJhdGVnaWVzTGluayBsZXQtc3RyYXRlZ3k9XCJzdHJhdGVneVwiIGxldC10eXBlPVwidHlwZVwiPlxuICA8c3BhbiBjbGFzcz1cInByLTIgaXMtaW5saW5lLWJsb2NrXCI+XG4gICAgPGNvZGU+e3sgc3RyYXRlZ3kgfX08L2NvZGU+XG4gIDwvc3Bhbj5cblxuICA8YVxuICAgIGNsYXNzPVwiaXMtc2l6ZS03XCJcbiAgICBbaHJlZl09XCJzdHJhdGVnaWVzRG9jcyArICcvJyArIHR5cGUgKyAnLycgKyAodHlwZSA9PT0gJ21lcmdlJyA/ICdtZXJnZV8nIDogJycpICsgc3RyYXRlZ3kgKyAnLm1kJ1wiXG4gICAgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+KFZpZXcgRG9jcyk8L3NwYW4+XG4gICAgPGZhLWljb24gW2ljb25dPVwiZmFFeHRlcm5hbExpbmtBbHRcIiAvPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N0cmF0ZWdpZXNBcmdzIGxldC1hcmdzPlxuICA8ZGl2IGNsYXNzPVwicGwtMlwiPlxuICAgIEBmb3IgKGFyZyBvZiBhcmdzIHwga2V5dmFsdWU7IHRyYWNrIGFyZykge1xuICAgICAgPHA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLXRleHQtdW5kZXJsaW5lXCI+e3sgYXJnLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgOlxuICAgICAgICA8Y29kZT57eyBhcmcudmFsdWUgfCBqc29uIH19PC9jb2RlPlxuICAgICAgPC9wPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLW9yY2hlc3RyYXRvci1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9lbmdpbmUvZW5naW5lLW9yY2hlc3RyYXRvci1lZGl0L2VuZ2luZS1vcmNoZXN0cmF0b3ItZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvZW5naW5lL2VuZ2luZS1vcmNoZXN0cmF0b3ItZWRpdC9lbmdpbmUtb3JjaGVzdHJhdG9yLWVkaXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBZSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUE4RCxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0UsT0FBTyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZH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IGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgQXN5bmNQaXBlLCBKc29uUGlwZSwgS2V5VmFsdWVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IElUZXJtSlNPTkxELCBOb2RlVHlwZSwgU2NoZW1hVHlwZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGFsbG93ZWRUeXBlLCBJT3JjaGVzdHJhdG9yQ29uZmlnLCBJT3JjaGVzdHJhdG9yTW9kZWxDb25maWcsIGxvYWRDb25maWcgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2NvbmZpZyc7XG5pbXBvcnQgeyBrZXlUb0xhYmVsLCB1bmlxdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IEZhSWNvbkNvbXBvbmVudCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7IE5nYkRyb3Bkb3duTW9kdWxlLCBOZ2JUb29sdGlwIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgZmFDb2csIGZhRXh0ZXJuYWxMaW5rQWx0LCBmYUxpc3QsIGZhVGFibGUsIGZhVGltZXMgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBncm91cEJ5LCBtYXAsIG1lcmdlTWFwLCByZWR1Y2UsIHN0YXJ0V2l0aCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgSGVFbmdpbmVTZXJ2aWNlLCBlbmdpbmVHaXRVcmwsIElNb2RlbCB9IGZyb20gJy4uL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9zaXRvcnksIHNjaGVtYUJhc2VVcmwsIGdpdEJyYW5jaCwgZ2l0SG9tZSB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAgfSBmcm9tICcuLi8uLi9jb21tb24vcnhqcy11dGlscyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vcGx1cmFsaXplJztcbmltcG9ydCB7IEhlU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBtYXRjaElkLCBtYXRjaFR5cGUgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IEtleVRvTGFiZWxQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2tleS10by1sYWJlbC5waXBlJztcbmltcG9ydCB7IE5vZGVMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWxpbmsvbm9kZS1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGlja091dHNpZGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb21tb24vY2xpY2stb3V0c2lkZS5kaXJlY3RpdmUnO1xuXG50eXBlIGNvbmZpZ3MgPSAoSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnIHwgSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnW10pW107XG5cbmNvbnN0IGdpdFVybCA9IGAke2dpdEhvbWV9LyR7UmVwb3NpdG9yeS5vcmNoZXN0cmF0b3J9Ly0vYmxvYi8ke2dpdEJyYW5jaCgpfWA7XG5jb25zdCBnZW5lcmFsRG9jc1VybCA9IGAke2dpdFVybH0vaGVzdGlhX2VhcnRoL29yY2hlc3RyYXRvci9jb25maWcvUkVBRE1FLm1kYDtcbmNvbnN0IHN0cmF0ZWdpZXNEb2NzID0gYCR7Z2l0VXJsfS9oZXN0aWFfZWFydGgvb3JjaGVzdHJhdG9yL3N0cmF0ZWdpZXNgO1xuXG5jb25zdCBzY2hlbWFUeXBlS2V5cyA9IE9iamVjdC5rZXlzKFNjaGVtYVR5cGUpO1xuXG5jb25zdCB0b1NjaGVtYVR5cGUgPSAodmFsdWU6IHN0cmluZykgPT4ga2V5VG9MYWJlbCh2YWx1ZSkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuY29uc3QgaXNTY2hlbWFUeXBlID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIFtcbiAgICBzY2hlbWFUeXBlS2V5cy5pbmNsdWRlcyh2YWx1ZSksXG4gICAgc2NoZW1hVHlwZUtleXMuaW5jbHVkZXMocGx1cmFsaXplKHZhbHVlLCAxKSksXG4gICAgc2NoZW1hVHlwZUtleXMuaW5jbHVkZXMocGx1cmFsaXplKHRvU2NoZW1hVHlwZSh2YWx1ZSksIDEpKSxcbiAgICBbJ2VtaXNzaW9uc1Jlc291cmNlVXNlJywgJ2ltcGFjdHMnLCAnZW5kcG9pbnRzJ10uaW5jbHVkZXModmFsdWUpXG4gIF0uc29tZShCb29sZWFuKTtcblxuY29uc3QgaXNHYXBGaWxsZWQgPSAoeyBydW5TdHJhdGVneSwgbWVyZ2VTdHJhdGVneSwgbWVyZ2VBcmdzIH06IElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZykgPT5cbiAgWydhZGRfYmxhbmtfbm9kZV9pZl9taXNzaW5nJywgJ2FkZF9rZXlfaWZfbWlzc2luZyddLmluY2x1ZGVzKHJ1blN0cmF0ZWd5KSAmJlxuICAobWVyZ2VTdHJhdGVneSAhPT0gJ2xpc3QnIHx8ICFtZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQpO1xuXG5jb25zdCBpc1JlY2FsY3VsYXRlZCA9ICh7IHJ1blN0cmF0ZWd5LCBtZXJnZVN0cmF0ZWd5LCBtZXJnZUFyZ3MgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSA9PlxuICBbJ2FkZF9ibGFua19ub2RlX2lmX21pc3NpbmcnLCAnYWRkX2tleV9pZl9taXNzaW5nJ10uaW5jbHVkZXMocnVuU3RyYXRlZ3kpICYmXG4gIG1lcmdlU3RyYXRlZ3kgPT09ICdsaXN0JyAmJlxuICBtZXJnZUFyZ3M/LnJlcGxhY2VUaHJlc2hvbGQ7XG5cbmNvbnN0IGZpbHRlckdhcEZpbGxlZCA9IChjb25maWdzOiBjb25maWdzLCBvbmx5R2FwRmlsbGVkOiBib29sZWFuKSA9PlxuICBjb25maWdzXG4gICAgLm1hcChtb2RlbCA9PiAoQXJyYXkuaXNBcnJheShtb2RlbCkgJiYgb25seUdhcEZpbGxlZCA/IG1vZGVsLmZpbHRlcihpc0dhcEZpbGxlZCkgOiBtb2RlbCkpXG4gICAgLmZpbHRlcihtb2RlbCA9PiAhb25seUdhcEZpbGxlZCB8fCBBcnJheS5pc0FycmF5KG1vZGVsKSB8fCBpc0dhcEZpbGxlZChtb2RlbCkpO1xuXG5jb25zdCBtb2RlbE1hdGNoID1cbiAgKHRlcm06IHN0cmluZykgPT5cbiAgKHsga2V5LCBtb2RlbCwgdmFsdWUgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSA9PlxuICAgIFtrZXksIG1vZGVsLCB2YWx1ZV0uZmlsdGVyKEJvb2xlYW4pLnNvbWUodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSk7XG5cbmNvbnN0IGZpbHRlck1vZGVscyA9IChjb25maWdzOiBjb25maWdzLCB0ZXJtID0gJycpID0+XG4gIGNvbmZpZ3NcbiAgICAubWFwKG1vZGVsID0+IChBcnJheS5pc0FycmF5KG1vZGVsKSAmJiAhIXRlcm0gPyBtb2RlbC5maWx0ZXIobW9kZWxNYXRjaCh0ZXJtKSkgOiBtb2RlbCkpXG4gICAgLmZpbHRlcihtb2RlbCA9PiAhdGVybSB8fCBBcnJheS5pc0FycmF5KG1vZGVsKSB8fCBtb2RlbE1hdGNoKHRlcm0pKG1vZGVsKSk7XG5cbmNvbnN0IG1vZGVsS2V5TmFtZSA9IChtb2RlbEtleTogc3RyaW5nKSA9PiAobW9kZWxLZXkuaW5jbHVkZXMoJy4nKSA/IG1vZGVsS2V5LnNwbGl0KCcuJylbMV0gOiBtb2RlbEtleSk7XG5cbmNvbnN0IGdyb3VwQ29uZmlnJCA9IChjb25maWdzOiBjb25maWdzKSA9PlxuICBmcm9tKGNvbmZpZ3MuZmxhdCgpKS5waXBlKFxuICAgIGZpbHRlcigoeyBrZXkgfSkgPT4gaXNTY2hlbWFUeXBlKGtleSkpLFxuICAgIGdyb3VwQnkoKHsga2V5IH0pID0+IGtleSksXG4gICAgbWVyZ2VNYXAoZ3JvdXAgPT4gZ3JvdXAucGlwZSh0b0FycmF5KCkpKSxcbiAgICByZWR1Y2UoXG4gICAgICAocHJldiwgY3VycikgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBjdXJyWzBdLmtleTtcbiAgICAgICAgcHJldlt0b1NjaGVtYVR5cGUoa2V5KV0gPSBjdXJyO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7IFtrZXk6IHN0cmluZ106IElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZ1tdIH1cbiAgICApXG4gICk7XG5cbmNvbnN0IG1vZGVsS2V5VXJsID0gKHsgbW9kZWxLZXkgfTogSU1vZGVsLCBtb2RlbDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhcnRzID0gbW9kZWxLZXkuc3BsaXQoJy4nKTtcbiAgY29uc3Qgc2NoZW1hVHlwZSA9IHBhcnRzLmxlbmd0aCA9PT0gMiA/IHBhcnRzWzBdIDogbW9kZWw7XG4gIGNvbnN0IHVybCA9IFtzY2hlbWFCYXNlVXJsKCksIHRvU2NoZW1hVHlwZShzY2hlbWFUeXBlKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy8nKTtcbiAgcmV0dXJuIGlzU2NoZW1hVHlwZShzY2hlbWFUeXBlKSA/IGAke3VybH0jJHtwYXJ0cy5wb3AoKX1gIDogbnVsbDtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWVuZ2luZS1vcmNoZXN0cmF0b3ItZWRpdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbmdpbmUtb3JjaGVzdHJhdG9yLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbmdpbmUtb3JjaGVzdHJhdG9yLWVkaXQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIEpzb25QaXBlLFxuICAgIENsaWNrT3V0c2lkZURpcmVjdGl2ZSxcbiAgICBOZ2JUb29sdGlwLFxuICAgIE5nYkRyb3Bkb3duTW9kdWxlLFxuICAgIEZhSWNvbkNvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5vZGVMaW5rQ29tcG9uZW50LFxuICAgIEtleVRvTGFiZWxQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRW5naW5lT3JjaGVzdHJhdG9yRWRpdENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVzdGlhRW5naW5lU2VydmljZSA9IGluamVjdChIZUVuZ2luZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaFNlcnZpY2UgPSBpbmplY3QoSGVTZWFyY2hTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFFeHRlcm5hbExpbmtBbHQgPSBmYUV4dGVybmFsTGlua0FsdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhVGltZXMgPSBmYVRpbWVzO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFDb2cgPSBmYUNvZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhTGlzdCA9IGZhTGlzdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhVGFibGUgPSBmYVRhYmxlO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWcgPSBpbnB1dDxJT3JjaGVzdHJhdG9yQ29uZmlnPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZVR5cGUgPSBpbnB1dDxhbGxvd2VkVHlwZT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbE1vZGVscyA9IHRvU2lnbmFsKFxuICAgIGNvbWJpbmVMYXRlc3QoW3RvT2JzZXJ2YWJsZSh0aGlzLmNvbmZpZyksIHRvT2JzZXJ2YWJsZSh0aGlzLm5vZGVUeXBlKV0pLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAoKSxcbiAgICAgIG1hcCgoW2NvbmZpZywgbm9kZVR5cGVdKSA9PiAoY29uZmlnID8gY29uZmlnIDogbG9hZENvbmZpZyhub2RlVHlwZSkpKSxcbiAgICAgIG1hcCgoeyBtb2RlbHMgfSkgPT4gbW9kZWxzKSxcbiAgICAgIHN0YXJ0V2l0aChbXSBhcyBjb25maWdzKVxuICAgIClcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXJtSWRzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB1bmlxdWUoXG4gICAgICB0aGlzLmFsbE1vZGVscygpXG4gICAgICAgIC5mbGF0KClcbiAgICAgICAgLmZsYXRNYXAobW9kZWwgPT4gW21vZGVsLm1vZGVsLCBtb2RlbC52YWx1ZV0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICApXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVybXMgPSB0b1NpZ25hbChcbiAgICB0b09ic2VydmFibGUodGhpcy50ZXJtSWRzKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoaWRzID0+XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2gkPElUZXJtSlNPTkxELCBOb2RlVHlwZS5UZXJtPih7XG4gICAgICAgICAgZmllbGRzOiBbJ0B0eXBlJywgJ0BpZCcsICduYW1lJywgJ3VuaXRzJ10sXG4gICAgICAgICAgbGltaXQ6IGlkcy5sZW5ndGgsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIGJvb2w6IHtcbiAgICAgICAgICAgICAgbXVzdDogW21hdGNoVHlwZShOb2RlVHlwZS5UZXJtKV0sXG4gICAgICAgICAgICAgIHNob3VsZDogaWRzLm1hcChtYXRjaElkKSxcbiAgICAgICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgbWFwKCh7IHJlc3VsdHMgfSkgPT4gcmVzdWx0cylcbiAgICApXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0ZXJtc0J5SWQgPSBjb21wdXRlZCgoKSA9PlxuICAgICh0aGlzLnRlcm1zKCkgPz8gW10pLnJlZHVjZSgocCwgYykgPT4gKHsgLi4ucCwgW2NbJ0BpZCddXTogYyB9KSwge30gYXMgeyBbaWQ6IHN0cmluZ106IElUZXJtSlNPTkxEIH0pXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ1VybCA9IFtnaXRIb21lLCAnaGVzdGlhLWVuZ2luZS1jb25maWcnXS5qb2luKCcvJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZGVsS2V5TmFtZSA9IG1vZGVsS2V5TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZGVsS2V5VXJsID0gbW9kZWxLZXlVcmw7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYWxEb2NzVXJsID0gZ2VuZXJhbERvY3NVcmw7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdHJhdGVnaWVzRG9jcyA9IHN0cmF0ZWdpZXNEb2NzO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWFyY2ggPSBzaWduYWwoJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25seUdhcEZpbGxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93QWR2YW5jZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcGxheUJ5ID0gc2lnbmFsPCdsaXN0JyB8ICd0eXBlJz4oJ2xpc3QnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9kZWxzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBmaWx0ZXJNb2RlbHMoZmlsdGVyR2FwRmlsbGVkKHRoaXMuYWxsTW9kZWxzKCksIHRoaXMub25seUdhcEZpbGxlZCgpKSwgdGhpcy5zZWFyY2goKSlcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyb3VwZWRNb2RlbHMgPSB0b1NpZ25hbCh0b09ic2VydmFibGUodGhpcy5tb2RlbHMpLnBpcGUobWVyZ2VNYXAoZ3JvdXBDb25maWckKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRHcm91cGVkS2V5ID0gc2lnbmFsPHN0cmluZz4odW5kZWZpbmVkKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHRoaXMuZ3JvdXBlZE1vZGVscygpKT8uWzBdO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHcm91cGVkS2V5KCkgJiYga2V5KSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwZWRLZXkuc2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vZGVsTGluayQoeyBtb2RlbCwgdmFsdWUgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVzdGlhRW5naW5lU2VydmljZS5tb2RlbCQoeyBtb2RlbCwgdGVybTogdmFsdWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9kZWxQYXRoTGluayQoeyBtb2RlbCwgdmFsdWUgfTogSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVzdGlhRW5naW5lU2VydmljZS5tb2RlbCQoe1xuICAgICAgcGF0aDogYCR7ZW5naW5lR2l0VXJsKCl9L2hlc3RpYV9lYXJ0aC9tb2RlbHMvJHttb2RlbH0vJHsodmFsdWUgfHwgJycpLnJlcGxhY2UoJy4nLCAnLycpfS5weWBcbiAgICB9KTtcbiAgfVxufVxuIiwiPHA+XG4gIDxpPlxuICAgIFRoZSBjb25maWd1cmF0aW9uIGJlbG93IGlzIGEgcHJldmlldyBvZiB0aGVcbiAgICA8YSBbaHJlZl09XCJjb25maWdVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5KU09OIGNvbmZpZ3VyYXRpb24gZmlsZTwvYT5cbiAgICB1c2VkIGZvciB0aGUgb3JjaGVzdHJhdGlvbiBvZiB0aGUgSEVTVElBJ3MgY2FsY3VsYXRpb25zLlxuICA8L2k+XG48L3A+XG48cD5cbiAgPGk+Tm90ZTogbm90IGFsbCBtb2RlbHMgbWlnaHQgYmUgcmVwcmVzZW50ZWQgYWNjdXJhdGVseS48L2k+XG48L3A+XG5cbjxkaXYgY2xhc3M9XCJpcy1zaXplLTcgaXMtaXRhbGljXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy1tdWx0aWxpbmUgaXMtdmNlbnRlcmVkIGlzLXZhcmlhYmxlIGlzLTEgbXktMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwbC0zIG1vZGVsLXBhcmFsbGVsIG15LTNcIj5cbiAgICAgICAgPHNwYW4+TW9kZWxzIHJ1bm5pbmcgaW4gcGFyYWxsZWw8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICA8ZGl2IG5nYkRyb3Bkb3duICNvcHRpb25EZD1cIm5nYkRyb3Bkb3duXCIgY29udGFpbmVyPVwiYm9keVwiIHBsYWNlbWVudD1cImJvdHRvbS1lbmRcIiBhdXRvQ2xvc2U9XCJvdXRzaWRlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZVxuICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLWdob3N0XCJcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgYXJpYS1jb250cm9scz1cIm9wdGlvbi1tZW51XCJcbiAgICAgICAgICBuZ2JUb29sdGlwPVwiT3B0aW9uc1wiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICBbZGlzYWJsZVRvb2x0aXBdPVwib3B0aW9uRGQuaXNPcGVuKClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhQ29nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBpZD1cIm9wdGlvbi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudCB8IGlzLWRyb3Bkb3duLWZpbHRlcnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkIGhhcy1pY29ucy1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCBzZWFyY2gtaW5wdXQgaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29sbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGJ5IGtleSwgbmFtZSBvciBtb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJzZWFyY2guc2V0KCRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodFwiIChjbGljayk9XCJzZWFyY2guc2V0KCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYVRpbWVzXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGlzLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzd2l0Y2ggaXMtc21hbGwgaXMtcm91bmRlZCBpcy1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2hvd0FkdmFuY2VkKClcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJzaG93QWR2YW5jZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzaG93QWR2YW5jZWQuc2V0KCRldmVudC50YXJnZXQuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImlzLXNpemUtN1wiIGZvcj1cInNob3dBZHZhbmNlZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvdyBhZHZhbmNlZCBkYXRhPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBpcy1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3dpdGNoIGlzLXNtYWxsIGlzLXJvdW5kZWQgaXMtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9ubHlHYXBGaWxsZWQoKVwiXG4gICAgICAgICAgICAgICAgICBpZD1cIm9ubHlHYXBGaWxsZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbmx5R2FwRmlsbGVkLnNldCgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpcy1zaXplLTdcIiBmb3I9XCJvbmx5R2FwRmlsbGVkXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5TaG93IG9ubHkgZ2FwLWZpbGxlZCBkYXRhPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gI29wdGlvbkRkPVwibmdiRHJvcGRvd25cIiBjb250YWluZXI9XCJib2R5XCIgcGxhY2VtZW50PVwiYm90dG9tLWVuZFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1naG9zdFwiXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJkaXNwbGF5LW1lbnVcIlxuICAgICAgICAgIG5nYlRvb2x0aXA9XCJEaXNwbGF5IG9wdGlvbnNcIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgW2Rpc2FibGVUb29sdGlwXT1cIm9wdGlvbkRkLmlzT3BlbigpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJkaXNwbGF5QnkoKSA9PT0gJ2xpc3QnID8gZmFMaXN0IDogZmFUYWJsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgaWQ9XCJkaXNwbGF5LW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250ZW50XCI+XG4gICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gW2NsYXNzLmlzLXNlbGVjdGVkXT1cImRpc3BsYXlCeSgpID09PSAnbGlzdCdcIiAoY2xpY2spPVwiZGlzcGxheUJ5LnNldCgnbGlzdCcpXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhTGlzdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkRpc3BsYXkgYnkgUHJpb3JpdHk8L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gW2NsYXNzLmlzLXNlbGVjdGVkXT1cImRpc3BsYXlCeSgpID09PSAndHlwZSdcIiAoY2xpY2spPVwiZGlzcGxheUJ5LnNldCgndHlwZScpXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhVGFibGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5EaXNwbGF5IGJ5IFR5cGU8L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbkBpZiAoZGlzcGxheUJ5KCkgPT09ICdsaXN0JyAmJiBtb2RlbHMoKSkge1xuICA8ZGl2IGNsYXNzPVwicGwtM1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlbExpc3Q7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBtb2RlbHMoKSB9XCIgLz5cbiAgPC9kaXY+XG59XG5cbkBpZiAoZGlzcGxheUJ5KCkgPT09ICd0eXBlJyAmJiBncm91cGVkTW9kZWxzKCkpIHtcbiAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8dWw+XG4gICAgICBAZm9yIChncm91cCBvZiBncm91cGVkTW9kZWxzKCkgfCBrZXl2YWx1ZTsgdHJhY2sgZ3JvdXAua2V5KSB7XG4gICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkR3JvdXBlZEtleSgpID09PSBncm91cC5rZXlcIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cGVkS2V5LnNldChncm91cC5rZXkpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj57eyBncm91cC5rZXkgfX0gKHt7IGdyb3VwLnZhbHVlLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicGwtM1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlbExpc3Q7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBncm91cGVkTW9kZWxzKClbc2VsZWN0ZWRHcm91cGVkS2V5KCldIH1cIiAvPlxuICA8L2Rpdj5cbn1cblxuPG5nLXRlbXBsYXRlICN0ZXJtTGluayBsZXQtdmFsdWU+XG4gIEBpZiAodGVybXNCeUlkKClbdmFsdWVdKSB7XG4gICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJ0ZXJtc0J5SWQoKVt2YWx1ZV1cIiBbc2hvd0V4dGVybmFsTGlua109XCJ0cnVlXCI+XG4gICAgICA8c3Bhbj57eyB0ZXJtc0J5SWQoKVt2YWx1ZV0ubmFtZSB9fTwvc3Bhbj5cbiAgICA8L2hlLW5vZGUtbGluaz5cbiAgfSBAZWxzZSB7XG4gICAgPHNwYW4+e3sgdmFsdWUgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGlzdCBsZXQtZGF0YT5cbiAgQGZvciAodiBvZiBkYXRhOyB0cmFjayB2KSB7XG4gICAgPGRpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHYgfVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kZWwgbGV0LWRhdGE+XG4gIEBpZiAoaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCkge1xuICAgIDxkaXYgY2xhc3M9XCJwbC0zIG1vZGVsLXBhcmFsbGVsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kZWxMaXN0OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0YSB9XCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8aHIgLz5cbiAgfVxuICBAaWYgKCFpc0FycmF5KGRhdGEpKSB7XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMiBtb2RlbC1zZXJpZSBpcy1zaXplLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgcC0zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtY2FwaXRhbGl6ZWRcIj57eyBkYXRhLmtleSB8IGtleVRvTGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDpcbiAgICAgICAgQGlmIChtb2RlbExpbmskKGRhdGEpIHwgYXN5bmM7IGFzIGxpbmspIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kZWxMaW5rOyBjb250ZXh0OiB7IG1vZGVsOiBkYXRhLm1vZGVsLCB2YWx1ZTogZGF0YS52YWx1ZSwgbGluayB9XCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGlmIChtb2RlbFBhdGhMaW5rJChkYXRhKSB8IGFzeW5jOyBhcyBsaW5rKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kZWxQYXRoTGluazsgY29udGV4dDogeyBtb2RlbDogZGF0YS5tb2RlbCwgdmFsdWU6IGRhdGEudmFsdWUsIGxpbmsgfVwiIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRlZmF1bHQtdmFsdWVcIj57eyBkYXRhLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPk1vZGVsOjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0yXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlcm1MaW5rOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGF0YS5tb2RlbCB9XCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNob3dBZHZhbmNlZCgpKSB7XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIEBpZiAoZGF0YS5ydW5TdHJhdGVneSkge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPlJ1biBzdHJhdGVneTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdHJhdGVnaWVzTGluazsgY29udGV4dDogeyBzdHJhdGVneTogZGF0YS5ydW5TdHJhdGVneSwgdHlwZTogJ3J1bicgfVwiIC8+XG4gICAgICAgICAgICAgICAgQGlmIChkYXRhLnJ1bkFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbC0zIGlzLXNpemUtN1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD48Yj5SdW4gYXJndW1lbnRzOjwvYj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdHJhdGVnaWVzQXJnczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGEucnVuQXJncyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGRhdGEubWVyZ2VTdHJhdGVneSkge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPk1lcmdlIHN0cmF0ZWd5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInN0cmF0ZWdpZXNMaW5rOyBjb250ZXh0OiB7IHN0cmF0ZWd5OiBkYXRhLm1lcmdlU3RyYXRlZ3ksIHR5cGU6ICdtZXJnZScgfVwiIC8+XG4gICAgICAgICAgICAgICAgQGlmIChkYXRhLm1lcmdlQXJncykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTMgaXMtc2l6ZS03XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPjxiPk1lcmdlIGFyZ3VtZW50czo8L2I+PC9wPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RyYXRlZ2llc0FyZ3M7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBkYXRhLm1lcmdlQXJncyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGlua0tleSBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1saW5rPVwibGlua1wiPlxuICA8YSBbaHJlZl09XCJtb2RlbEtleVVybChsaW5rLCBtb2RlbClcIiB0YXJnZXQ9XCJfYmxhbmtcIj57eyBtb2RlbEtleU5hbWUobGluay5tb2RlbEtleSkgfX08L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGluayBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1saW5rPVwibGlua1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIEBpZiAobGluay50ZXJtKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlcm1MaW5rOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGluay50ZXJtIH1cIiAvPlxuICB9XG5cbiAgQGlmICghbGluay50ZXJtICYmICFsaW5rPy5tb2RlbEtleSkge1xuICAgIDxzcGFuIGNsYXNzPVwiZGVmYXVsdC12YWx1ZVwiPnt7IHZhbHVlIH19PC9zcGFuPlxuICB9XG5cbiAgQGlmICghbGluay50ZXJtICYmIGxpbms/Lm1vZGVsS2V5KSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGVsTGlua0tleTsgY29udGV4dDogeyBsaW5rLCBtb2RlbCB9XCIgLz5cbiAgfVxuXG4gIDxwIGNsYXNzPVwibW9kZWwtbGlua1wiPlxuICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPk1vZGVsOjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInByLTJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXJtTGluazsgY29udGV4dDogeyAkaW1wbGljaXQ6IG1vZGVsIH1cIiAvPlxuICAgIDwvc3Bhbj5cblxuICAgIDxhIGNsYXNzPVwiaXMtc2l6ZS03XCIgW2hyZWZdPVwibGluay5kb2NQYXRoXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInByLTFcIj4oVmlldyBEb2NzKTwvc3Bhbj5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhRXh0ZXJuYWxMaW5rQWx0XCIgLz5cbiAgICA8L2E+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kZWxQYXRoTGluayBsZXQtbW9kZWw9XCJtb2RlbFwiIGxldC1saW5rPVwibGlua1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gIEBpZiAoIWxpbms/Lm1vZGVsS2V5KSB7XG4gICAgPHNwYW4gY2xhc3M9XCJkZWZhdWx0LXZhbHVlXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gIH1cblxuICBAaWYgKGxpbms/Lm1vZGVsS2V5KSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGVsTGlua0tleTsgY29udGV4dDogeyBsaW5rLCBtb2RlbCB9XCIgLz5cbiAgfVxuXG4gIDxwIGNsYXNzPVwibW9kZWwtcGF0aC1saW5rXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+TW9kZWw6PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwicHItMlwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlcm1MaW5rOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbW9kZWwgfVwiIC8+XG4gICAgPC9zcGFuPlxuXG4gICAgPGEgY2xhc3M9XCJpcy1zaXplLTdcIiBbaHJlZl09XCJsaW5rLmRvY1BhdGhcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPihWaWV3IERvY3MpPC9zcGFuPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFFeHRlcm5hbExpbmtBbHRcIiAvPlxuICAgIDwvYT5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdHJhdGVnaWVzTGluayBsZXQtc3RyYXRlZ3k9XCJzdHJhdGVneVwiIGxldC10eXBlPVwidHlwZVwiPlxuICA8c3BhbiBjbGFzcz1cInByLTIgaXMtaW5saW5lLWJsb2NrXCI+XG4gICAgPGNvZGU+e3sgc3RyYXRlZ3kgfX08L2NvZGU+XG4gIDwvc3Bhbj5cblxuICA8YVxuICAgIGNsYXNzPVwiaXMtc2l6ZS03XCJcbiAgICBbaHJlZl09XCJzdHJhdGVnaWVzRG9jcyArICcvJyArIHR5cGUgKyAnLycgKyAodHlwZSA9PT0gJ21lcmdlJyA/ICdtZXJnZV8nIDogJycpICsgc3RyYXRlZ3kgKyAnLm1kJ1wiXG4gICAgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+KFZpZXcgRG9jcyk8L3NwYW4+XG4gICAgPGZhLWljb24gW2ljb25dPVwiZmFFeHRlcm5hbExpbmtBbHRcIiAvPlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N0cmF0ZWdpZXNBcmdzIGxldC1hcmdzPlxuICA8ZGl2IGNsYXNzPVwicGwtMlwiPlxuICAgIEBmb3IgKGFyZyBvZiBhcmdzIHwga2V5dmFsdWU7IHRyYWNrIGFyZykge1xuICAgICAgPHA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLXRleHQtdW5kZXJsaW5lXCI+e3sgYXJnLmtleSB9fTwvc3Bhbj5cbiAgICAgICAgOlxuICAgICAgICA8Y29kZT57eyBhcmcudmFsdWUgfCBqc29uIH19PC9jb2RlPlxuICAgICAgPC9wPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -2,12 +2,12 @@ import { Injectable, InjectionToken, inject } from '@angular/core';
2
2
  import { HttpClient } from '@angular/common/http';
3
3
  import { of, ReplaySubject } from 'rxjs';
4
4
  import { catchError, filter, map, mergeAll, mergeMap, shareReplay, take, toArray } from 'rxjs/operators';
5
+ import { loadConfig } from '@hestia-earth/config';
5
6
  import { toDashCase } from '@hestia-earth/utils';
6
7
  import { HeCommonService } from '../common/common.service';
7
8
  import { baseUrl, gitHome, gitlabRawUrl, gitBranch, filterParams, Repository } from '../common/utils';
8
9
  import * as i0 from "@angular/core";
9
10
  export const HE_CALCULATIONS_BASE_URL = new InjectionToken('HE_CALCULATIONS_BASE_URL');
10
- export const HE_ORCHESTRATOR_BASE_URL = new InjectionToken('HE_ORCHESTRATOR_BASE_URL');
11
11
  export const engineGitBaseUrl = () => [gitHome, Repository.models].join('/');
12
12
  export const engineGitUrl = () => `${engineGitBaseUrl()}/-/blob/${gitBranch()}`;
13
13
  export const findModels = (models, termId) => models.filter(({ term }) => term === termId);
@@ -60,7 +60,6 @@ export const findOrchestratorModel = ({ models }, model) => Object.keys(model).l
60
60
  export class HeEngineService {
61
61
  constructor() {
62
62
  this._calculationsBaseUrl = inject(HE_CALCULATIONS_BASE_URL);
63
- this._orchestratorBaseUrl = inject(HE_ORCHESTRATOR_BASE_URL);
64
63
  this.http = inject(HttpClient);
65
64
  this.commonService = inject(HeCommonService);
66
65
  this.modelsLoading = false;
@@ -143,17 +142,12 @@ export class HeEngineService {
143
142
  .pipe(shareReplay(1));
144
143
  return this._recommendations[key];
145
144
  }
146
- orchestratorConfigUrl(type) {
147
- const configUrl = this._orchestratorBaseUrl;
148
- return type ? `${configUrl}/${type}.json` : configUrl.substring(0, configUrl.indexOf('/raw'));
149
- }
150
145
  ochestratorConfig$(type, id) {
151
- return this.http.get(`${this._calculationsBaseUrl}/recalculate/config`, {
146
+ return this.http
147
+ .get(`${this._calculationsBaseUrl}/recalculate/config`, {
152
148
  params: filterParams({ type, '@type': type, id, '@id': id })
153
- });
154
- }
155
- ochestratorConfig(type, id) {
156
- return this.ochestratorConfig$(type, id).toPromise();
149
+ })
150
+ .pipe(catchError(() => of(loadConfig(type))));
157
151
  }
158
152
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: HeEngineService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
159
153
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: HeEngineService, providedIn: 'root' }); }
@@ -164,4 +158,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
164
158
  providedIn: 'root'
165
159
  }]
166
160
  }], ctorParameters: () => [] });
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW5naW5lL2VuZ2luZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVV6RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUV0RyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLGNBQWMsQ0FBUywwQkFBMEIsQ0FBQyxDQUFDO0FBQy9GLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUFTLDBCQUEwQixDQUFDLENBQUM7QUFFL0YsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxXQUFXLFNBQVMsRUFBRSxF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LENBQUMsSUFBZTtRQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQWMsRUFBRSxFQUFXO1FBQ25ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXNCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixxQkFBcUIsRUFBRTtZQUMzRixNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUM3RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBYyxFQUFFLEVBQVc7UUFDbEQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3ZELENBQUM7K0dBdElVLGVBQWU7bUhBQWYsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgbWVyZ2VBbGwsIG1lcmdlTWFwLCBzaGFyZVJlcGxheSwgdGFrZSwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEVtaXNzaW9uTWV0aG9kVGllcixcbiAgSlNPTkxELFxuICBOb2RlVHlwZSxcbiAgU2NoZW1hVHlwZSxcbiAgU2l0ZVNpdGVUeXBlLFxuICBUZXJtVGVybVR5cGUsXG4gIGJsYW5rTm9kZXNUeXBlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IHRvRGFzaENhc2UgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHsgSGVDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IGJhc2VVcmwsIGdpdEhvbWUsIGdpdGxhYlJhd1VybCwgZ2l0QnJhbmNoLCBmaWx0ZXJQYXJhbXMsIFJlcG9zaXRvcnkgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgSEVfQ0FMQ1VMQVRJT05TX0JBU0VfVVJMID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ0hFX0NBTENVTEFUSU9OU19CQVNFX1VSTCcpO1xuZXhwb3J0IGNvbnN0IEhFX09SQ0hFU1RSQVRPUl9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdIRV9PUkNIRVNUUkFUT1JfQkFTRV9VUkwnKTtcblxuZXhwb3J0IGNvbnN0IGVuZ2luZUdpdEJhc2VVcmwgPSAoKSA9PiBbZ2l0SG9tZSwgUmVwb3NpdG9yeS5tb2RlbHNdLmpvaW4oJy8nKTtcbmV4cG9ydCBjb25zdCBlbmdpbmVHaXRVcmwgPSAoKSA9PiBgJHtlbmdpbmVHaXRCYXNlVXJsKCl9Ly0vYmxvYi8ke2dpdEJyYW5jaCgpfWA7XG5cbmV4cG9ydCBjb25zdCBmaW5kTW9kZWxzID0gKG1vZGVsczogSU1vZGVsW10sIHRlcm1JZDogc3RyaW5nKSA9PiBtb2RlbHMuZmlsdGVyKCh7IHRlcm0gfSkgPT4gdGVybSA9PT0gdGVybUlkKTtcblxuZXhwb3J0IGNvbnN0IGZpbmRNYXRjaGluZ01vZGVsID0gKG1vZGVsczogKElNb2RlbCB8IElNb2RlbFtdKVtdLCBtb2RlbDogUGFydGlhbDxJTW9kZWw+KSA9PlxuICBPYmplY3Qua2V5cyhtb2RlbCkubGVuZ3RoID4gMFxuICAgID8gbW9kZWxzLmZsYXQoKS5maW5kKG0gPT4gT2JqZWN0LmVudHJpZXMobW9kZWwpLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHZhbHVlID09PSBtW2tleV0pKVxuICAgIDogbnVsbDtcblxuZXhwb3J0IGNvbnN0IG1vZGVsUGFyYW1zID0gKG5vZGU6IFBhcnRpYWw8YmxhbmtOb2Rlc1R5cGU+LCBpbmNsdWRlVGVybSA9IHRydWUpID0+XG4gIGZpbHRlclBhcmFtcyh7XG4gICAgbW9kZWw6ICdtZXRob2RNb2RlbCcgaW4gbm9kZSA/IG5vZGU/Lm1ldGhvZE1vZGVsPy5bJ0BpZCddIDogdW5kZWZpbmVkLFxuICAgIC4uLihpbmNsdWRlVGVybSA/IHsgdGVybTogJ3Rlcm0nIGluIG5vZGUgPyBub2RlPy50ZXJtPy5bJ0BpZCddIDogdW5kZWZpbmVkIH0gOiB7fSlcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBtb2RlbEtleVBhcmFtcyA9IChub2RlOiBQYXJ0aWFsPGJsYW5rTm9kZXNUeXBlPiwga2V5OiBzdHJpbmcpID0+XG4gIGZpbHRlclBhcmFtcyh7XG4gICAgbW9kZWw6IChub2RlPy5bJ0B0eXBlJ10gfHwgbm9kZT8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKSxcbiAgICBtb2RlbEtleToga2V5XG4gIH0pO1xuXG4vKipcbiAqIEZpbmQgbW9kZWxzIGZyb20gdGhlIG9yY2hlc3RyYXRvciBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIG9yY2hlc3RyYXRvciBjb25maWd1cmF0aW9uIGNvbnRlbnQuXG4gKiBAcGFyYW0gdGVybUlkIFRoZSBgQGlkYCBvZiB0aGUgVGVybS5cbiAqIEBwYXJhbSBtb2RlbEtleSBUaGUga2V5IG9mIHRoZSBjb25maWd1cmF0aW9uIChlLmcuIFwicHJvZHVjdHNcIiwgXCJpbnB1dHNcIilcbiAqIEBwYXJhbSBtb2RlbHMgT3B0aW9uYWwgLSBsaXN0IG9mIG1vZGVscyBmcm9tIGBtb2RlbC1saW5rcy5qc29uYCB0byBkZWZhdWx0IHdoZW4gb3JjaGVzdHJhdG9yIGRvZXMgbm90IGNvbnRhaW4gY29uZmlnLlxuICogQHJldHVybnMgTGlzdCBvZiBtb2RlbHMgZnJvbSBvcmNoZXN0cmF0b3Igb3IgbW9kZWxzIGlmIHNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRDb25maWdNb2RlbHMgPSAoXG4gIGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZyxcbiAgdGVybUlkOiBzdHJpbmcsXG4gIG1vZGVsS2V5OiBzdHJpbmcsXG4gIG1vZGVsczogSU1vZGVsW10gPSBbXVxuKSA9PiB7XG4gIGNvbnN0IGNvbmZpZ01vZGVscyA9IGNvbmZpZy5tb2RlbHNcbiAgICAuZmxhdCgpXG4gICAgLmZpbHRlcigoeyB2YWx1ZSwga2V5IH0pID0+IHRlcm1JZCA9PT0gdmFsdWUgJiYgKCFtb2RlbEtleSB8fCBrZXkgPT09IG1vZGVsS2V5KSk7XG4gIHJldHVybiBjb25maWdNb2RlbHMubGVuZ3RoID8gY29uZmlnTW9kZWxzIDogZmluZE1vZGVscyhtb2RlbHMsIHRlcm1JZCk7XG59O1xuXG5jb25zdCBjdXN0b21UZXJtQXBpRG9jc1BhdGggPSB7XG4gICdleGNyZXRhLWtnLW1hc3MnOiAnZXhjcmV0YS1rZydcbn07XG5cbmV4cG9ydCBjb25zdCBwYXRoVG9BcGlEb2NzUGF0aCA9IChtb2RlbDogc3RyaW5nLCB0ZXJtPzogc3RyaW5nKSA9PlxuICBbXG4gICAgYmFzZVVybChmYWxzZSksXG4gICAgJ2RvY3MnLFxuICAgIFsnI2hlc3RpYS1jYWxjdWxhdGlvbi1tb2RlbHMnLCB0b0Rhc2hDYXNlKG1vZGVsKSwgY3VzdG9tVGVybUFwaURvY3NQYXRoW3RvRGFzaENhc2UodGVybSldIHx8IHRvRGFzaENhc2UodGVybSldXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignLScpXG4gIF0uam9pbignLycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNb2RlbCB7XG4gIC8qKlxuICAgKiBJcyBtb2RlbCBmcm9tIEVjb2ludmVudFYzLlxuICAgKi9cbiAgZWNvaW52ZW50OiBib29sZWFuO1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgaW1wbGVtZW50YXRpb24gKGNvZGUpIG9mIHRoZSBtb2RlbC5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIG1vZGVsLlxuICAgKi9cbiAgZG9jUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgQVBJIERvY3VtZW50YXRpb24uXG4gICAqL1xuICBhcGlEb2NzUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB1c2VkIGFzIGBtZXRob2RNb2RlbGAuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRlcm0gdGhlIG1vZGVsIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIHRlcm0/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kVGllciBvZiB0aGUgRW1pc3Npb24gKGlmIGFwcGxpY2FibGUpLlxuICAgKi9cbiAgbWV0aG9kVGllcj86IEVtaXNzaW9uTWV0aG9kVGllcjtcbiAgLyoqXG4gICAqIEEga2V5IGluIHRoZSBtb2RlbCBpZiB0ZXJtIGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgbW9kZWxLZXk/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJTW9kZWxMaW5rcyB7XG4gIGxpbmtzOiBJTW9kZWxbXTtcbiAgZWNvaW52ZW50TGlua3M/OiBJTW9kZWxbXTtcbiAgZWNvaW52ZW50VjNBbmRFbWJlckNsaW1hdGVMaW5rcz86IElNb2RlbFtdO1xufVxuXG5jb25zdCBtYXBNb2RlbExpbmsgPVxuICAoZWNvaW52ZW50ID0gZmFsc2UpID0+XG4gICh7IHBhdGgsIGRvY1BhdGgsIC4uLmxpbmsgfTogSU1vZGVsKSA9PiAoe1xuICAgIC4uLmxpbmssXG4gICAgZWNvaW52ZW50LFxuICAgIHBhdGg6IGAke2VuZ2luZUdpdFVybCgpfS8ke3BhdGh9YCxcbiAgICBkb2NQYXRoOiBgJHtlbmdpbmVHaXRVcmwoKX0vJHtkb2NQYXRofWAsXG4gICAgYXBpRG9jc1BhdGg6IHBhdGhUb0FwaURvY3NQYXRoKGxpbmsubW9kZWwsIGxpbmsudGVybSB8fCBsaW5rLm1vZGVsS2V5KVxuICB9KTtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FsY3VsYXRpb25zTW9kZWxzUGFyYW1zIHtcbiAgdGVybVR5cGU/OiBTY2hlbWFUeXBlO1xuICBwcm9kdWN0VGVybUlkPzogc3RyaW5nO1xuICBwcm9kdWN0VGVybVR5cGU/OiBUZXJtVGVybVR5cGU7XG4gIHRpZXI/OiBFbWlzc2lvbk1ldGhvZFRpZXI7XG4gIHNpdGVUeXBlPzogU2l0ZVNpdGVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYWxjdWxhdGlvbnNSZXF1aXJlbWVudHNQYXJhbXMgZXh0ZW5kcyBJQ2FsY3VsYXRpb25zTW9kZWxzUGFyYW1zIHtcbiAgZm9ybWF0PzogJ2Nzdic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhbGN1bGF0aW9uc01vZGVsIHtcbiAgbW9kZWw6IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnIHtcbiAga2V5OiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHJ1blN0cmF0ZWd5OiAnYWx3YXlzJyB8ICdhZGRfa2V5X2lmX21pc3NpbmcnIHwgJ2FkZF9ibGFua19ub2RlX2lmX21pc3NpbmcnO1xuICBydW5BcmdzPzogYW55O1xuICBtZXJnZVN0cmF0ZWd5OiAnZGVmYXVsdCcgfCAnYXBwZW5kJyB8ICdsaXN0JyB8ICdub2RlJztcbiAgbWVyZ2VBcmdzPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPcmNoZXN0cmF0b3JDb25maWcge1xuICBtb2RlbHM6IChJT3JjaGVzdHJhdG9yTW9kZWxDb25maWcgfCBJT3JjaGVzdHJhdG9yTW9kZWxDb25maWdbXSlbXTtcbn1cblxuZXhwb3J0IGNvbnN0IGZpbmRPcmNoZXN0cmF0b3JNb2RlbCA9ICh7IG1vZGVscyB9OiBJT3JjaGVzdHJhdG9yQ29uZmlnLCBtb2RlbDogUGFydGlhbDxJT3JjaGVzdHJhdG9yTW9kZWxDb25maWc+KSA9PlxuICBPYmplY3Qua2V5cyhtb2RlbCkubGVuZ3RoID4gMFxuICAgID8gbW9kZWxzLmZsYXQoKS5maW5kKG0gPT4gT2JqZWN0LmVudHJpZXMobW9kZWwpLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHZhbHVlID09PSBtW2tleV0pKVxuICAgIDogbnVsbDtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgSGVFbmdpbmVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfY2FsY3VsYXRpb25zQmFzZVVybCA9IGluamVjdChIRV9DQUxDVUxBVElPTlNfQkFTRV9VUkwpO1xuICBwcml2YXRlIF9vcmNoZXN0cmF0b3JCYXNlVXJsID0gaW5qZWN0KEhFX09SQ0hFU1RSQVRPUl9CQVNFX1VSTCk7XG4gIHByb3RlY3RlZCBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcm90ZWN0ZWQgY29tbW9uU2VydmljZSA9IGluamVjdChIZUNvbW1vblNlcnZpY2UpO1xuXG4gIHByaXZhdGUgbW9kZWxzTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIG1vZGVsc0xvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9tb2RlbHMgPSBuZXcgUmVwbGF5U3ViamVjdDxJTW9kZWxbXT4oMSk7XG5cbiAgcHJpdmF0ZSBfcmVjb21tZW5kYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8c3RyaW5nW10+IH0gPSB7fTtcbiAgcHJpdmF0ZSBfcmVxdWlyZW1lbnRzOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8SlNPTkxEPE5vZGVUeXBlPj4gfSA9IHt9O1xuXG4gIHB1YmxpYyBsYXRlc3RWZXJzaW9uJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIHRoaXMubGF0ZXN0VmVyc2lvbiQgPSB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8YW55PihcbiAgICAgICAgZ2l0bGFiUmF3VXJsKHsgYXBpVXJsOiB0aGlzLmNvbW1vblNlcnZpY2UuYXBpQmFzZVVybCwgcmVwb3NpdG9yeTogUmVwb3NpdG9yeS5tb2RlbHMsIHBhdGg6ICdwYWNrYWdlLmpzb24nIH0pXG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGRhdGEgPT4gSlNPTi5wYXJzZShkYXRhKSksXG4gICAgICAgIG1hcCgoeyB2ZXJzaW9uIH0pID0+IHZlcnNpb24pXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmxvYWRNb2RlbHMoKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVsc0xvYWRpbmcgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8SU1vZGVsTGlua3M+KFxuICAgICAgICBnaXRsYWJSYXdVcmwoeyBhcGlVcmw6IHRoaXMuY29tbW9uU2VydmljZS5hcGlCYXNlVXJsLCByZXBvc2l0b3J5OiBSZXBvc2l0b3J5Lm1vZGVscywgcGF0aDogJ21vZGVsLWxpbmtzLmpzb24nIH0pXG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGRhdGEgPT4gSlNPTi5wYXJzZShkYXRhIGFzIGFueSkgYXMgSU1vZGVsTGlua3MpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgbGlua3M6IFtdIH0gYXMgSU1vZGVsTGlua3MpKSxcbiAgICAgICAgbWFwKCh7IGxpbmtzLCBlY29pbnZlbnRMaW5rcywgZWNvaW52ZW50VjNBbmRFbWJlckNsaW1hdGVMaW5rcyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbW9kZWxzLm5leHQoW1xuICAgICAgICAgICAgLi4ubGlua3MubWFwKG1hcE1vZGVsTGluayhmYWxzZSkpLFxuICAgICAgICAgICAgLi4uKGVjb2ludmVudExpbmtzIHx8IFtdKS5tYXAobWFwTW9kZWxMaW5rKHRydWUpKSxcbiAgICAgICAgICAgIC4uLihlY29pbnZlbnRWM0FuZEVtYmVyQ2xpbWF0ZUxpbmtzIHx8IFtdKS5tYXAobWFwTW9kZWxMaW5rKHRydWUpKVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHRoaXMubW9kZWxzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubW9kZWxzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gbGlua3M7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlbHMkKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsc0xvYWRpbmcgfHwgdGhpcy5tb2RlbHNMb2FkZWQgPyB0aGlzLl9tb2RlbHMuYXNPYnNlcnZhYmxlKCkgOiB0aGlzLmxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhbGxNb2RlbHMkKGluY2x1ZGVFY29pbnZlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLm1vZGVscyQucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBtZXJnZUFsbCgpLFxuICAgICAgZmlsdGVyKCh7IGVjb2ludmVudCB9KSA9PiBpbmNsdWRlRWNvaW52ZW50IHx8ICFlY29pbnZlbnQpLFxuICAgICAgdG9BcnJheSgpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBtb2RlbCQobW9kZWw6IFBhcnRpYWw8SU1vZGVsPikge1xuICAgIHJldHVybiB0aGlzLm1vZGVscyQucGlwZShtYXAobW9kZWxzID0+IGZpbmRNYXRjaGluZ01vZGVsKG1vZGVscywgbW9kZWwpKSk7XG4gIH1cblxuICBwdWJsaWMgbm9kZU1vZGVsJChub2RlOiBQYXJ0aWFsPGJsYW5rTm9kZXNUeXBlPiwga2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwkKG1vZGVsUGFyYW1zKG5vZGUpKS5waXBlKFxuICAgICAgLy8gZmFsbGJhY2sgdG8gbW9kZWxLZXlcbiAgICAgIG1lcmdlTWFwKHZhbHVlID0+ICgha2V5IHx8IHZhbHVlID8gb2YodmFsdWUpIDogdGhpcy5tb2RlbCQobW9kZWxLZXlQYXJhbXMobm9kZSwga2V5KSkpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbW9kZWwobW9kZWw6IFBhcnRpYWw8SU1vZGVsPikge1xuICAgIHJldHVybiB0aGlzLm1vZGVsJChtb2RlbCkucGlwZSh0YWtlKDEpKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBsYXRlc3RWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVzdFZlcnNpb24kLnBpcGUodGFrZSgxKSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgbGlzdE1vZGVscyhwYXJhbXM6IElDYWxjdWxhdGlvbnNNb2RlbHNQYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHsgbW9kZWxzOiBJQ2FsY3VsYXRpb25zTW9kZWxbXSB9PihgJHt0aGlzLl9jYWxjdWxhdGlvbnNCYXNlVXJsfS9tb2RlbHNgLCB7XG4gICAgICAgIHBhcmFtczogZmlsdGVyUGFyYW1zKHBhcmFtcylcbiAgICAgIH0pXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVxdWlyZW1lbnRzJChwYXJhbXM6IElDYWxjdWxhdGlvbnNSZXF1aXJlbWVudHNQYXJhbXMpIHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShmaWx0ZXJQYXJhbXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcmVxdWlyZW1lbnRzW2tleV0gPVxuICAgICAgdGhpcy5fcmVxdWlyZW1lbnRzW2tleV0gfHxcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAuZ2V0PEpTT05MRDxOb2RlVHlwZT4+KGAke3RoaXMuX2NhbGN1bGF0aW9uc0Jhc2VVcmx9L21vZGVscy9yZXF1aXJlbWVudHNgLCB7XG4gICAgICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMocGFyYW1zKVxuICAgICAgICB9KVxuICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVtZW50c1trZXldO1xuICB9XG5cbiAgcHVibGljIGdldFJlcXVpcmVtZW50cyhwYXJhbXM6IElDYWxjdWxhdGlvbnNSZXF1aXJlbWVudHNQYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZXF1aXJlbWVudHMkKHBhcmFtcykudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGVybUlkcyQocGFyYW1zOiBJQ2FsY3VsYXRpb25zUmVxdWlyZW1lbnRzUGFyYW1zKSB7XG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoZmlsdGVyUGFyYW1zKHBhcmFtcykpO1xuICAgIHRoaXMuX3JlY29tbWVuZGF0aW9uc1trZXldID1cbiAgICAgIHRoaXMuX3JlY29tbWVuZGF0aW9uc1trZXldIHx8XG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5fY2FsY3VsYXRpb25zQmFzZVVybH0vbW9kZWxzL3Rlcm0taWRzYCwge1xuICAgICAgICAgIHBhcmFtczogZmlsdGVyUGFyYW1zKHBhcmFtcylcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHJldHVybiB0aGlzLl9yZWNvbW1lbmRhdGlvbnNba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBvcmNoZXN0cmF0b3JDb25maWdVcmwodHlwZT86IE5vZGVUeXBlKSB7XG4gICAgY29uc3QgY29uZmlnVXJsID0gdGhpcy5fb3JjaGVzdHJhdG9yQmFzZVVybDtcbiAgICByZXR1cm4gdHlwZSA/IGAke2NvbmZpZ1VybH0vJHt0eXBlfS5qc29uYCA6IGNvbmZpZ1VybC5zdWJzdHJpbmcoMCwgY29uZmlnVXJsLmluZGV4T2YoJy9yYXcnKSk7XG4gIH1cblxuICBwdWJsaWMgb2NoZXN0cmF0b3JDb25maWckKHR5cGU6IE5vZGVUeXBlLCBpZD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElPcmNoZXN0cmF0b3JDb25maWc+KGAke3RoaXMuX2NhbGN1bGF0aW9uc0Jhc2VVcmx9L3JlY2FsY3VsYXRlL2NvbmZpZ2AsIHtcbiAgICAgIHBhcmFtczogZmlsdGVyUGFyYW1zKHsgdHlwZSwgJ0B0eXBlJzogdHlwZSwgaWQsICdAaWQnOiBpZCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9jaGVzdHJhdG9yQ29uZmlnKHR5cGU6IE5vZGVUeXBlLCBpZD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9jaGVzdHJhdG9yQ29uZmlnJCh0eXBlLCBpZCkudG9Qcm9taXNlKCk7XG4gIH1cbn1cbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW5naW5lL2VuZ2luZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVV6RyxPQUFPLEVBQThELFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXRHLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUFTLDBCQUEwQixDQUFDLENBQUM7QUFFL0YsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxXQUFXLFNBQVMsRUFBRSxFQUFFLENBQUM7QUFFaEYsTUFBTSxD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QUcsSUFBSSxDQUFDLG9CQUFvQixxQkFBcUIsRUFBRTtZQUMzRSxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUM3RCxDQUFDO2FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7K0dBOUhVLGVBQWU7bUhBQWYsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgbWVyZ2VBbGwsIG1lcmdlTWFwLCBzaGFyZVJlcGxheSwgdGFrZSwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEVtaXNzaW9uTWV0aG9kVGllcixcbiAgSlNPTkxELFxuICBOb2RlVHlwZSxcbiAgU2NoZW1hVHlwZSxcbiAgU2l0ZVNpdGVUeXBlLFxuICBUZXJtVGVybVR5cGUsXG4gIGJsYW5rTm9kZXNUeXBlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGFsbG93ZWRUeXBlLCBJT3JjaGVzdHJhdG9yQ29uZmlnLCBJT3JjaGVzdHJhdG9yTW9kZWxDb25maWcsIGxvYWRDb25maWcgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2NvbmZpZyc7XG5pbXBvcnQgeyB0b0Rhc2hDYXNlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmltcG9ydCB7IEhlQ29tbW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24uc2VydmljZSc7XG5pbXBvcnQgeyBiYXNlVXJsLCBnaXRIb21lLCBnaXRsYWJSYXdVcmwsIGdpdEJyYW5jaCwgZmlsdGVyUGFyYW1zLCBSZXBvc2l0b3J5IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IEhFX0NBTENVTEFUSU9OU19CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdIRV9DQUxDVUxBVElPTlNfQkFTRV9VUkwnKTtcblxuZXhwb3J0IGNvbnN0IGVuZ2luZUdpdEJhc2VVcmwgPSAoKSA9PiBbZ2l0SG9tZSwgUmVwb3NpdG9yeS5tb2RlbHNdLmpvaW4oJy8nKTtcbmV4cG9ydCBjb25zdCBlbmdpbmVHaXRVcmwgPSAoKSA9PiBgJHtlbmdpbmVHaXRCYXNlVXJsKCl9Ly0vYmxvYi8ke2dpdEJyYW5jaCgpfWA7XG5cbmV4cG9ydCBjb25zdCBmaW5kTW9kZWxzID0gKG1vZGVsczogSU1vZGVsW10sIHRlcm1JZDogc3RyaW5nKSA9PiBtb2RlbHMuZmlsdGVyKCh7IHRlcm0gfSkgPT4gdGVybSA9PT0gdGVybUlkKTtcblxuZXhwb3J0IGNvbnN0IGZpbmRNYXRjaGluZ01vZGVsID0gKG1vZGVsczogKElNb2RlbCB8IElNb2RlbFtdKVtdLCBtb2RlbDogUGFydGlhbDxJTW9kZWw+KSA9PlxuICBPYmplY3Qua2V5cyhtb2RlbCkubGVuZ3RoID4gMFxuICAgID8gbW9kZWxzLmZsYXQoKS5maW5kKG0gPT4gT2JqZWN0LmVudHJpZXMobW9kZWwpLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHZhbHVlID09PSBtW2tleV0pKVxuICAgIDogbnVsbDtcblxuZXhwb3J0IGNvbnN0IG1vZGVsUGFyYW1zID0gKG5vZGU6IFBhcnRpYWw8YmxhbmtOb2Rlc1R5cGU+LCBpbmNsdWRlVGVybSA9IHRydWUpID0+XG4gIGZpbHRlclBhcmFtcyh7XG4gICAgbW9kZWw6ICdtZXRob2RNb2RlbCcgaW4gbm9kZSA/IG5vZGU/Lm1ldGhvZE1vZGVsPy5bJ0BpZCddIDogdW5kZWZpbmVkLFxuICAgIC4uLihpbmNsdWRlVGVybSA/IHsgdGVybTogJ3Rlcm0nIGluIG5vZGUgPyBub2RlPy50ZXJtPy5bJ0BpZCddIDogdW5kZWZpbmVkIH0gOiB7fSlcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBtb2RlbEtleVBhcmFtcyA9IChub2RlOiBQYXJ0aWFsPGJsYW5rTm9kZXNUeXBlPiwga2V5OiBzdHJpbmcpID0+XG4gIGZpbHRlclBhcmFtcyh7XG4gICAgbW9kZWw6IChub2RlPy5bJ0B0eXBlJ10gfHwgbm9kZT8udHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKSxcbiAgICBtb2RlbEtleToga2V5XG4gIH0pO1xuXG4vKipcbiAqIEZpbmQgbW9kZWxzIGZyb20gdGhlIG9yY2hlc3RyYXRvciBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIG9yY2hlc3RyYXRvciBjb25maWd1cmF0aW9uIGNvbnRlbnQuXG4gKiBAcGFyYW0gdGVybUlkIFRoZSBgQGlkYCBvZiB0aGUgVGVybS5cbiAqIEBwYXJhbSBtb2RlbEtleSBUaGUga2V5IG9mIHRoZSBjb25maWd1cmF0aW9uIChlLmcuIFwicHJvZHVjdHNcIiwgXCJpbnB1dHNcIilcbiAqIEBwYXJhbSBtb2RlbHMgT3B0aW9uYWwgLSBsaXN0IG9mIG1vZGVscyBmcm9tIGBtb2RlbC1saW5rcy5qc29uYCB0byBkZWZhdWx0IHdoZW4gb3JjaGVzdHJhdG9yIGRvZXMgbm90IGNvbnRhaW4gY29uZmlnLlxuICogQHJldHVybnMgTGlzdCBvZiBtb2RlbHMgZnJvbSBvcmNoZXN0cmF0b3Igb3IgbW9kZWxzIGlmIHNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRDb25maWdNb2RlbHMgPSAoXG4gIGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZyxcbiAgdGVybUlkOiBzdHJpbmcsXG4gIG1vZGVsS2V5OiBzdHJpbmcsXG4gIG1vZGVsczogSU1vZGVsW10gPSBbXVxuKSA9PiB7XG4gIGNvbnN0IGNvbmZpZ01vZGVscyA9IGNvbmZpZy5tb2RlbHNcbiAgICAuZmxhdCgpXG4gICAgLmZpbHRlcigoeyB2YWx1ZSwga2V5IH0pID0+IHRlcm1JZCA9PT0gdmFsdWUgJiYgKCFtb2RlbEtleSB8fCBrZXkgPT09IG1vZGVsS2V5KSk7XG4gIHJldHVybiBjb25maWdNb2RlbHMubGVuZ3RoID8gY29uZmlnTW9kZWxzIDogZmluZE1vZGVscyhtb2RlbHMsIHRlcm1JZCk7XG59O1xuXG5jb25zdCBjdXN0b21UZXJtQXBpRG9jc1BhdGggPSB7XG4gICdleGNyZXRhLWtnLW1hc3MnOiAnZXhjcmV0YS1rZydcbn07XG5cbmV4cG9ydCBjb25zdCBwYXRoVG9BcGlEb2NzUGF0aCA9IChtb2RlbDogc3RyaW5nLCB0ZXJtPzogc3RyaW5nKSA9PlxuICBbXG4gICAgYmFzZVVybChmYWxzZSksXG4gICAgJ2RvY3MnLFxuICAgIFsnI2hlc3RpYS1jYWxjdWxhdGlvbi1tb2RlbHMnLCB0b0Rhc2hDYXNlKG1vZGVsKSwgY3VzdG9tVGVybUFwaURvY3NQYXRoW3RvRGFzaENhc2UodGVybSldIHx8IHRvRGFzaENhc2UodGVybSldXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignLScpXG4gIF0uam9pbignLycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNb2RlbCB7XG4gIC8qKlxuICAgKiBJcyBtb2RlbCBmcm9tIEVjb2ludmVudFYzLlxuICAgKi9cbiAgZWNvaW52ZW50OiBib29sZWFuO1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgaW1wbGVtZW50YXRpb24gKGNvZGUpIG9mIHRoZSBtb2RlbC5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIG1vZGVsLlxuICAgKi9cbiAgZG9jUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgQVBJIERvY3VtZW50YXRpb24uXG4gICAqL1xuICBhcGlEb2NzUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB1c2VkIGFzIGBtZXRob2RNb2RlbGAuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRlcm0gdGhlIG1vZGVsIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIHRlcm0/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kVGllciBvZiB0aGUgRW1pc3Npb24gKGlmIGFwcGxpY2FibGUpLlxuICAgKi9cbiAgbWV0aG9kVGllcj86IEVtaXNzaW9uTWV0aG9kVGllcjtcbiAgLyoqXG4gICAqIEEga2V5IGluIHRoZSBtb2RlbCBpZiB0ZXJtIGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgbW9kZWxLZXk/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJTW9kZWxMaW5rcyB7XG4gIGxpbmtzOiBJTW9kZWxbXTtcbiAgZWNvaW52ZW50TGlua3M/OiBJTW9kZWxbXTtcbiAgZWNvaW52ZW50VjNBbmRFbWJlckNsaW1hdGVMaW5rcz86IElNb2RlbFtdO1xufVxuXG5jb25zdCBtYXBNb2RlbExpbmsgPVxuICAoZWNvaW52ZW50ID0gZmFsc2UpID0+XG4gICh7IHBhdGgsIGRvY1BhdGgsIC4uLmxpbmsgfTogSU1vZGVsKSA9PiAoe1xuICAgIC4uLmxpbmssXG4gICAgZWNvaW52ZW50LFxuICAgIHBhdGg6IGAke2VuZ2luZUdpdFVybCgpfS8ke3BhdGh9YCxcbiAgICBkb2NQYXRoOiBgJHtlbmdpbmVHaXRVcmwoKX0vJHtkb2NQYXRofWAsXG4gICAgYXBpRG9jc1BhdGg6IHBhdGhUb0FwaURvY3NQYXRoKGxpbmsubW9kZWwsIGxpbmsudGVybSB8fCBsaW5rLm1vZGVsS2V5KVxuICB9KTtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FsY3VsYXRpb25zTW9kZWxzUGFyYW1zIHtcbiAgdGVybVR5cGU/OiBTY2hlbWFUeXBlO1xuICBwcm9kdWN0VGVybUlkPzogc3RyaW5nO1xuICBwcm9kdWN0VGVybVR5cGU/OiBUZXJtVGVybVR5cGU7XG4gIHRpZXI/OiBFbWlzc2lvbk1ldGhvZFRpZXI7XG4gIHNpdGVUeXBlPzogU2l0ZVNpdGVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYWxjdWxhdGlvbnNSZXF1aXJlbWVudHNQYXJhbXMgZXh0ZW5kcyBJQ2FsY3VsYXRpb25zTW9kZWxzUGFyYW1zIHtcbiAgZm9ybWF0PzogJ2Nzdic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhbGN1bGF0aW9uc01vZGVsIHtcbiAgbW9kZWw6IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBmaW5kT3JjaGVzdHJhdG9yTW9kZWwgPSAoeyBtb2RlbHMgfTogSU9yY2hlc3RyYXRvckNvbmZpZywgbW9kZWw6IFBhcnRpYWw8SU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnPikgPT5cbiAgT2JqZWN0LmtleXMobW9kZWwpLmxlbmd0aCA+IDBcbiAgICA/IG1vZGVscy5mbGF0KCkuZmluZChtID0+IE9iamVjdC5lbnRyaWVzKG1vZGVsKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSA9PT0gbVtrZXldKSlcbiAgICA6IG51bGw7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEhlRW5naW5lU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhbGN1bGF0aW9uc0Jhc2VVcmwgPSBpbmplY3QoSEVfQ0FMQ1VMQVRJT05TX0JBU0VfVVJMKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb21tb25TZXJ2aWNlID0gaW5qZWN0KEhlQ29tbW9uU2VydmljZSk7XG5cbiAgcHJpdmF0ZSBtb2RlbHNMb2FkaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgbW9kZWxzTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21vZGVscyA9IG5ldyBSZXBsYXlTdWJqZWN0PElNb2RlbFtdPigxKTtcblxuICBwcml2YXRlIF9yZWNvbW1lbmRhdGlvbnM6IHsgW2tleTogc3RyaW5nXTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gfSA9IHt9O1xuICBwcml2YXRlIF9yZXF1aXJlbWVudHM6IHsgW2tleTogc3RyaW5nXTogT2JzZXJ2YWJsZTxKU09OTEQ8Tm9kZVR5cGU+PiB9ID0ge307XG5cbiAgcHVibGljIGxhdGVzdFZlcnNpb24kOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXQoKSB7XG4gICAgdGhpcy5sYXRlc3RWZXJzaW9uJCA9IHRoaXMuaHR0cFxuICAgICAgLmdldDxhbnk+KFxuICAgICAgICBnaXRsYWJSYXdVcmwoeyBhcGlVcmw6IHRoaXMuY29tbW9uU2VydmljZS5hcGlCYXNlVXJsLCByZXBvc2l0b3J5OiBSZXBvc2l0b3J5Lm1vZGVscywgcGF0aDogJ3BhY2thZ2UuanNvbicgfSlcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoZGF0YSA9PiBKU09OLnBhcnNlKGRhdGEpKSxcbiAgICAgICAgbWFwKCh7IHZlcnNpb24gfSkgPT4gdmVyc2lvbilcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMubG9hZE1vZGVscygpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzTG9hZGluZyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxJTW9kZWxMaW5rcz4oXG4gICAgICAgIGdpdGxhYlJhd1VybCh7IGFwaVVybDogdGhpcy5jb21tb25TZXJ2aWNlLmFwaUJhc2VVcmwsIHJlcG9zaXRvcnk6IFJlcG9zaXRvcnkubW9kZWxzLCBwYXRoOiAnbW9kZWwtbGlua3MuanNvbicgfSlcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoZGF0YSA9PiBKU09OLnBhcnNlKGRhdGEgYXMgYW55KSBhcyBJTW9kZWxMaW5rcyksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBsaW5rczogW10gfSBhcyBJTW9kZWxMaW5rcykpLFxuICAgICAgICBtYXAoKHsgbGlua3MsIGVjb2ludmVudExpbmtzLCBlY29pbnZlbnRWM0FuZEVtYmVyQ2xpbWF0ZUxpbmtzIH0pID0+IHtcbiAgICAgICAgICB0aGlzLl9tb2RlbHMubmV4dChbXG4gICAgICAgICAgICAuLi5saW5rcy5tYXAobWFwTW9kZWxMaW5rKGZhbHNlKSksXG4gICAgICAgICAgICAuLi4oZWNvaW52ZW50TGlua3MgfHwgW10pLm1hcChtYXBNb2RlbExpbmsodHJ1ZSkpLFxuICAgICAgICAgICAgLi4uKGVjb2ludmVudFYzQW5kRW1iZXJDbGltYXRlTGlua3MgfHwgW10pLm1hcChtYXBNb2RlbExpbmsodHJ1ZSkpXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5tb2RlbHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tb2RlbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBsaW5rcztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1vZGVscyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzTG9hZGluZyB8fCB0aGlzLm1vZGVsc0xvYWRlZCA/IHRoaXMuX21vZGVscy5hc09ic2VydmFibGUoKSA6IHRoaXMubG9hZE1vZGVscygpO1xuICB9XG5cbiAgcHVibGljIGFsbE1vZGVscyQoaW5jbHVkZUVjb2ludmVudCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzJC5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1lcmdlQWxsKCksXG4gICAgICBmaWx0ZXIoKHsgZWNvaW52ZW50IH0pID0+IGluY2x1ZGVFY29pbnZlbnQgfHwgIWVjb2ludmVudCksXG4gICAgICB0b0FycmF5KClcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG1vZGVsJChtb2RlbDogUGFydGlhbDxJTW9kZWw+KSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzJC5waXBlKG1hcChtb2RlbHMgPT4gZmluZE1hdGNoaW5nTW9kZWwobW9kZWxzLCBtb2RlbCkpKTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlTW9kZWwkKG5vZGU6IFBhcnRpYWw8YmxhbmtOb2Rlc1R5cGU+LCBrZXk/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbCQobW9kZWxQYXJhbXMobm9kZSkpLnBpcGUoXG4gICAgICAvLyBmYWxsYmFjayB0byBtb2RlbEtleVxuICAgICAgbWVyZ2VNYXAodmFsdWUgPT4gKCFrZXkgfHwgdmFsdWUgPyBvZih2YWx1ZSkgOiB0aGlzLm1vZGVsJChtb2RlbEtleVBhcmFtcyhub2RlLCBrZXkpKSkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBtb2RlbChtb2RlbDogUGFydGlhbDxJTW9kZWw+KSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwkKG1vZGVsKS5waXBlKHRha2UoMSkpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHVibGljIGxhdGVzdFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0VmVyc2lvbiQucGlwZSh0YWtlKDEpKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0TW9kZWxzKHBhcmFtczogSUNhbGN1bGF0aW9uc01vZGVsc1BhcmFtcykge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8eyBtb2RlbHM6IElDYWxjdWxhdGlvbnNNb2RlbFtdIH0+KGAke3RoaXMuX2NhbGN1bGF0aW9uc0Jhc2VVcmx9L21vZGVsc2AsIHtcbiAgICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMocGFyYW1zKVxuICAgICAgfSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXF1aXJlbWVudHMkKHBhcmFtczogSUNhbGN1bGF0aW9uc1JlcXVpcmVtZW50c1BhcmFtcykge1xuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGZpbHRlclBhcmFtcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9yZXF1aXJlbWVudHNba2V5XSA9XG4gICAgICB0aGlzLl9yZXF1aXJlbWVudHNba2V5XSB8fFxuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5nZXQ8SlNPTkxEPE5vZGVUeXBlPj4oYCR7dGhpcy5fY2FsY3VsYXRpb25zQmFzZVVybH0vbW9kZWxzL3JlcXVpcmVtZW50c2AsIHtcbiAgICAgICAgICBwYXJhbXM6IGZpbHRlclBhcmFtcyhwYXJhbXMpXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZW1lbnRzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVxdWlyZW1lbnRzKHBhcmFtczogSUNhbGN1bGF0aW9uc1JlcXVpcmVtZW50c1BhcmFtcykge1xuICAgIHJldHVybiB0aGlzLmdldFJlcXVpcmVtZW50cyQocGFyYW1zKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUZXJtSWRzJChwYXJhbXM6IElDYWxjdWxhdGlvbnNSZXF1aXJlbWVudHNQYXJhbXMpIHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShmaWx0ZXJQYXJhbXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcmVjb21tZW5kYXRpb25zW2tleV0gPVxuICAgICAgdGhpcy5fcmVjb21tZW5kYXRpb25zW2tleV0gfHxcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLl9jYWxjdWxhdGlvbnNCYXNlVXJsfS9tb2RlbHMvdGVybS1pZHNgLCB7XG4gICAgICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMocGFyYW1zKVxuICAgICAgICB9KVxuICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29tbWVuZGF0aW9uc1trZXldO1xuICB9XG5cbiAgcHVibGljIG9jaGVzdHJhdG9yQ29uZmlnJCh0eXBlOiBhbGxvd2VkVHlwZSwgaWQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PElPcmNoZXN0cmF0b3JDb25maWc+KGAke3RoaXMuX2NhbGN1bGF0aW9uc0Jhc2VVcmx9L3JlY2FsY3VsYXRlL2NvbmZpZ2AsIHtcbiAgICAgICAgcGFyYW1zOiBmaWx0ZXJQYXJhbXMoeyB0eXBlLCAnQHR5cGUnOiB0eXBlLCBpZCwgJ0BpZCc6IGlkIH0pXG4gICAgICB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihsb2FkQ29uZmlnKHR5cGUpKSkpO1xuICB9XG59XG4iXX0=