@lenne.tech/ng-base 17.0.1 → 18.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base-cms/pages/base-cms/base-cms.component.d.ts +1 -1
- package/base-cms/public-api.d.ts +0 -1
- package/base-components/components/breadcrumb/breadcrumb.component.d.ts +1 -1
- package/base-components/components/change-password/change-password.component.d.ts +1 -1
- package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
- package/base-components/components/delete-account/delete-account.component.d.ts +1 -1
- package/base-components/components/fab-button/fab-button.component.d.ts +1 -1
- package/base-components/components/input/input.component.d.ts +1 -1
- package/base-components/components/model-form/model-form-base.component.d.ts +1 -1
- package/base-components/components/model-form/model-form.component.d.ts +1 -1
- package/base-components/components/model-form-sub/model-form-sub.component.d.ts +1 -1
- package/base-components/components/model-table/model-table.component.d.ts +1 -1
- package/base-components/components/refence-input/refence-input.component.d.ts +1 -1
- package/base-components/components/select/select.component.d.ts +1 -1
- package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +1 -1
- package/base-components/components/tags/tags.component.d.ts +1 -1
- package/base-components/components/textarea/textarea.component.d.ts +1 -1
- package/base-components/components/toast/toast.component.d.ts +1 -1
- package/base-components/components/upload-image/upload-image.component.d.ts +1 -1
- package/base-components/directives/back-button.directive.d.ts +1 -1
- package/base-components/directives/context-menu.directive.d.ts +1 -1
- package/base-components/directives/sort.directive.d.ts +1 -1
- package/base-components/directives/stop-propagation.directive.d.ts +1 -1
- package/base-components/pipes/ellipses.pipe.d.ts +1 -1
- package/base-components/public-api.d.ts +0 -1
- package/base-prototype/pages/email-verification/email-verification.component.d.ts +1 -1
- package/base-prototype/pages/forgot-password/forgot-password.component.d.ts +1 -1
- package/base-prototype/pages/login/login.component.d.ts +1 -1
- package/base-prototype/pages/profile/profile.component.d.ts +1 -1
- package/base-prototype/pages/register/register.component.d.ts +2 -2
- package/base-prototype/pages/set-password/set-password.component.d.ts +1 -1
- package/base-prototype/public-api.d.ts +0 -1
- package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +14 -8
- package/esm2022/base-cms/public-api.mjs +1 -3
- package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +10 -7
- package/esm2022/base-components/components/change-password/change-password.component.mjs +11 -9
- package/esm2022/base-components/components/checkbox/checkbox.component.mjs +10 -6
- package/esm2022/base-components/components/delete-account/delete-account.component.mjs +5 -6
- package/esm2022/base-components/components/fab-button/fab-button.component.mjs +11 -7
- package/esm2022/base-components/components/input/input.component.mjs +10 -6
- package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +5 -6
- package/esm2022/base-components/components/model-form/model-form-base.component.mjs +5 -4
- package/esm2022/base-components/components/model-form/model-form.component.mjs +17 -10
- package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +20 -13
- package/esm2022/base-components/components/model-table/model-table.component.mjs +23 -14
- package/esm2022/base-components/components/refence-input/refence-input.component.mjs +13 -7
- package/esm2022/base-components/components/select/select.component.mjs +10 -6
- package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +8 -6
- package/esm2022/base-components/components/tags/tags.component.mjs +11 -7
- package/esm2022/base-components/components/textarea/textarea.component.mjs +10 -6
- package/esm2022/base-components/components/toast/toast.component.mjs +8 -6
- package/esm2022/base-components/components/upload-image/upload-image.component.mjs +13 -9
- package/esm2022/base-components/directives/back-button.directive.mjs +5 -4
- package/esm2022/base-components/directives/context-menu.directive.mjs +5 -4
- package/esm2022/base-components/directives/sort.directive.mjs +5 -4
- package/esm2022/base-components/directives/stop-propagation.directive.mjs +5 -4
- package/esm2022/base-components/pipes/ellipses.pipe.mjs +5 -4
- package/esm2022/base-components/public-api.mjs +1 -3
- package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +5 -6
- package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +12 -8
- package/esm2022/base-prototype/pages/login/login.component.mjs +12 -8
- package/esm2022/base-prototype/pages/profile/profile.component.mjs +8 -6
- package/esm2022/base-prototype/pages/register/register.component.mjs +14 -9
- package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +11 -9
- package/esm2022/base-prototype/public-api.mjs +1 -3
- package/esm2022/shared/classes/basic-user.class.mjs +1 -1
- package/esm2022/shared/classes/graphql-meta.class.mjs +1 -1
- package/esm2022/shared/classes/helper.class.mjs +1 -1
- package/esm2022/shared/classes/sort.class.mjs +1 -1
- package/esm2022/shared/classes/standard.class.mjs +1 -1
- package/esm2022/shared/functions/ws-client.function.mjs +1 -1
- package/esm2022/shared/services/auth.service.mjs +4 -4
- package/esm2022/shared/services/breadcrumb.service.mjs +4 -4
- package/esm2022/shared/services/cms.service.mjs +4 -4
- package/esm2022/shared/services/file.service.mjs +4 -4
- package/esm2022/shared/services/forms.service.mjs +4 -4
- package/esm2022/shared/services/graphql-meta.service.mjs +4 -4
- package/esm2022/shared/services/graphql-plus.service.mjs +4 -4
- package/esm2022/shared/services/graphql.service.mjs +7 -7
- package/esm2022/shared/services/image.service.mjs +4 -4
- package/esm2022/shared/services/loader.service.mjs +4 -4
- package/esm2022/shared/services/navigation.service.mjs +4 -4
- package/esm2022/shared/services/scroll.service.mjs +4 -4
- package/esm2022/shared/services/storage.service.mjs +4 -4
- package/esm2022/shared/services/toast.service.mjs +4 -4
- package/esm2022/shared/services/user.service.mjs +3 -3
- package/esm2022/shared/services/ws.service.mjs +3 -3
- package/esm2022/shared/validators/match.validator.mjs +1 -1
- package/esm2022/src/base.module.mjs +7 -40
- package/esm2022/src/decorators/auto-unsubscribe.decorator.mjs +1 -1
- package/esm2022/src/directives/lazy-load.directive.mjs +5 -4
- package/esm2022/src/directives/match-height.directive.mjs +5 -4
- package/esm2022/src/directives/resizable.directive.mjs +5 -4
- package/esm2022/src/factories/apollo-options.factory.mjs +1 -1
- package/esm2022/src/functions/extract-files.function.mjs +1 -1
- package/esm2022/src/guards/auth.guard.mjs +4 -4
- package/esm2022/src/guards/can-deactivate.guard.mjs +3 -3
- package/esm2022/src/guards/logout.guard.mjs +4 -4
- package/esm2022/src/pipes/date-ago.pipe.mjs +5 -4
- package/esm2022/src/pipes/safe-html.pipe.mjs +5 -5
- package/esm2022/src/services/fullscreen.service.mjs +4 -4
- package/esm2022/src/services/seo.service.mjs +4 -4
- package/esm2022/src/services/theme.service.mjs +4 -4
- package/fesm2022/lenne.tech-ng-base-base-cms.mjs +16 -93
- package/fesm2022/lenne.tech-ng-base-base-cms.mjs.map +1 -1
- package/fesm2022/lenne.tech-ng-base-base-components.mjs +669 -697
- package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +1 -1
- package/fesm2022/lenne.tech-ng-base-base-prototype.mjs +48 -74
- package/fesm2022/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
- package/fesm2022/lenne.tech-ng-base-shared.mjs +51 -51
- package/fesm2022/lenne.tech-ng-base-shared.mjs.map +1 -1
- package/fesm2022/lenne.tech-ng-base.mjs +199 -223
- package/fesm2022/lenne.tech-ng-base.mjs.map +1 -1
- package/package.json +12 -12
- package/src/base.module.d.ts +2 -8
- package/src/directives/lazy-load.directive.d.ts +1 -1
- package/src/directives/match-height.directive.d.ts +1 -1
- package/src/directives/resizable.directive.d.ts +1 -1
- package/src/pipes/date-ago.pipe.d.ts +1 -1
- package/src/pipes/safe-html.pipe.d.ts +1 -1
- package/base-cms/base-cms-routing.module.d.ts +0 -7
- package/base-cms/base-cms.module.d.ts +0 -26
- package/base-components/base-components.module.d.ts +0 -32
- package/base-prototype/base-prototype.module.d.ts +0 -17
- package/esm2022/base-cms/base-cms-routing.module.mjs +0 -32
- package/esm2022/base-cms/base-cms.module.mjs +0 -60
- package/esm2022/base-components/base-components.module.mjs +0 -122
- package/esm2022/base-prototype/base-prototype.module.mjs +0 -53
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef
|
|
2
|
-
import { GraphQLRequestType, ToastType
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { GraphQLRequestType, ToastType } from '@lenne.tech/ng-base/shared';
|
|
3
3
|
import { FormControl } from '@angular/forms';
|
|
4
4
|
import { Subscription } from 'rxjs';
|
|
5
|
+
import { DatePipe, NgClass } from '@angular/common';
|
|
6
|
+
import { SelectComponent } from '../select/select.component';
|
|
7
|
+
import { ContextMenuDirective } from '../../directives/context-menu.directive';
|
|
8
|
+
import { SortDirective } from '../../directives/sort.directive';
|
|
9
|
+
import { EllipsesPipe } from '../../pipes/ellipses.pipe';
|
|
10
|
+
import { ModelFormComponent } from '../model-form/model-form.component';
|
|
11
|
+
import { FabButtonComponent } from '../fab-button/fab-button.component';
|
|
5
12
|
import * as i0 from "@angular/core";
|
|
6
13
|
import * as i1 from "@lenne.tech/ng-base/shared";
|
|
7
|
-
import * as i2 from "@angular/common";
|
|
8
|
-
import * as i3 from "../../directives/sort.directive";
|
|
9
|
-
import * as i4 from "../../directives/context-menu.directive";
|
|
10
|
-
import * as i5 from "../select/select.component";
|
|
11
|
-
import * as i6 from "../model-form/model-form.component";
|
|
12
|
-
import * as i7 from "../fab-button/fab-button.component";
|
|
13
|
-
import * as i8 from "../../pipes/ellipses.pipe";
|
|
14
14
|
export class ModelTableComponent {
|
|
15
15
|
graphQLMetaService;
|
|
16
16
|
graphQLService;
|
|
@@ -426,12 +426,21 @@ export class ModelTableComponent {
|
|
|
426
426
|
this.storageService.save('pageIndex', this.selectedPageIndex);
|
|
427
427
|
this.objects = await this.loadObjects(this.availableFields, this.pages[this.selectedPageIndex].skip, this.pages[this.selectedPageIndex].limit);
|
|
428
428
|
}
|
|
429
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
430
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.4", type: ModelTableComponent, selector: "base-model-table", inputs: { modelName: "modelName", objectId: "objectId", createMode: "createMode", logging: "logging", create: "create", update: "update", delete: "delete", import: "import", export: "export", duplicate: "duplicate", modelConfig: "modelConfig", config: "config", showFavButton: "showFavButton" }, outputs: { idSelected: "idSelected", createModeChanged: "createModeChanged" }, viewQueries: [{ propertyName: "customFormTemplate", first: true, predicate: ["customFormTemplate"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"!id && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n <h2 id=\"model-table-top\" class=\"mb-0\" *ngIf=\"modelName\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n <div class=\"btn-group me-4\" *ngIf=\"import || export\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"export\" (click)=\"processExport()\">Export</a></li>\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"import\" (click)=\"importFile.click()\"> Import </a></li>\n </ul>\n </div>\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div class=\"container-fluid\" *ngIf=\"totalCount >= 0\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n <li class=\"page-item\" *ngFor=\"let page of pages; let i = index\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n (baseSorted)=\"objects = $event\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses : 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n <div class=\"table-card\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <div class=\"table-card-entry\" *ngFor=\"let field of availableFields; let i = index\" (click)=\"selectId(object)\">\n <b *ngIf=\"i > 0\"\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses : 60 }}\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"container-fluid\" *ngIf=\"totalCount >= 0\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n <li class=\"page-item\" *ngFor=\"let page of pages; let i = index\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" (click)=\"openNewTab({ id: contextMenuData.clickedElement?.id })\">\n In neuen Tab \u00F6ffnen\n </div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"id || createMode\">\n <button class=\"d-none d-lg-block btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n *ngIf=\"!modelConfig?.customTemplateComponent\"\n [modelName]=\"camelModelName\"\n [label]=\"modelConfig?.label\"\n [config]=\"config\"\n [logging]=\"logging\"\n [id]=\"id\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n [showFavButton]=\"showFavButton\"\n ></base-model-form>\n <ng-template *ngIf=\"modelConfig?.customTemplateComponent\" #customFormTemplate></ng-template>\n</div>\n\n<div class=\"responsive-action-button d-block d-lg-none\">\n <base-fab-button\n [fabIcon]=\"'bi-plus'\"\n (click)=\"createNewObject()\"\n *ngIf=\"!(id || createMode) && showFavButton\"\n ></base-fab-button>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px;z-index:999}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}.table-card{background:var(--bs-white);padding:10px;margin-bottom:10px}.table-card-entry{margin-top:4px}.table-card-entry-first{font-size:18px;font-weight:800;color:var(--bs-primary)}.responsive-action-button{position:fixed;bottom:15px;right:15px}.bi-three-dots-vertical{font-size:18px;line-height:18px}.page-item{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.SortDirective, selector: "[baseSort]", inputs: ["baseSort"], outputs: ["baseSorted"] }, { kind: "directive", type: i4.ContextMenuDirective, selector: "[ltContextMenu]", inputs: ["contextMenuData", "ltContextMenu", "xGap", "yGap", "overflowSpace", "selectors"], outputs: ["clickedElement"], exportAs: ["contextMenuData"] }, { kind: "component", type: i5.SelectComponent, selector: "base-select", inputs: ["id", "name", "infoText", "label", "placeholder", "objectPath", "control", "tabIndex", "required", "multiple", "search", "options"] }, { kind: "component", type: i6.ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "onlyUpdateMode", "duplicate", "logging", "config", "showFavButton"], outputs: ["finished"] }, { kind: "component", type: i7.FabButtonComponent, selector: "base-fab-button", inputs: ["fabIcon", "buttons"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i8.EllipsesPipe, name: "baseEllipses" }] });
|
|
429
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ModelTableComponent, deps: [{ token: i1.GraphQLMetaService }, { token: i1.GraphQLService }, { token: i1.CmsService }, { token: i1.ToastService }, { token: i1.ScrollService }, { token: i1.StorageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
430
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: ModelTableComponent, isStandalone: true, selector: "base-model-table", inputs: { modelName: "modelName", objectId: "objectId", createMode: "createMode", logging: "logging", create: "create", update: "update", delete: "delete", import: "import", export: "export", duplicate: "duplicate", modelConfig: "modelConfig", config: "config", showFavButton: "showFavButton" }, outputs: { idSelected: "idSelected", createModeChanged: "createModeChanged" }, viewQueries: [{ propertyName: "customFormTemplate", first: true, predicate: ["customFormTemplate"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "@if (!id && !createMode) {\n <div>\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n @if (modelName) {\n <h2 id=\"model-table-top\" class=\"mb-0\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n }\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n @if (import || export) {\n <div class=\"btn-group me-4\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li>@if (export) {\n <a class=\"dropdown-item cursor-pointer\" (click)=\"processExport()\">Export</a>\n }</li>\n <li>@if (import) {\n <a class=\"dropdown-item cursor-pointer\" (click)=\"importFile.click()\"> Import </a>\n }</li>\n </ul>\n </div>\n }\n @if (create) {\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\">Erstellen</button>\n }\n </div>\n </div>\n @if (totalCount >= 0) {\n <div class=\"container-fluid\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n @for (page of pages; track page; let i = $index) {\n <li class=\"page-item\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n }\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n }\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n @for (field of availableFields; track field) {\n <th\n scope=\"col\"\n [baseSort]=\"objects\"\n (baseSorted)=\"objects = $event\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (object of objects; track object) {\n <tr class=\"object-col\" [id]=\"object[uniqueField]\">\n @for (field of availableFields; track field) {\n <td class=\"cursor-pointer\" (click)=\"selectId(object)\">\n @if (tableFields[field]?.dateFormat) {\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n }\n @if (tableFields[field]?.enumValues) {\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n }\n @if (!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues) {\n {{ object[field] | baseEllipses : 60 }}\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n @for (object of objects; track object) {\n <div class=\"table-card\" [id]=\"object[uniqueField]\">\n @for (field of availableFields; track field; let i = $index) {\n <div class=\"table-card-entry\" (click)=\"selectId(object)\">\n @if (i > 0) {\n <b\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n }\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n @if (tableFields[field]?.dateFormat) {\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n }\n @if (tableFields[field]?.enumValues) {\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n }\n @if (!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues) {\n {{ object[field] | baseEllipses : 60 }}\n }\n </p>\n </div>\n }\n </div>\n }\n </div>\n @if (totalCount >= 0) {\n <div class=\"container-fluid\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n @for (page of pages; track page; let i = $index) {\n <li class=\"page-item\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n }\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n }\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" (click)=\"openNewTab({ id: contextMenuData.clickedElement?.id })\">\n In neuen Tab \u00F6ffnen\n </div>\n @if (duplicate) {\n <div class=\"context-menu-item\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n }\n @if (delete) {\n <div class=\"context-menu-item\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n @if (id || createMode) {\n <div class=\"w-100\">\n <button class=\"d-none d-lg-block btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n @if (!modelConfig?.customTemplateComponent) {\n <base-model-form\n [modelName]=\"camelModelName\"\n [label]=\"modelConfig?.label\"\n [config]=\"config\"\n [logging]=\"logging\"\n [id]=\"id\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n [showFavButton]=\"showFavButton\"\n ></base-model-form>\n }\n @if (modelConfig?.customTemplateComponent) {\n <ng-template #customFormTemplate></ng-template>\n }\n </div>\n }\n\n <div class=\"responsive-action-button d-block d-lg-none\">\n @if (!(id || createMode) && showFavButton) {\n <base-fab-button\n [fabIcon]=\"'bi-plus'\"\n (click)=\"createNewObject()\"\n ></base-fab-button>\n }\n </div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px;z-index:999}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}.table-card{background:var(--bs-white);padding:10px;margin-bottom:10px}.table-card-entry{margin-top:4px}.table-card-entry-first{font-size:18px;font-weight:800;color:var(--bs-primary)}.responsive-action-button{position:fixed;bottom:15px;right:15px}.bi-three-dots-vertical{font-size:18px;line-height:18px}.page-item{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SelectComponent, selector: "base-select", inputs: ["id", "name", "infoText", "label", "placeholder", "objectPath", "control", "tabIndex", "required", "multiple", "search", "options"] }, { kind: "directive", type: ContextMenuDirective, selector: "[ltContextMenu]", inputs: ["contextMenuData", "ltContextMenu", "xGap", "yGap", "overflowSpace", "selectors"], outputs: ["clickedElement"], exportAs: ["contextMenuData"] }, { kind: "directive", type: SortDirective, selector: "[baseSort]", inputs: ["baseSort"], outputs: ["baseSorted"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: EllipsesPipe, name: "baseEllipses" }, { kind: "component", type: ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "onlyUpdateMode", "duplicate", "logging", "config", "showFavButton"], outputs: ["finished"] }, { kind: "component", type: FabButtonComponent, selector: "base-fab-button", inputs: ["fabIcon", "buttons"] }] });
|
|
431
431
|
}
|
|
432
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
432
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ModelTableComponent, decorators: [{
|
|
433
433
|
type: Component,
|
|
434
|
-
args: [{ selector: 'base-model-table',
|
|
434
|
+
args: [{ selector: 'base-model-table', standalone: true, imports: [
|
|
435
|
+
NgClass,
|
|
436
|
+
SelectComponent,
|
|
437
|
+
ContextMenuDirective,
|
|
438
|
+
SortDirective,
|
|
439
|
+
DatePipe,
|
|
440
|
+
EllipsesPipe,
|
|
441
|
+
ModelFormComponent,
|
|
442
|
+
FabButtonComponent,
|
|
443
|
+
], template: "@if (!id && !createMode) {\n <div>\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n @if (modelName) {\n <h2 id=\"model-table-top\" class=\"mb-0\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n }\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n @if (import || export) {\n <div class=\"btn-group me-4\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li>@if (export) {\n <a class=\"dropdown-item cursor-pointer\" (click)=\"processExport()\">Export</a>\n }</li>\n <li>@if (import) {\n <a class=\"dropdown-item cursor-pointer\" (click)=\"importFile.click()\"> Import </a>\n }</li>\n </ul>\n </div>\n }\n @if (create) {\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\">Erstellen</button>\n }\n </div>\n </div>\n @if (totalCount >= 0) {\n <div class=\"container-fluid\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n @for (page of pages; track page; let i = $index) {\n <li class=\"page-item\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n }\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n }\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n @for (field of availableFields; track field) {\n <th\n scope=\"col\"\n [baseSort]=\"objects\"\n (baseSorted)=\"objects = $event\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (object of objects; track object) {\n <tr class=\"object-col\" [id]=\"object[uniqueField]\">\n @for (field of availableFields; track field) {\n <td class=\"cursor-pointer\" (click)=\"selectId(object)\">\n @if (tableFields[field]?.dateFormat) {\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n }\n @if (tableFields[field]?.enumValues) {\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n }\n @if (!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues) {\n {{ object[field] | baseEllipses : 60 }}\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n @for (object of objects; track object) {\n <div class=\"table-card\" [id]=\"object[uniqueField]\">\n @for (field of availableFields; track field; let i = $index) {\n <div class=\"table-card-entry\" (click)=\"selectId(object)\">\n @if (i > 0) {\n <b\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n }\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n @if (tableFields[field]?.dateFormat) {\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n }\n @if (tableFields[field]?.enumValues) {\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n }\n @if (!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues) {\n {{ object[field] | baseEllipses : 60 }}\n }\n </p>\n </div>\n }\n </div>\n }\n </div>\n @if (totalCount >= 0) {\n <div class=\"container-fluid\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n @for (page of pages; track page; let i = $index) {\n <li class=\"page-item\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n }\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n }\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" (click)=\"openNewTab({ id: contextMenuData.clickedElement?.id })\">\n In neuen Tab \u00F6ffnen\n </div>\n @if (duplicate) {\n <div class=\"context-menu-item\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n }\n @if (delete) {\n <div class=\"context-menu-item\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n @if (id || createMode) {\n <div class=\"w-100\">\n <button class=\"d-none d-lg-block btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n @if (!modelConfig?.customTemplateComponent) {\n <base-model-form\n [modelName]=\"camelModelName\"\n [label]=\"modelConfig?.label\"\n [config]=\"config\"\n [logging]=\"logging\"\n [id]=\"id\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n [showFavButton]=\"showFavButton\"\n ></base-model-form>\n }\n @if (modelConfig?.customTemplateComponent) {\n <ng-template #customFormTemplate></ng-template>\n }\n </div>\n }\n\n <div class=\"responsive-action-button d-block d-lg-none\">\n @if (!(id || createMode) && showFavButton) {\n <base-fab-button\n [fabIcon]=\"'bi-plus'\"\n (click)=\"createNewObject()\"\n ></base-fab-button>\n }\n </div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px;z-index:999}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}.table-card{background:var(--bs-white);padding:10px;margin-bottom:10px}.table-card-entry{margin-top:4px}.table-card-entry-first{font-size:18px;font-weight:800;color:var(--bs-primary)}.responsive-action-button{position:fixed;bottom:15px;right:15px}.bi-three-dots-vertical{font-size:18px;line-height:18px}.page-item{cursor:pointer}\n"] }]
|
|
435
444
|
}], ctorParameters: () => [{ type: i1.GraphQLMetaService }, { type: i1.GraphQLService }, { type: i1.CmsService }, { type: i1.ToastService }, { type: i1.ScrollService }, { type: i1.StorageService }], propDecorators: { modelName: [{
|
|
436
445
|
type: Input
|
|
437
446
|
}], objectId: [{
|
|
@@ -466,4 +475,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
|
|
|
466
475
|
type: ViewChild,
|
|
467
476
|
args: ['customFormTemplate', { read: ViewContainerRef }]
|
|
468
477
|
}] } });
|
|
469
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNvbXBvbmVudHMvY29tcG9uZW50cy9tb2RlbC10YWJsZS9tb2RlbC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLXRhYmxlL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBT0wsa0JBQWtCLEVBTWxCLFNBQVMsR0FDVixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBT3BDLE1BQU0sT0FBTyxtQkFBbUI7SUFvRXBCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXhFRCxTQUFTLENBQVM7SUFDbEIsUUFBUSxDQUFTO0lBQ2pCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2QsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNkLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDZCxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2QsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNkLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsV0FBVyxHQUFtQixJQUFJLENBQUM7SUFDbkMsTUFBTSxDQUFvQztJQUMxQyxhQUFhLEdBQUcsS0FBSyxD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S0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVzRCxrQkFBa0I7c0JBQTlFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ01TRmllbGRDb25maWcsXG4gIENNU01vZGVsQ29uZmlnLFxuICBDbXNTZXJ2aWNlLFxuICBDTVNUYWJsZUZpZWxkLFxuICBHcmFwaFFMTWV0YSxcbiAgR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICBHcmFwaFFMUmVxdWVzdFR5cGUsXG4gIEdyYXBoUUxTZXJ2aWNlLFxuICBHcmFwaFFMVHlwZSxcbiAgU2Nyb2xsU2VydmljZSxcbiAgU3RvcmFnZVNlcnZpY2UsXG4gIFRvYXN0U2VydmljZSxcbiAgVG9hc3RUeXBlLFxufSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdiYXNlLW1vZGVsLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kZWwtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBtb2RlbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgb2JqZWN0SWQ6IHN0cmluZztcbiAgQElucHV0KCkgY3JlYXRlTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2dnaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNyZWF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIHVwZGF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGRlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGltcG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGV4cG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIG1vZGVsQ29uZmlnOiBDTVNNb2RlbENvbmZpZyA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBDTVNGaWVsZENvbmZpZyB9O1xuICBASW5wdXQoKSBzaG93RmF2QnV0dG9uID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGlkU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNyZWF0ZU1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUZvcm1UZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjdXN0b21Gb3JtVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgdW5pcXVlRmllbGQgPSAnaWQnO1xuICB0YWJsZUZpZWxkczogQ01TVGFibGVGaWVsZCA9IHtcbiAgICBpZDogeyBsYWJlbDogJ0lEJyB9LFxuICAgIG5hbWU6IHsgbGFiZWw6ICdOYW1lJyB9LFxuICAgIHRpdGxlOiB7IGxhYmVsOiAnVGl0ZWwnIH0sXG4gICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdCZXNjaHJlaWJ1bmcnIH0sXG4gICAgZW1haWw6IHsgbGFiZWw6ICdFLU1haWwnIH0sXG4gICAgY3JlYXRlZEF0OiB7IGxhYmVsOiAnRXJzdGVsbHQgYW0nLCBkYXRlRm9ybWF0OiAnZGQuTU0uWVlZWSBISDptbScgfSxcbiAgICB1cGRhdGVkQXQ6IHsgbGFiZWw6ICdCZWFyYmVpdGV0IGFtJywgZGF0ZUZvcm1hdDogJ2RkLk1NLllZWVkgSEg6bW0nIH0sXG4gIH07XG4gIG1ldGEhOiBHcmFwaFFMTWV0YTtcbiAgb2JqZWN0czogYW55W10gPSBbXTtcbiAgYXZhaWxhYmxlRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZCA9ICcnO1xuICBxdWVyeU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIGNhbWVsTW9kZWxOYW1lOiBzdHJpbmc7XG4gIHBvc3NpYmxlRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBHcmFwaFFMVHlwZT4gPSB7fTtcbiAgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHVuZGVmaW5lZDtcblxuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIHNlbGVjdGVkUGFnZUluZGV4ID0gMDtcbiAgcGFnZXMgPSBbXTtcbiAgcGFnZUl0ZW1zTGltaXRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKDI1KTtcbiAgcGFnZU9wdGlvbnMgPSBbXG4gICAge1xuICAgICAgdGV4dDogJzI1JyxcbiAgICAgIHZhbHVlOiAyNSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6ICc1MCcsXG4gICAgICB2YWx1ZTogNTAsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiAnNzUnLFxuICAgICAgdmFsdWU6IDc1LFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJzEwMCcsXG4gICAgICB2YWx1ZTogMTAwLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJzIwMCcsXG4gICAgICB2YWx1ZTogMjAwLFxuICAgIH0sXG4gIF07XG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhRTFNlcnZpY2U6IEdyYXBoUUxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIE5lZWRlZCB0aW1lIG91dCB0byBwcmV2ZW50IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW50ZWdyYXRlQ3VzdG9tRm9ybUNvbXBvbmVudCgpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VJdGVtc0xpbWl0ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSXRlbXNMaW1pdCcpO1xuICAgIHRoaXMucGFnZUl0ZW1zTGltaXRDb250cm9sLnNldFZhbHVlKHBhZ2VJdGVtc0xpbWl0ID8gcGFnZUl0ZW1zTGltaXQgOiAyNSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoKS5zdWJzY3JpYmUoKG1ldGEpID0+IHtcbiAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgIGlmICh0aGlzLm1vZGVsTmFtZSkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG5cbiAgICAgICAgLy8gTmVlZGVkIHRpbWUgb3V0IGZvciByZXJlbmRlclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVncmF0ZUN1c3RvbUZvcm1Db21wb25lbnQoKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydtb2RlbE5hbWUnXSAmJiB0aGlzLm1ldGEpIHtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydvYmplY3RJZCddICYmIHRoaXMubWV0YSkge1xuICAgICAgaWYgKHRoaXMuaWQgIT09IHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50OjpuZ09uQ2hhbmdlcy0+c2VsZWN0ZWRJZCcsIHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogV2UncmUgdXNpbmcgdGhlIGBtZXRhYCBzZXJ2aWNlIHRvIGdldCB0aGUgZmllbGRzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGBmaW5kYCBxdWVyeSBmb3IgdGhlIG1vZGVsIHdlJ3JlIHdvcmtpbmdcbiAgICogd2l0aC4gV2UncmUgdGhlbiB1c2luZyB0aGF0IGluZm9ybWF0aW9uIHRvIHBvcHVsYXRlIHRoZSBgYXZhaWxhYmxlRmllbGRzYCBhcnJheVxuICAgKi9cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyA9IFtdO1xuICAgIHRoaXMucGFnZXMgPSBbXTtcbiAgICB0aGlzLnRvdGFsQ291bnQgPSBudWxsO1xuICAgIHRoaXMuY2FtZWxNb2RlbE5hbWUgPSB0aGlzLmtlYmFiVG9DYW1lbENhc2UodGhpcy5tb2RlbE5hbWUpO1xuXG4gICAgLy8gU2V0IHF1ZXJ5IG5hbWVcbiAgICBpZiAoIXRoaXMubW9kZWxDb25maWc/LnF1ZXJ5TmFtZSkge1xuICAgICAgdGhpcy5xdWVyeU5hbWUgPSAnZmluZEFuZENvdW50JyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMuY2FtZWxNb2RlbE5hbWUpICsgJ3MnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5TmFtZSA9IHRoaXMubW9kZWxDb25maWc/LnF1ZXJ5TmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbENvbmZpZz8udGFibGVGaWVsZHMpIHtcbiAgICAgIHRoaXMudGFibGVGaWVsZHMgPSB0aGlzLm1vZGVsQ29uZmlnLnRhYmxlRmllbGRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5tb2RlbE5hbWUnLCB0aGlzLm1vZGVsTmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+Y2FtZWxNb2RlbE5hbWUnLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5xdWVyeU5hbWUnLCB0aGlzLnF1ZXJ5TmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+dGFibGVGaWVsZHMnLCB0aGlzLnRhYmxlRmllbGRzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc3NpYmxlRmllbGRzID0gdGhpcy5tZXRhLmdldEZpZWxkcyh0aGlzLnF1ZXJ5TmFtZSkuZmllbGRzO1xuICAgIGxldCBrZXlzO1xuICAgIGlmICh0aGlzLnBvc3NpYmxlRmllbGRzPy5pdGVtcyAmJiBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzPy5pdGVtcz8uZmllbGRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5wb3NzaWJsZUZpZWxkcy5pdGVtcy5maWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5wb3NzaWJsZUZpZWxkcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVGaWVsZEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnRhYmxlRmllbGRzKTtcbiAgICB0YWJsZUZpZWxkS2V5cz8uZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmIChrZXlzLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5wb3NzaWJsZUZpZWxkcycsIHRoaXMucG9zc2libGVGaWVsZHMpO1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPmtleXMnLCBrZXlzKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5hdmFpbGFibGVGaWVsZHMnLCB0aGlzLmF2YWlsYWJsZUZpZWxkcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWQoJ3BhZ2VJbmRleCcpIDogMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKHRoaXMuYXZhaWxhYmxlRmllbGRzLCAwLCB0aGlzLnBhZ2VJdGVtc0xpbWl0Q29udHJvbC52YWx1ZSk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1BhZ2VJdGVtcygpO1xuICB9XG5cbiAgc3Vic2NyaWJlVG9QYWdlSXRlbXMoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5wYWdlSXRlbXNMaW1pdENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncGFnZUluZGV4JywgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCk7XG4gICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyh0aGlzLmF2YWlsYWJsZUZpZWxkcywgMCwgdmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncGFnZUl0ZW1zTGltaXQnLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBpbnRlZ3JhdGVDdXN0b21Gb3JtQ29tcG9uZW50KCkge1xuICAgIGlmICghdGhpcy5jdXN0b21Gb3JtVGVtcGxhdGUgfHwgdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLm1vZGVsQ29uZmlnPy5jdXN0b21UZW1wbGF0ZUNvbXBvbmVudDtcbiAgICBpZiAoY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tRm9ybVRlbXBsYXRlPy5jcmVhdGVDb21wb25lbnQ8YW55PihjdXN0b21Db21wb25lbnQpO1xuICAgICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0SWQoJycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q2hhbmdlc0luQ29tcG9uZW50UmVmKCkge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgZGVsZXRlOiB0aGlzLmRlbGV0ZSxcbiAgICAgICAgZHVwbGljYXRlOiB0aGlzLmR1cGxpY2F0ZSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGxhYmVsOiB0aGlzLm1vZGVsQ29uZmlnPy5sYWJlbCxcbiAgICAgICAgbG9nZ2luZzogdGhpcy5sb2dnaW5nLFxuICAgICAgICBtb2RlbE5hbWU6IHRoaXMuY2FtZWxNb2RlbE5hbWUsXG4gICAgICAgIHNob3dGYXZCdXR0b246IHRoaXMuc2hvd0ZhdkJ1dHRvbixcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJDcmVhdGUgTmV3XCIgYnV0dG9uLCB0aGUgY3JlYXRlTW9kZUNoYW5nZWQgZXZlbnQgaXMgZW1pdHRlZCwgd2hpY2ggaXMgdGhlbiBoYW5kbGVkIGJ5IHRoZVxuICAgKiBwYXJlbnQgY29tcG9uZW50XG4gICAqL1xuICBjcmVhdGVOZXdPYmplY3QoKSB7XG4gICAgdGhpcy5jcmVhdGVNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZU1vZGVDaGFuZ2VkLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgbG9hZHMgdGhlIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBvYmplY3RzIHZhcmlhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBzdHJpbmdbXSAtIFRoZSBmaWVsZHMgeW91IHdhbnQgdG8gbG9hZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHNraXBcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqL1xuICBsb2FkT2JqZWN0cyhmaWVsZHM6IHN0cmluZ1tdLCBza2lwID0gMCwgbGltaXQgPSAyNSk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55W10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RGaWVsZHMgPSBbLi4uZmllbGRzXTtcbiAgICAgIGNvbnN0IGlkSW5GaWVsZHMgPSByZXF1ZXN0RmllbGRzLmZpbmQoKGUpID0+IGUgPT09ICdpZCcpO1xuXG4gICAgICBpZiAoIWlkSW5GaWVsZHMpIHtcbiAgICAgICAgcmVxdWVzdEZpZWxkcy5wdXNoKCdpZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZpbmRBbmRDb3VudCA9IHRoaXMucXVlcnlOYW1lLmluY2x1ZGVzKCdmaW5kQW5kQ291bnQnKTtcblxuICAgICAgdGhpcy5ncmFwaFFMU2VydmljZVxuICAgICAgICAuZ3JhcGhRbCh0aGlzLnF1ZXJ5TmFtZSwge1xuICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgbGltaXQ6IGlzRmluZEFuZENvdW50ID8gbGltaXQgOiBudWxsLFxuICAgICAgICAgICAgc2tpcDogaXNGaW5kQW5kQ291bnQgPyBza2lwIDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogaXNGaW5kQW5kQ291bnQgPyBbJ3RvdGFsQ291bnQnLCB7IGl0ZW1zOiByZXF1ZXN0RmllbGRzIH1dIDogcmVxdWVzdEZpZWxkcyxcbiAgICAgICAgICB0eXBlOiBHcmFwaFFMUmVxdWVzdFR5cGUuUVVFUlksXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6bG9hZE9iamVjdHMtPnZhbHVlJywgdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWU/LnRvdGFsQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtcyA9IHZhbHVlLml0ZW1zO1xuICAgICAgICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSB2YWx1ZS50b3RhbENvdW50O1xuICAgICAgICAgICAgICB0aGlzLnBhZ2VzID0gW107XG4gICAgICAgICAgICAgIGxldCBudW1iZXJzID0gMDtcblxuICAgICAgICAgICAgICB3aGlsZSAobnVtYmVycyA8IHRoaXMudG90YWxDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBza2lwOiBudW1iZXJzLFxuICAgICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMucGFnZUl0ZW1zTGltaXRDb250cm9sLnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbnVtYmVycyA9IG51bWJlcnMgKyB0aGlzLnBhZ2VJdGVtc0xpbWl0Q29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGxvYWRlZEluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKTtcbiAgICAgICAgICAgICAgaWYgKGxvYWRlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvYWRlZEluZGV4ID4gdGhpcy5wYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKCdwYWdlSW5kZXgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaXRlbXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBvbiBsb2FkaW5nIG9iamVjdHMnLCBlcnIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHVwZGF0ZSBwcm9wZXJ0eSBpcyB0cnVlLCB0aGVuIHNldCB0aGUgc2VsZWN0ZWRJZCBwcm9wZXJ0eSB0byB0aGUgaWQgb2YgdGhlIG9iamVjdCBwYXNzZWQgaW4sIGFuZCBlbWl0IHRoZVxuICAgKiBzZWxlY3RlZElkIHByb3BlcnR5XG4gICAqL1xuICBzZWxlY3RJZChvYmplY3Q6IGFueSkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICB0aGlzLmNyZWF0ZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3JlYXRlTW9kZUNoYW5nZWQuZW1pdChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICB0aGlzLmlkID0gb2JqZWN0WydpZCddO1xuICAgICAgdGhpcy5pZFNlbGVjdGVkLmVtaXQodGhpcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgb3Blbk5ld1RhYihvYmplY3Q6IGFueSkge1xuICAgIHdpbmRvdy5vcGVuKGxvY2F0aW9uLmhyZWYgKyAnLycgKyBvYmplY3RbJ2lkJ10sICdfYmxhbmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgZHVwbGljYXRlT2JqZWN0IGZ1bmN0aW9uIGluIHRoZSBjbXNTZXJ2aWNlLCBwYXNzaW5nIGluIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGJlIGR1cGxpY2F0ZWQgYW5kIHRoZVxuICAgKiBtb2RlbE5hbWUgb2YgdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZHVwbGljYXRlT2JqZWN0KGlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlT2JqZWN0KGlkLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKSA/IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgOiAwO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IGNhbGxzIHRoZSBkZWxldGVPYmplY3QgZnVuY3Rpb24gaW4gdGhlIGNtc1NlcnZpY2UsIHBhc3NpbmcgaW4gdGhlIGlkIG9mIHRoZSBvYmplY3QgdG8gZGVsZXRlIGFuZCB0aGUgbmFtZSBvZiB0aGVcbiAgICogbW9kZWxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU9iamVjdChpZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5jbXNTZXJ2aWNlLmRlbGV0ZU9iamVjdChpZCwgdGhpcy5jYW1lbE1vZGVsTmFtZSk7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWQoJ3BhZ2VJbmRleCcpIDogMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKFxuICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhIHN0cmluZywgY2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciwgYW5kIHJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZ1xuICAgKi9cbiAgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jbXNTZXJ2aWNlLmNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogS2ViYWIgdG8gY2FtZWwgY2FzZSBzdHJpbmdcbiAgICovXG4gIGtlYmFiVG9DYW1lbENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLy0uL2csIChtYXRjaCkgPT4gbWF0Y2hbMV0udG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IG9iamVjdHMgZnJvbSBqc29uIGZpbGVcbiAgICovXG4gIHByb2Nlc3NJbXBvcnQoZXZlbnQpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRmlsZVJlYWRlcigpIG9iamVjdFxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZXZlbnQgdG8gcnVuIHdoZW4gdGhlIGZpbGUgaXMgcmVhZFxuICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAocmVhZGVyRXZlbnQpID0+IHtcbiAgICAgIGxldCBqc29uUmVzdWx0ID0gSlNPTi5wYXJzZShyZWFkZXJFdmVudC50YXJnZXQucmVzdWx0IGFzIGFueSk7XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uUmVzdWx0KSkge1xuICAgICAgICBqc29uUmVzdWx0ID0gW2pzb25SZXN1bHRdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25SZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmdyYXBoUUxTZXJ2aWNlXG4gICAgICAgICAgICAuZ3JhcGhRbCgnY3JlYXRlJyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKSwge1xuICAgICAgICAgICAgICBhcmd1bWVudHM6IHsgaW5wdXQ6IGpzb25SZXN1bHRbaV0gfSxcbiAgICAgICAgICAgICAgZmllbGRzOiBbJ2lkJ10sXG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuU1VDQ0VTUyxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJmb2xncmVpY2gnLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFbGVtZW50ICcgKyAoaSArIDEpICsgJyB2b24gJyArIGpzb25SZXN1bHQubGVuZ3RoICsgJyBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0LicsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0ganNvblJlc3VsdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JylcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1t0aGlzLnNlbGVjdGVkUGFnZUluZGV4XS5saW1pdFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLScgKyBpICsgJy1lcnJvcicsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRWxlbWVudCAnICsgKGkgKyAxKSArICcgdm9uICcgKyBqc29uUmVzdWx0Lmxlbmd0aCArICcga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctZXJyb3InLFxuICAgICAgICAgICAgdHlwZTogVG9hc3RUeXBlLkVSUk9SLFxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0VsZW1lbnQgJyArIChpICsgMSkgKyAnIHZvbiAnICsganNvblJlc3VsdC5sZW5ndGggKyAnIGtvbm50ZSBuaWNodCBpbXBvcnRpZXJ0IHdlcmRlbi4nLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFJlYWQgdGhlIGZpbGVcbiAgICByZWFkZXIucmVhZEFzVGV4dChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBvYmplY3RzIGFzIGpzb25cbiAgICovXG4gIGFzeW5jIHByb2Nlc3NFeHBvcnQoKSB7XG4gICAgY29uc3Qga2V5cyA9IHRoaXMuZ2V0QWxsS2V5cygpO1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoaXRlbXMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogJ3RleHQvanNvbjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIHRoaXMubW9kZWxOYW1lICsgJ3MuanNvbicpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgbGluay5jbGljaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBmb3IgcmVxdWVzdCB0byBleHBvcnQgb2JqZWN0cyBhcyBqc29uXG4gICAqL1xuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb3NzaWJsZUZpZWxkcykpIHtcbiAgICAgIGlmICghdGhpcy5wb3NzaWJsZUZpZWxkc1trZXldLmZpZWxkcyB8fCBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzW2tleV0uZmllbGRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGFzeW5jIHNlbGVjdFBhZ2UoaTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VzW2ldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IGk7XG4gICAgYXdhaXQgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvKCdtb2RlbC10YWJsZS10b3AnKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoJ3BhZ2VJbmRleCcsIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXgpO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiIWlkICYmICFjcmVhdGVNb2RlXCI+XG4gIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTIgbWItbGctNFwiPlxuICAgIDxoMiBpZD1cIm1vZGVsLXRhYmxlLXRvcFwiIGNsYXNzPVwibWItMFwiICpuZ0lmPVwibW9kZWxOYW1lXCI+XG4gICAgICB7e1xuICAgICAgICBtb2RlbENvbmZpZz8ucGx1cmFsXG4gICAgICAgICAgPyBtb2RlbENvbmZpZz8ucGx1cmFsXG4gICAgICAgICAgOiBtb2RlbENvbmZpZz8ubGFiZWxcbiAgICAgICAgICA/IG1vZGVsQ29uZmlnPy5sYWJlbFxuICAgICAgICAgIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGNhbWVsTW9kZWxOYW1lKSArICdzJ1xuICAgICAgfX1cbiAgICA8L2gyPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGQtbm9uZSBkLWxnLWJsb2NrXCI+XG4gICAgICA8aW5wdXQgI2ltcG9ydEZpbGUgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIuanNvblwiIGNsYXNzPVwiZC1ub25lXCIgKGNoYW5nZSk9XCJwcm9jZXNzSW1wb3J0KCRldmVudClcIiAvPlxuICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBtZS00XCIgKm5nSWY9XCJpbXBvcnQgfHwgZXhwb3J0XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJiaSBiaS10aHJlZS1kb3RzLXZlcnRpY2FsXCJcbiAgICAgICAgICBpZD1cInNldHRpbmdzRHJvcGRvd25cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIlxuICAgICAgICAgIGRhdGEtYnMtYXV0by1jbG9zZT1cInRydWVcIlxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1lbmRcIiBhcmlhLWxhYmVsbGVkYnk9XCJzZXR0aW5nc0Ryb3Bkb3duXCI+XG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiICpuZ0lmPVwiZXhwb3J0XCIgKGNsaWNrKT1cInByb2Nlc3NFeHBvcnQoKVwiPkV4cG9ydDwvYT48L2xpPlxuICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImltcG9ydFwiIChjbGljayk9XCJpbXBvcnRGaWxlLmNsaWNrKClcIj4gSW1wb3J0IDwvYT48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNyZWF0ZU5ld09iamVjdCgpXCIgKm5nSWY9XCJjcmVhdGVcIj5FcnN0ZWxsZW48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwidG90YWxDb3VudCA+PSAwXCI+XG4gICAgPG5hdiBjbGFzcz1cImQtZmxleCByb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTJcIj48L2Rpdj5cbiAgICAgIDx1bCBjbGFzcz1cInBhZ2luYXRpb24ganVzdGlmeS1jb250ZW50LWNlbnRlciBjb2wtMTIgY29sLW1kLThcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS1saW5rXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKHNlbGVjdGVkUGFnZUluZGV4IC0gMSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHNlbGVjdGVkUGFnZUluZGV4IC0gMSA+IDAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JmxhcXVvOzwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiICpuZ0Zvcj1cImxldCBwYWdlIG9mIHBhZ2VzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQYWdlSW5kZXggPT09IGkgfVwiIChjbGljayk9XCJzZWxlY3RQYWdlKGkpXCI+e3sgaSArIDEgfX08L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShzZWxlY3RlZFBhZ2VJbmRleCArIDEpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHBhZ2VzW3NlbGVjdGVkUGFnZUluZGV4ICsgMV0gfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnJhcXVvOzwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0yXCI+XG4gICAgICAgIDxiYXNlLXNlbGVjdCBbb3B0aW9uc109XCJwYWdlT3B0aW9uc1wiIFtjb250cm9sXT1cInBhZ2VJdGVtc0xpbWl0Q29udHJvbFwiPjwvYmFzZS1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L25hdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgW2x0Q29udGV4dE1lbnVdPVwiY29udGV4dE1lbnVcIlxuICAgIFtzZWxlY3RvcnNdPVwiJy5vYmplY3QtY29sJ1wiXG4gICAgI2NvbnRleHRNZW51RGF0YT1cImNvbnRleHRNZW51RGF0YVwiXG4gID5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ob3ZlciBiZy13aGl0ZSBkLW5vbmUgZC1sZy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgYXZhaWxhYmxlRmllbGRzXCJcbiAgICAgICAgICAgIFtiYXNlU29ydF09XCJvYmplY3RzXCJcbiAgICAgICAgICAgIChiYXNlU29ydGVkKT1cIm9iamVjdHMgPSAkZXZlbnRcIlxuICAgICAgICAgICAgZGF0YS1vcmRlcj1cImRlc2NcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1uYW1lXT1cImZpZWxkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0YWJsZUZpZWxkc1tmaWVsZF0/LmxhYmVsID8gdGFibGVGaWVsZHNbZmllbGRdPy5sYWJlbCA6IGNhcGl0YWxpemVGaXJzdExldHRlcihmaWVsZCkgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyIGNsYXNzPVwib2JqZWN0LWNvbFwiICpuZ0Zvcj1cImxldCBvYmplY3Qgb2Ygb2JqZWN0c1wiIFtpZF09XCJvYmplY3RbdW5pcXVlRmllbGRdXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgYXZhaWxhYmxlRmllbGRzXCIgKGNsaWNrKT1cInNlbGVjdElkKG9iamVjdClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXRcIj5cbiAgICAgICAgICAgICAge3sgb2JqZWN0W2ZpZWxkXSB8IGRhdGUgOiB0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQgfX0gVWhyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlc1wiPlxuICAgICAgICAgICAgICB7eyB0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNbb2JqZWN0W2ZpZWxkXV0/LnRleHQgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdCAmJiAhdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzXCI+XG4gICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBiYXNlRWxsaXBzZXMgOiA2MCB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cblxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1sZy1ub25lIGZsZXgtY29sdW1uIGZsZXgtZ3Jvdy0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2FyZFwiICpuZ0Zvcj1cImxldCBvYmplY3Qgb2Ygb2JqZWN0c1wiIFtpZF09XCJvYmplY3RbdW5pcXVlRmllbGRdXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jYXJkLWVudHJ5XCIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGF2YWlsYWJsZUZpZWxkczsgbGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJzZWxlY3RJZChvYmplY3QpXCI+XG4gICAgICAgICAgPGIgKm5nSWY9XCJpID4gMFwiXG4gICAgICAgICAgICA+e3sgdGFibGVGaWVsZHNbZmllbGRdPy5sYWJlbCA/IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgOiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZmllbGQpIH19OjwvYlxuICAgICAgICAgID5cbiAgICAgICAgICA8cCBbbmdDbGFzc109XCJ7ICd0YWJsZS1jYXJkLWVudHJ5LWZpcnN0JzogaSA9PT0gMCB9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0XCI+XG4gICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBkYXRlIDogdGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0IH19IFVoclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNcIj5cbiAgICAgICAgICAgICAge3sgdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzW29iamVjdFtmaWVsZF1dPy50ZXh0IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQgJiYgIXRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlc1wiPlxuICAgICAgICAgICAgICB7eyBvYmplY3RbZmllbGRdIHwgYmFzZUVsbGlwc2VzIDogNjAgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiAqbmdJZj1cInRvdGFsQ291bnQgPj0gMFwiPlxuICAgICAgPG5hdiBjbGFzcz1cImQtZmxleCByb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtMlwiPjwvZGl2PlxuICAgICAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIGp1c3RpZnktY29udGVudC1jZW50ZXIgY29sLTEyIGNvbC1tZC04XCI+XG4gICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKHNlbGVjdGVkUGFnZUluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXNcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiBzZWxlY3RlZFBhZ2VJbmRleCAtIDEgPiAwIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mbGFxdW87PC9zcGFuPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCIgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUGFnZUluZGV4ID09PSBpIH1cIiAoY2xpY2spPVwic2VsZWN0UGFnZShpKVwiPnt7IGkgKyAxIH19PC9hPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKHNlbGVjdGVkUGFnZUluZGV4ICsgMSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHBhZ2VzW3NlbGVjdGVkUGFnZUluZGV4ICsgMV0gfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZyYXF1bzs8L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0yXCI+XG4gICAgICAgICAgPGJhc2Utc2VsZWN0IFtvcHRpb25zXT1cInBhZ2VPcHRpb25zXCIgW2NvbnRyb2xdPVwicGFnZUl0ZW1zTGltaXRDb250cm9sXCI+PC9iYXNlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnVcIiAjY29udGV4dE1lbnU+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0SWQoeyBpZDogY29udGV4dE1lbnVEYXRhLmNsaWNrZWRFbGVtZW50Py5pZCB9KVwiPkJlYXJiZWl0ZW48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiIChjbGljayk9XCJvcGVuTmV3VGFiKHsgaWQ6IGNvbnRleHRNZW51RGF0YS5jbGlja2VkRWxlbWVudD8uaWQgfSlcIj5cbiAgICAgICAgSW4gbmV1ZW4gVGFiIMO2ZmZuZW5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCIgKm5nSWY9XCJkdXBsaWNhdGVcIiAoY2xpY2spPVwiZHVwbGljYXRlT2JqZWN0KGNvbnRleHRNZW51RGF0YS5jbGlja2VkRWxlbWVudD8uaWQpXCI+XG4gICAgICAgIER1cGxpemllcmVuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiICpuZ0lmPVwiZGVsZXRlXCIgKGNsaWNrKT1cImRlbGV0ZU9iamVjdChjb250ZXh0TWVudURhdGEuY2xpY2tlZEVsZW1lbnQ/LmlkKVwiPlxuICAgICAgICBMw7ZzY2hlblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0lmPVwiaWQgfHwgY3JlYXRlTW9kZVwiPlxuICA8YnV0dG9uIGNsYXNzPVwiZC1ub25lIGQtbGctYmxvY2sgYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWItM1wiIChjbGljayk9XCJzZWxlY3RJZCgnJylcIj5adXLDvGNrPC9idXR0b24+XG4gIDxiYXNlLW1vZGVsLWZvcm1cbiAgICAqbmdJZj1cIiFtb2RlbENvbmZpZz8uY3VzdG9tVGVtcGxhdGVDb21wb25lbnRcIlxuICAgIFttb2RlbE5hbWVdPVwiY2FtZWxNb2RlbE5hbWVcIlxuICAgIFtsYWJlbF09XCJtb2RlbENvbmZpZz8ubGFiZWxcIlxuICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICBbbG9nZ2luZ109XCJsb2dnaW5nXCJcbiAgICBbaWRdPVwiaWRcIlxuICAgIChmaW5pc2hlZCk9XCJzZWxlY3RJZCgnJylcIlxuICAgIFtkZWxldGVdPVwiZGVsZXRlXCJcbiAgICBbZHVwbGljYXRlXT1cImR1cGxpY2F0ZVwiXG4gICAgW3Nob3dGYXZCdXR0b25dPVwic2hvd0ZhdkJ1dHRvblwiXG4gID48L2Jhc2UtbW9kZWwtZm9ybT5cbiAgPG5nLXRlbXBsYXRlICpuZ0lmPVwibW9kZWxDb25maWc/LmN1c3RvbVRlbXBsYXRlQ29tcG9uZW50XCIgI2N1c3RvbUZvcm1UZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJyZXNwb25zaXZlLWFjdGlvbi1idXR0b24gZC1ibG9jayBkLWxnLW5vbmVcIj5cbiAgPGJhc2UtZmFiLWJ1dHRvblxuICAgIFtmYWJJY29uXT1cIidiaS1wbHVzJ1wiXG4gICAgKGNsaWNrKT1cImNyZWF0ZU5ld09iamVjdCgpXCJcbiAgICAqbmdJZj1cIiEoaWQgfHwgY3JlYXRlTW9kZSkgJiYgc2hvd0ZhdkJ1dHRvblwiXG4gID48L2Jhc2UtZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNvbXBvbmVudHMvY29tcG9uZW50cy9tb2RlbC10YWJsZS9tb2RlbC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLXRhYmxlL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBT0wsa0JBQWtCLEVBTWxCLFNBQVMsRUFDVixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7OztBQWtCeEUsTUFBTSxPQUFPLG1CQUFtQjtJQW9FcEI7SUFDQTtJQUNBO0lBQ0E7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QW5CLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRXNELGtCQUFrQjtzQkFBOUUsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENNU0ZpZWxkQ29uZmlnLFxuICBDTVNNb2RlbENvbmZpZyxcbiAgQ21zU2VydmljZSxcbiAgQ01TVGFibGVGaWVsZCxcbiAgR3JhcGhRTE1ldGEsXG4gIEdyYXBoUUxNZXRhU2VydmljZSxcbiAgR3JhcGhRTFJlcXVlc3RUeXBlLFxuICBHcmFwaFFMU2VydmljZSxcbiAgR3JhcGhRTFR5cGUsXG4gIFNjcm9sbFNlcnZpY2UsXG4gIFN0b3JhZ2VTZXJ2aWNlLFxuICBUb2FzdFNlcnZpY2UsXG4gIFRvYXN0VHlwZVxufSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGF0ZVBpcGUsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbnRleHQtbWVudS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU29ydERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc29ydC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRWxsaXBzZXNQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvZWxsaXBzZXMucGlwZSc7XG5pbXBvcnQgeyBNb2RlbEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RlbC1mb3JtL21vZGVsLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEZhYkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ZhYi1idXR0b24vZmFiLWJ1dHRvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdiYXNlLW1vZGVsLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kZWwtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgU2VsZWN0Q29tcG9uZW50LFxuICAgIENvbnRleHRNZW51RGlyZWN0aXZlLFxuICAgIFNvcnREaXJlY3RpdmUsXG4gICAgRGF0ZVBpcGUsXG4gICAgRWxsaXBzZXNQaXBlLFxuICAgIE1vZGVsRm9ybUNvbXBvbmVudCxcbiAgICBGYWJCdXR0b25Db21wb25lbnQsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBtb2RlbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgb2JqZWN0SWQ6IHN0cmluZztcbiAgQElucHV0KCkgY3JlYXRlTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2dnaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNyZWF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIHVwZGF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGRlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGltcG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGV4cG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIG1vZGVsQ29uZmlnOiBDTVNNb2RlbENvbmZpZyA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBDTVNGaWVsZENvbmZpZyB9O1xuICBASW5wdXQoKSBzaG93RmF2QnV0dG9uID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGlkU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNyZWF0ZU1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUZvcm1UZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjdXN0b21Gb3JtVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgdW5pcXVlRmllbGQgPSAnaWQnO1xuICB0YWJsZUZpZWxkczogQ01TVGFibGVGaWVsZCA9IHtcbiAgICBpZDogeyBsYWJlbDogJ0lEJyB9LFxuICAgIG5hbWU6IHsgbGFiZWw6ICdOYW1lJyB9LFxuICAgIHRpdGxlOiB7IGxhYmVsOiAnVGl0ZWwnIH0sXG4gICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdCZXNjaHJlaWJ1bmcnIH0sXG4gICAgZW1haWw6IHsgbGFiZWw6ICdFLU1haWwnIH0sXG4gICAgY3JlYXRlZEF0OiB7IGxhYmVsOiAnRXJzdGVsbHQgYW0nLCBkYXRlRm9ybWF0OiAnZGQuTU0uWVlZWSBISDptbScgfSxcbiAgICB1cGRhdGVkQXQ6IHsgbGFiZWw6ICdCZWFyYmVpdGV0IGFtJywgZGF0ZUZvcm1hdDogJ2RkLk1NLllZWVkgSEg6bW0nIH0sXG4gIH07XG4gIG1ldGEhOiBHcmFwaFFMTWV0YTtcbiAgb2JqZWN0czogYW55W10gPSBbXTtcbiAgYXZhaWxhYmxlRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZCA9ICcnO1xuICBxdWVyeU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIGNhbWVsTW9kZWxOYW1lOiBzdHJpbmc7XG4gIHBvc3NpYmxlRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBHcmFwaFFMVHlwZT4gPSB7fTtcbiAgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHVuZGVmaW5lZDtcblxuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIHNlbGVjdGVkUGFnZUluZGV4ID0gMDtcbiAgcGFnZXMgPSBbXTtcbiAgcGFnZUl0ZW1zTGltaXRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKDI1KTtcbiAgcGFnZU9wdGlvbnMgPSBbXG4gICAge1xuICAgICAgdGV4dDogJzI1JyxcbiAgICAgIHZhbHVlOiAyNSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6ICc1MCcsXG4gICAgICB2YWx1ZTogNTAsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiAnNzUnLFxuICAgICAgdmFsdWU6IDc1LFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJzEwMCcsXG4gICAgICB2YWx1ZTogMTAwLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJzIwMCcsXG4gICAgICB2YWx1ZTogMjAwLFxuICAgIH0sXG4gIF07XG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhRTFNlcnZpY2U6IEdyYXBoUUxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIE5lZWRlZCB0aW1lIG91dCB0byBwcmV2ZW50IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW50ZWdyYXRlQ3VzdG9tRm9ybUNvbXBvbmVudCgpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VJdGVtc0xpbWl0ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSXRlbXNMaW1pdCcpO1xuICAgIHRoaXMucGFnZUl0ZW1zTGltaXRDb250cm9sLnNldFZhbHVlKHBhZ2VJdGVtc0xpbWl0ID8gcGFnZUl0ZW1zTGltaXQgOiAyNSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoKS5zdWJzY3JpYmUoKG1ldGEpID0+IHtcbiAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgIGlmICh0aGlzLm1vZGVsTmFtZSkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG5cbiAgICAgICAgLy8gTmVlZGVkIHRpbWUgb3V0IGZvciByZXJlbmRlclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVncmF0ZUN1c3RvbUZvcm1Db21wb25lbnQoKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydtb2RlbE5hbWUnXSAmJiB0aGlzLm1ldGEpIHtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydvYmplY3RJZCddICYmIHRoaXMubWV0YSkge1xuICAgICAgaWYgKHRoaXMuaWQgIT09IHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50OjpuZ09uQ2hhbmdlcy0+c2VsZWN0ZWRJZCcsIHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogV2UncmUgdXNpbmcgdGhlIGBtZXRhYCBzZXJ2aWNlIHRvIGdldCB0aGUgZmllbGRzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGBmaW5kYCBxdWVyeSBmb3IgdGhlIG1vZGVsIHdlJ3JlIHdvcmtpbmdcbiAgICogd2l0aC4gV2UncmUgdGhlbiB1c2luZyB0aGF0IGluZm9ybWF0aW9uIHRvIHBvcHVsYXRlIHRoZSBgYXZhaWxhYmxlRmllbGRzYCBhcnJheVxuICAgKi9cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyA9IFtdO1xuICAgIHRoaXMucGFnZXMgPSBbXTtcbiAgICB0aGlzLnRvdGFsQ291bnQgPSBudWxsO1xuICAgIHRoaXMuY2FtZWxNb2RlbE5hbWUgPSB0aGlzLmtlYmFiVG9DYW1lbENhc2UodGhpcy5tb2RlbE5hbWUpO1xuXG4gICAgLy8gU2V0IHF1ZXJ5IG5hbWVcbiAgICBpZiAoIXRoaXMubW9kZWxDb25maWc/LnF1ZXJ5TmFtZSkge1xuICAgICAgdGhpcy5xdWVyeU5hbWUgPSAnZmluZEFuZENvdW50JyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMuY2FtZWxNb2RlbE5hbWUpICsgJ3MnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5TmFtZSA9IHRoaXMubW9kZWxDb25maWc/LnF1ZXJ5TmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbENvbmZpZz8udGFibGVGaWVsZHMpIHtcbiAgICAgIHRoaXMudGFibGVGaWVsZHMgPSB0aGlzLm1vZGVsQ29uZmlnLnRhYmxlRmllbGRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5tb2RlbE5hbWUnLCB0aGlzLm1vZGVsTmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+Y2FtZWxNb2RlbE5hbWUnLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5xdWVyeU5hbWUnLCB0aGlzLnF1ZXJ5TmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+dGFibGVGaWVsZHMnLCB0aGlzLnRhYmxlRmllbGRzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc3NpYmxlRmllbGRzID0gdGhpcy5tZXRhLmdldEZpZWxkcyh0aGlzLnF1ZXJ5TmFtZSkuZmllbGRzO1xuICAgIGxldCBrZXlzO1xuICAgIGlmICh0aGlzLnBvc3NpYmxlRmllbGRzPy5pdGVtcyAmJiBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzPy5pdGVtcz8uZmllbGRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5wb3NzaWJsZUZpZWxkcy5pdGVtcy5maWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5wb3NzaWJsZUZpZWxkcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVGaWVsZEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnRhYmxlRmllbGRzKTtcbiAgICB0YWJsZUZpZWxkS2V5cz8uZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmIChrZXlzLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5wb3NzaWJsZUZpZWxkcycsIHRoaXMucG9zc2libGVGaWVsZHMpO1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPmtleXMnLCBrZXlzKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5hdmFpbGFibGVGaWVsZHMnLCB0aGlzLmF2YWlsYWJsZUZpZWxkcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWQoJ3BhZ2VJbmRleCcpIDogMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKHRoaXMuYXZhaWxhYmxlRmllbGRzLCAwLCB0aGlzLnBhZ2VJdGVtc0xpbWl0Q29udHJvbC52YWx1ZSk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1BhZ2VJdGVtcygpO1xuICB9XG5cbiAgc3Vic2NyaWJlVG9QYWdlSXRlbXMoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5wYWdlSXRlbXNMaW1pdENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncGFnZUluZGV4JywgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCk7XG4gICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyh0aGlzLmF2YWlsYWJsZUZpZWxkcywgMCwgdmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncGFnZUl0ZW1zTGltaXQnLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBpbnRlZ3JhdGVDdXN0b21Gb3JtQ29tcG9uZW50KCkge1xuICAgIGlmICghdGhpcy5jdXN0b21Gb3JtVGVtcGxhdGUgfHwgdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLm1vZGVsQ29uZmlnPy5jdXN0b21UZW1wbGF0ZUNvbXBvbmVudDtcbiAgICBpZiAoY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tRm9ybVRlbXBsYXRlPy5jcmVhdGVDb21wb25lbnQ8YW55PihjdXN0b21Db21wb25lbnQpO1xuICAgICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0SWQoJycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q2hhbmdlc0luQ29tcG9uZW50UmVmKCkge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgZGVsZXRlOiB0aGlzLmRlbGV0ZSxcbiAgICAgICAgZHVwbGljYXRlOiB0aGlzLmR1cGxpY2F0ZSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGxhYmVsOiB0aGlzLm1vZGVsQ29uZmlnPy5sYWJlbCxcbiAgICAgICAgbG9nZ2luZzogdGhpcy5sb2dnaW5nLFxuICAgICAgICBtb2RlbE5hbWU6IHRoaXMuY2FtZWxNb2RlbE5hbWUsXG4gICAgICAgIHNob3dGYXZCdXR0b246IHRoaXMuc2hvd0ZhdkJ1dHRvbixcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJDcmVhdGUgTmV3XCIgYnV0dG9uLCB0aGUgY3JlYXRlTW9kZUNoYW5nZWQgZXZlbnQgaXMgZW1pdHRlZCwgd2hpY2ggaXMgdGhlbiBoYW5kbGVkIGJ5IHRoZVxuICAgKiBwYXJlbnQgY29tcG9uZW50XG4gICAqL1xuICBjcmVhdGVOZXdPYmplY3QoKSB7XG4gICAgdGhpcy5jcmVhdGVNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZU1vZGVDaGFuZ2VkLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgbG9hZHMgdGhlIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBvYmplY3RzIHZhcmlhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBzdHJpbmdbXSAtIFRoZSBmaWVsZHMgeW91IHdhbnQgdG8gbG9hZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHNraXBcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqL1xuICBsb2FkT2JqZWN0cyhmaWVsZHM6IHN0cmluZ1tdLCBza2lwID0gMCwgbGltaXQgPSAyNSk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55W10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RGaWVsZHMgPSBbLi4uZmllbGRzXTtcbiAgICAgIGNvbnN0IGlkSW5GaWVsZHMgPSByZXF1ZXN0RmllbGRzLmZpbmQoKGUpID0+IGUgPT09ICdpZCcpO1xuXG4gICAgICBpZiAoIWlkSW5GaWVsZHMpIHtcbiAgICAgICAgcmVxdWVzdEZpZWxkcy5wdXNoKCdpZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZpbmRBbmRDb3VudCA9IHRoaXMucXVlcnlOYW1lLmluY2x1ZGVzKCdmaW5kQW5kQ291bnQnKTtcblxuICAgICAgdGhpcy5ncmFwaFFMU2VydmljZVxuICAgICAgICAuZ3JhcGhRbCh0aGlzLnF1ZXJ5TmFtZSwge1xuICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgbGltaXQ6IGlzRmluZEFuZENvdW50ID8gbGltaXQgOiBudWxsLFxuICAgICAgICAgICAgc2tpcDogaXNGaW5kQW5kQ291bnQgPyBza2lwIDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogaXNGaW5kQW5kQ291bnQgPyBbJ3RvdGFsQ291bnQnLCB7IGl0ZW1zOiByZXF1ZXN0RmllbGRzIH1dIDogcmVxdWVzdEZpZWxkcyxcbiAgICAgICAgICB0eXBlOiBHcmFwaFFMUmVxdWVzdFR5cGUuUVVFUlksXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6bG9hZE9iamVjdHMtPnZhbHVlJywgdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWU/LnRvdGFsQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtcyA9IHZhbHVlLml0ZW1zO1xuICAgICAgICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSB2YWx1ZS50b3RhbENvdW50O1xuICAgICAgICAgICAgICB0aGlzLnBhZ2VzID0gW107XG4gICAgICAgICAgICAgIGxldCBudW1iZXJzID0gMDtcblxuICAgICAgICAgICAgICB3aGlsZSAobnVtYmVycyA8IHRoaXMudG90YWxDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBza2lwOiBudW1iZXJzLFxuICAgICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMucGFnZUl0ZW1zTGltaXRDb250cm9sLnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbnVtYmVycyA9IG51bWJlcnMgKyB0aGlzLnBhZ2VJdGVtc0xpbWl0Q29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGxvYWRlZEluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKTtcbiAgICAgICAgICAgICAgaWYgKGxvYWRlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvYWRlZEluZGV4ID4gdGhpcy5wYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKCdwYWdlSW5kZXgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaXRlbXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBvbiBsb2FkaW5nIG9iamVjdHMnLCBlcnIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHVwZGF0ZSBwcm9wZXJ0eSBpcyB0cnVlLCB0aGVuIHNldCB0aGUgc2VsZWN0ZWRJZCBwcm9wZXJ0eSB0byB0aGUgaWQgb2YgdGhlIG9iamVjdCBwYXNzZWQgaW4sIGFuZCBlbWl0IHRoZVxuICAgKiBzZWxlY3RlZElkIHByb3BlcnR5XG4gICAqL1xuICBzZWxlY3RJZChvYmplY3Q6IGFueSkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICB0aGlzLmNyZWF0ZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3JlYXRlTW9kZUNoYW5nZWQuZW1pdChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICB0aGlzLmlkID0gb2JqZWN0WydpZCddO1xuICAgICAgdGhpcy5pZFNlbGVjdGVkLmVtaXQodGhpcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgb3Blbk5ld1RhYihvYmplY3Q6IGFueSkge1xuICAgIHdpbmRvdy5vcGVuKGxvY2F0aW9uLmhyZWYgKyAnLycgKyBvYmplY3RbJ2lkJ10sICdfYmxhbmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgZHVwbGljYXRlT2JqZWN0IGZ1bmN0aW9uIGluIHRoZSBjbXNTZXJ2aWNlLCBwYXNzaW5nIGluIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGJlIGR1cGxpY2F0ZWQgYW5kIHRoZVxuICAgKiBtb2RlbE5hbWUgb2YgdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZHVwbGljYXRlT2JqZWN0KGlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlT2JqZWN0KGlkLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKSA/IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgOiAwO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IGNhbGxzIHRoZSBkZWxldGVPYmplY3QgZnVuY3Rpb24gaW4gdGhlIGNtc1NlcnZpY2UsIHBhc3NpbmcgaW4gdGhlIGlkIG9mIHRoZSBvYmplY3QgdG8gZGVsZXRlIGFuZCB0aGUgbmFtZSBvZiB0aGVcbiAgICogbW9kZWxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU9iamVjdChpZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5jbXNTZXJ2aWNlLmRlbGV0ZU9iamVjdChpZCwgdGhpcy5jYW1lbE1vZGVsTmFtZSk7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWQoJ3BhZ2VJbmRleCcpIDogMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKFxuICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhIHN0cmluZywgY2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciwgYW5kIHJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZ1xuICAgKi9cbiAgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jbXNTZXJ2aWNlLmNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogS2ViYWIgdG8gY2FtZWwgY2FzZSBzdHJpbmdcbiAgICovXG4gIGtlYmFiVG9DYW1lbENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLy0uL2csIChtYXRjaCkgPT4gbWF0Y2hbMV0udG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IG9iamVjdHMgZnJvbSBqc29uIGZpbGVcbiAgICovXG4gIHByb2Nlc3NJbXBvcnQoZXZlbnQpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRmlsZVJlYWRlcigpIG9iamVjdFxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZXZlbnQgdG8gcnVuIHdoZW4gdGhlIGZpbGUgaXMgcmVhZFxuICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAocmVhZGVyRXZlbnQpID0+IHtcbiAgICAgIGxldCBqc29uUmVzdWx0ID0gSlNPTi5wYXJzZShyZWFkZXJFdmVudC50YXJnZXQucmVzdWx0IGFzIGFueSk7XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uUmVzdWx0KSkge1xuICAgICAgICBqc29uUmVzdWx0ID0gW2pzb25SZXN1bHRdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25SZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmdyYXBoUUxTZXJ2aWNlXG4gICAgICAgICAgICAuZ3JhcGhRbCgnY3JlYXRlJyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKSwge1xuICAgICAgICAgICAgICBhcmd1bWVudHM6IHsgaW5wdXQ6IGpzb25SZXN1bHRbaV0gfSxcbiAgICAgICAgICAgICAgZmllbGRzOiBbJ2lkJ10sXG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuU1VDQ0VTUyxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJmb2xncmVpY2gnLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFbGVtZW50ICcgKyAoaSArIDEpICsgJyB2b24gJyArIGpzb25SZXN1bHQubGVuZ3RoICsgJyBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0LicsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0ganNvblJlc3VsdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JylcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1t0aGlzLnNlbGVjdGVkUGFnZUluZGV4XS5saW1pdFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLScgKyBpICsgJy1lcnJvcicsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRWxlbWVudCAnICsgKGkgKyAxKSArICcgdm9uICcgKyBqc29uUmVzdWx0Lmxlbmd0aCArICcga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctZXJyb3InLFxuICAgICAgICAgICAgdHlwZTogVG9hc3RUeXBlLkVSUk9SLFxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0VsZW1lbnQgJyArIChpICsgMSkgKyAnIHZvbiAnICsganNvblJlc3VsdC5sZW5ndGggKyAnIGtvbm50ZSBuaWNodCBpbXBvcnRpZXJ0IHdlcmRlbi4nLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFJlYWQgdGhlIGZpbGVcbiAgICByZWFkZXIucmVhZEFzVGV4dChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBvYmplY3RzIGFzIGpzb25cbiAgICovXG4gIGFzeW5jIHByb2Nlc3NFeHBvcnQoKSB7XG4gICAgY29uc3Qga2V5cyA9IHRoaXMuZ2V0QWxsS2V5cygpO1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoaXRlbXMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogJ3RleHQvanNvbjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIHRoaXMubW9kZWxOYW1lICsgJ3MuanNvbicpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgbGluay5jbGljaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBmb3IgcmVxdWVzdCB0byBleHBvcnQgb2JqZWN0cyBhcyBqc29uXG4gICAqL1xuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb3NzaWJsZUZpZWxkcykpIHtcbiAgICAgIGlmICghdGhpcy5wb3NzaWJsZUZpZWxkc1trZXldLmZpZWxkcyB8fCBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzW2tleV0uZmllbGRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGFzeW5jIHNlbGVjdFBhZ2UoaTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VzW2ldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IGk7XG4gICAgYXdhaXQgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvKCdtb2RlbC10YWJsZS10b3AnKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoJ3BhZ2VJbmRleCcsIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXgpO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG59XG4iLCJAaWYgKCFpZCAmJiAhY3JlYXRlTW9kZSkge1xuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTIgbWItbGctNFwiPlxuICAgICAgQGlmIChtb2RlbE5hbWUpIHtcbiAgICAgICAgPGgyIGlkPVwibW9kZWwtdGFibGUtdG9wXCIgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAge3tcbiAgICAgICAgICBtb2RlbENvbmZpZz8ucGx1cmFsXG4gICAgICAgICAgPyBtb2RlbENvbmZpZz8ucGx1cmFsXG4gICAgICAgICAgOiBtb2RlbENvbmZpZz8ubGFiZWxcbiAgICAgICAgICA/IG1vZGVsQ29uZmlnPy5sYWJlbFxuICAgICAgICAgIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGNhbWVsTW9kZWxOYW1lKSArICdzJ1xuICAgICAgICAgIH19XG4gICAgICAgIDwvaDI+XG4gICAgICB9XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBkLW5vbmUgZC1sZy1ibG9ja1wiPlxuICAgICAgICA8aW5wdXQgI2ltcG9ydEZpbGUgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIuanNvblwiIGNsYXNzPVwiZC1ub25lXCIgKGNoYW5nZSk9XCJwcm9jZXNzSW1wb3J0KCRldmVudClcIiAvPlxuICAgICAgICBAaWYgKGltcG9ydCB8fCBleHBvcnQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1lLTRcIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwiYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgIGlkPVwic2V0dGluZ3NEcm9wZG93blwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgZGF0YS1icy1hdXRvLWNsb3NlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LWVuZFwiIGFyaWEtbGFiZWxsZWRieT1cInNldHRpbmdzRHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgPGxpPkBpZiAoZXhwb3J0KSB7XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInByb2Nlc3NFeHBvcnQoKVwiPkV4cG9ydDwvYT5cbiAgICAgICAgICAgICAgfTwvbGk+XG4gICAgICAgICAgICAgIDxsaT5AaWYgKGltcG9ydCkge1xuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJpbXBvcnRGaWxlLmNsaWNrKClcIj4gSW1wb3J0IDwvYT5cbiAgICAgICAgICAgICAgfTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoY3JlYXRlKSB7XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjcmVhdGVOZXdPYmplY3QoKVwiPkVyc3RlbGxlbjwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHRvdGFsQ291bnQgPj0gMCkge1xuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICA8bmF2IGNsYXNzPVwiZC1mbGV4IHJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTJcIj48L2Rpdj5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIGp1c3RpZnktY29udGVudC1jZW50ZXIgY29sLTEyIGNvbC1tZC04XCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBhZ2Uoc2VsZWN0ZWRQYWdlSW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiBzZWxlY3RlZFBhZ2VJbmRleCAtIDEgPiAwIH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mbGFxdW87PC9zcGFuPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgQGZvciAocGFnZSBvZiBwYWdlczsgdHJhY2sgcGFnZTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQYWdlSW5kZXggPT09IGkgfVwiIChjbGljayk9XCJzZWxlY3RQYWdlKGkpXCI+e3sgaSArIDEgfX08L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBhZ2Uoc2VsZWN0ZWRQYWdlSW5kZXggKyAxKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHBhZ2VzW3NlbGVjdGVkUGFnZUluZGV4ICsgMV0gfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZyYXF1bzs8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0yXCI+XG4gICAgICAgICAgICA8YmFzZS1zZWxlY3QgW29wdGlvbnNdPVwicGFnZU9wdGlvbnNcIiBbY29udHJvbF09XCJwYWdlSXRlbXNMaW1pdENvbnRyb2xcIj48L2Jhc2Utc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25hdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgW2x0Q29udGV4dE1lbnVdPVwiY29udGV4dE1lbnVcIlxuICAgICAgW3NlbGVjdG9yc109XCInLm9iamVjdC1jb2wnXCJcbiAgICAgICNjb250ZXh0TWVudURhdGE9XCJjb250ZXh0TWVudURhdGFcIlxuICAgICAgPlxuICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgYmctd2hpdGUgZC1ub25lIGQtbGctdGFibGVcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGF2YWlsYWJsZUZpZWxkczsgdHJhY2sgZmllbGQpIHtcbiAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgIFtiYXNlU29ydF09XCJvYmplY3RzXCJcbiAgICAgICAgICAgICAgICAoYmFzZVNvcnRlZCk9XCJvYmplY3RzID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICBkYXRhLW9yZGVyPVwiZGVzY1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1uYW1lXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGFibGVGaWVsZHNbZmllbGRdPy5sYWJlbCA/IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgOiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZmllbGQpIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIEBmb3IgKG9iamVjdCBvZiBvYmplY3RzOyB0cmFjayBvYmplY3QpIHtcbiAgICAgICAgICAgIDx0ciBjbGFzcz1cIm9iamVjdC1jb2xcIiBbaWRdPVwib2JqZWN0W3VuaXF1ZUZpZWxkXVwiPlxuICAgICAgICAgICAgICBAZm9yIChmaWVsZCBvZiBhdmFpbGFibGVGaWVsZHM7IHRyYWNrIGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2VsZWN0SWQob2JqZWN0KVwiPlxuICAgICAgICAgICAgICAgICAgQGlmICh0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAge3sgb2JqZWN0W2ZpZWxkXSB8IGRhdGUgOiB0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQgfX0gVWhyXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAaWYgKHRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICB7eyB0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNbb2JqZWN0W2ZpZWxkXV0/LnRleHQgfX1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIXRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdCAmJiAhdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBiYXNlRWxsaXBzZXMgOiA2MCB9fVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1sZy1ub25lIGZsZXgtY29sdW1uIGZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgIEBmb3IgKG9iamVjdCBvZiBvYmplY3RzOyB0cmFjayBvYmplY3QpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2FyZFwiIFtpZF09XCJvYmplY3RbdW5pcXVlRmllbGRdXCI+XG4gICAgICAgICAgICBAZm9yIChmaWVsZCBvZiBhdmFpbGFibGVGaWVsZHM7IHRyYWNrIGZpZWxkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2FyZC1lbnRyeVwiIChjbGljayk9XCJzZWxlY3RJZChvYmplY3QpXCI+XG4gICAgICAgICAgICAgICAgQGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgPGJcbiAgICAgICAgICAgICAgICAgICAgPnt7IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgPyB0YWJsZUZpZWxkc1tmaWVsZF0/LmxhYmVsIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGZpZWxkKSB9fTo8L2JcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPHAgW25nQ2xhc3NdPVwieyAndGFibGUtY2FyZC1lbnRyeS1maXJzdCc6IGkgPT09IDAgfVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBkYXRlIDogdGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0IH19IFVoclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAodGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzW29iamVjdFtmaWVsZF1dPy50ZXh0IH19XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmICghdGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0ICYmICF0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB7eyBvYmplY3RbZmllbGRdIHwgYmFzZUVsbGlwc2VzIDogNjAgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHRvdGFsQ291bnQgPj0gMCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICAgIDxuYXYgY2xhc3M9XCJkLWZsZXggcm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwicGFnaW5hdGlvbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGNvbC0xMiBjb2wtbWQtOFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWdlLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShzZWxlY3RlZFBhZ2VJbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBkaXNhYmxlZDogc2VsZWN0ZWRQYWdlSW5kZXggLSAxID4gMCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mbGFxdW87PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgQGZvciAocGFnZSBvZiBwYWdlczsgdHJhY2sgcGFnZTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFBhZ2VJbmRleCA9PT0gaSB9XCIgKGNsaWNrKT1cInNlbGVjdFBhZ2UoaSlcIj57eyBpICsgMSB9fTwvYT5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWdlLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShzZWxlY3RlZFBhZ2VJbmRleCArIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiBwYWdlc1tzZWxlY3RlZFBhZ2VJbmRleCArIDFdIH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZyYXF1bzs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtMlwiPlxuICAgICAgICAgICAgICAgIDxiYXNlLXNlbGVjdCBbb3B0aW9uc109XCJwYWdlT3B0aW9uc1wiIFtjb250cm9sXT1cInBhZ2VJdGVtc0xpbWl0Q29udHJvbFwiPjwvYmFzZS1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uYXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudVwiICNjb250ZXh0TWVudT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0SWQoeyBpZDogY29udGV4dE1lbnVEYXRhLmNsaWNrZWRFbGVtZW50Py5pZCB9KVwiPkJlYXJiZWl0ZW48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwib3Blbk5ld1RhYih7IGlkOiBjb250ZXh0TWVudURhdGEuY2xpY2tlZEVsZW1lbnQ/LmlkIH0pXCI+XG4gICAgICAgICAgICBJbiBuZXVlbiBUYWIgw7ZmZm5lblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwiZHVwbGljYXRlT2JqZWN0KGNvbnRleHRNZW51RGF0YS5jbGlja2VkRWxlbWVudD8uaWQpXCI+XG4gICAgICAgICAgICAgIER1cGxpemllcmVuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChkZWxldGUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiIChjbGljayk9XCJkZWxldGVPYmplY3QoY29udGV4dE1lbnVEYXRhLmNsaWNrZWRFbGVtZW50Py5pZClcIj5cbiAgICAgICAgICAgICAgTMO2c2NoZW5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIEBpZiAoaWQgfHwgY3JlYXRlTW9kZSkge1xuICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImQtbm9uZSBkLWxnLWJsb2NrIGJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1iLTNcIiAoY2xpY2spPVwic2VsZWN0SWQoJycpXCI+WnVyw7xjazwvYnV0dG9uPlxuICAgICAgQGlmICghbW9kZWxDb25maWc/LmN1c3RvbVRlbXBsYXRlQ29tcG9uZW50KSB7XG4gICAgICAgIDxiYXNlLW1vZGVsLWZvcm1cbiAgICAgICAgICBbbW9kZWxOYW1lXT1cImNhbWVsTW9kZWxOYW1lXCJcbiAgICAgICAgICBbbGFiZWxdPVwibW9kZWxDb25maWc/LmxhYmVsXCJcbiAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICAgICAgW2xvZ2dpbmddPVwibG9nZ2luZ1wiXG4gICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAoZmluaXNoZWQpPVwic2VsZWN0SWQoJycpXCJcbiAgICAgICAgICBbZGVsZXRlXT1cImRlbGV0ZVwiXG4gICAgICAgICAgW2R1cGxpY2F0ZV09XCJkdXBsaWNhdGVcIlxuICAgICAgICAgIFtzaG93RmF2QnV0dG9uXT1cInNob3dGYXZCdXR0b25cIlxuICAgICAgICA+PC9iYXNlLW1vZGVsLWZvcm0+XG4gICAgICB9XG4gICAgICBAaWYgKG1vZGVsQ29uZmlnPy5jdXN0b21UZW1wbGF0ZUNvbXBvbmVudCkge1xuICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbUZvcm1UZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdiBjbGFzcz1cInJlc3BvbnNpdmUtYWN0aW9uLWJ1dHRvbiBkLWJsb2NrIGQtbGctbm9uZVwiPlxuICAgIEBpZiAoIShpZCB8fCBjcmVhdGVNb2RlKSAmJiBzaG93RmF2QnV0dG9uKSB7XG4gICAgICA8YmFzZS1mYWItYnV0dG9uXG4gICAgICAgIFtmYWJJY29uXT1cIidiaS1wbHVzJ1wiXG4gICAgICAgIChjbGljayk9XCJjcmVhdGVOZXdPYmplY3QoKVwiXG4gICAgICA+PC9iYXNlLWZhYi1idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbiJdfQ==
|