@myrmidon/gve-core 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +3 -3
- package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +28 -13
- package/fesm2022/myrmidon-gve-core.mjs +28 -14
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/lib/components/feature-editor/feature-editor.component.d.ts +1 -1
- package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +7 -1
- package/package.json +1 -1
|
@@ -463,7 +463,7 @@ export class ChainOperationEditorComponent {
|
|
|
463
463
|
this.operationChange.emit(this._operation);
|
|
464
464
|
}
|
|
465
465
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: ChainOperationEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.Clipboard }, { token: i3.SettingsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
466
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: ChainOperationEditorComponent, isStandalone: true, selector: "gve-chain-operation-editor", inputs: { operation: "operation", snapshot: "snapshot", hidePreview: "hidePreview" }, outputs: { operationChange: "operationChange", operationPreview: "operationPreview", operationCancel: "operationCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type:
|
|
466
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: ChainOperationEditorComponent, isStandalone: true, selector: "gve-chain-operation-editor", inputs: { operation: "operation", snapshot: "snapshot", hidePreview: "hidePreview" }, outputs: { operationChange: "operationChange", operationPreview: "operationPreview", operationCancel: "operationCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type:
|
|
467
467
|
// material
|
|
468
468
|
ClipboardModule }, { kind: "directive", type: i2.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i7.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type:
|
|
469
469
|
// monaco
|
|
@@ -495,7 +495,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
|
|
|
495
495
|
FeatureSetEditorComponent,
|
|
496
496
|
SimpleTreeComponent,
|
|
497
497
|
OperationSourceEditorComponent,
|
|
498
|
-
], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"] }]
|
|
498
|
+
], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"] }]
|
|
499
499
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.Clipboard }, { type: i3.SettingsService }], propDecorators: { operation: [{
|
|
500
500
|
type: Input
|
|
501
501
|
}], snapshot: [{
|
|
@@ -509,4 +509,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
|
|
|
509
509
|
}], operationCancel: [{
|
|
510
510
|
type: Output
|
|
511
511
|
}] } });
|
|
512
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvY2hhaW4tb3BlcmF0aW9uLWVkaXRvci9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9jaGFpbi1vcGVyYXRpb24tZWRpdG9yL2NoYWluLW9wZXJhdGlvbi1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELFdBQVc7QUFDWCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlC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Q0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLElB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O3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsU0FBUzt3QkFDVCx5QkFBeUI7d0JBQ3pCLG1CQUFtQjt3QkFDbkIsOEJBQThCO3FCQUMvQjtzSUFxQlUsU0FBUztzQkFEbkIsS0FBSztnQkFnQkssUUFBUTtzQkFEbEIsS0FBSztnQkFvQkMsV0FBVztzQkFEakIsS0FBSztnQkFPVSxlQUFlO3NCQUQ5QixNQUFNO2dCQU9TLGdCQUFnQjtzQkFEL0IsTUFBTTtnQkFPUyxlQUFlO3NCQUQ5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vLyBtYXRlcmlhbFxyXG5pbXBvcnQgeyBDbGlwYm9hcmQsIENsaXBib2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuLy8gdmVuZG9yXHJcbmltcG9ydCB7IE5nZU1vbmFjb01vZHVsZSB9IGZyb20gJ0BjaXNzdGVjaC9uZ2UvbW9uYWNvJztcclxuaW1wb3J0IHsgY3VzdG9tQWxwaGFiZXQgfSBmcm9tICduYW5vaWQnO1xyXG5cclxuLy8gbXlybWlkb25cclxuaW1wb3J0IHsgTmdUb29sc01vZHVsZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcbmltcG9ydCB7IE5nTWF0VG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuaW1wb3J0IHtcclxuICBDaGFyQ2hhaW5PcGVyYXRpb24sXHJcbiAgRmVhdHVyZSxcclxuICBPcGVyYXRpb25GZWF0dXJlLFxyXG4gIE9wZXJhdGlvblR5cGUsXHJcbiAgT3BlcmF0aW9uU291cmNlLFxyXG4gIFNuYXBzaG90QmFzZSxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5cclxuLy8gbG9jYWxcclxuaW1wb3J0IHsgRmVhdHVyZVNldEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2ZlYXR1cmUtc2V0LWVkaXRvci9mZWF0dXJlLXNldC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3BlcmF0aW9uU291cmNlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3Ivb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFN2Z1ZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N2Zy12YWxpZGF0b3JzJztcclxuaW1wb3J0IHsgU2ltcGxlVHJlZUNvbXBvbmVudCB9IGZyb20gJy4uL3NpbXBsZS10cmVlL3NpbXBsZS10cmVlLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQSBjb21wb25lbnQgZm9yIGVkaXRpbmcgYSB2YXJpYW50IGdlbmVyYXRpb24gb3BlcmF0aW9uLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtY2hhaW4tb3BlcmF0aW9uLWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgLy8gbWF0ZXJpYWxcclxuICAgIENsaXBib2FyZE1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VGFic01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAvLyBtb25hY29cclxuICAgIE5nZU1vbmFjb01vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBOZ01hdFRvb2xzTW9kdWxlLFxyXG4gICAgLy8gbXlybWV4XHJcbiAgICBGZWF0dXJlU2V0RWRpdG9yQ29tcG9uZW50LFxyXG4gICAgU2ltcGxlVHJlZUNvbXBvbmVudCxcclxuICAgIE9wZXJhdGlvblNvdXJjZUVkaXRvckNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYWluT3BlcmF0aW9uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vIG1vbmFjb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3Bvc2FibGVzOiBtb25hY28uSURpc3Bvc2FibGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2VkaXRvck1vZGVsPzogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsO1xyXG4gIHByaXZhdGUgX2VkaXRvcj86IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9zdWJzOiBTdWJzY3JpcHRpb25bXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9uYW5vaWQgPSBjdXN0b21BbHBoYWJldCgnMTIzNDU2Nzg5MGFiY2RlZicsIDEwKTtcclxuXHJcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uOiBDaGFyQ2hhaW5PcGVyYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWRpdGVkU291cmNlSW5kZXggPSAtMTtcclxuICBwcml2YXRlIF9zbmFwc2hvdDogU25hcHNob3RCYXNlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgb3BlcmF0aW9uIHRvIGVkaXQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpOiBDaGFyQ2hhaW5PcGVyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb24gfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IG9wZXJhdGlvbih2YWx1ZTogQ2hhckNoYWluT3BlcmF0aW9uIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fb3BlcmF0aW9uID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgc25hcHNob3QgdGhlIG9wZXJhdGlvbiByZWZlcnMgdG8uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHNuYXBzaG90KCk6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc25hcHNob3Q7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgc25hcHNob3QodmFsdWU6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl9zbmFwc2hvdCA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlydHkgPSB0aGlzLmhhc1RleHRDaGFuZ2VzKHZhbHVlIHx8IHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLl9zbmFwc2hvdCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIGlmIChkaXJ0eSkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RQcmV2aWV3KCk7XHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsPy5zZXRWYWx1ZSh0aGlzLnN2Zy52YWx1ZSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGhpZGUgdGhlIHByZXZpZXcgcmVxdWVzdCBidXR0b24uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaGlkZVByZXZpZXc/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyQ2hhaW5PcGVyYXRpb24+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gdGhlIG9wZXJhdGlvbiBwcmV2aWV3IGlzIHJlcXVlc3RlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhckNoYWluT3BlcmF0aW9uPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBvcGVyYXRpb24gZWRpdGluZyBpcyBjYW5jZWxsZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRhYkluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBpZD86IHN0cmluZztcclxuICBwdWJsaWMgaGFzVG8gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVG9SdW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgLy8gZ2VuZXJhbFxyXG4gIHB1YmxpYyByYW5rOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBncm91cElkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgZmVhdHVyZXM6IEZvcm1Db250cm9sPEZlYXR1cmVbXT47XHJcbiAgcHVibGljIHNvdXJjZXM6IEZvcm1Db250cm9sPE9wZXJhdGlvblNvdXJjZVtdPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8T3BlcmF0aW9uVHlwZT47XHJcbiAgcHVibGljIGF0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBhdEFzSW5kZXg6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyB0bzogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgdG9Bc0luZGV4OiBGb3JtQ29udHJvbDxib29sZWFuPjtcclxuICBwdWJsaWMgaW5wdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBvdXRwdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBydW46IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHRvUnVuOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gc3ZnXHJcbiAgcHVibGljIHN2ZzogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICAvLyBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50RmVhdHVyZXM6IEZvcm1Db250cm9sPFJlY29yZDxzdHJpbmcsIEZlYXR1cmVbXT4+O1xyXG4gIC8vIGRpcGxvbWF0aWNcclxuICBwdWJsaWMgZHBGZWF0dXJlczogRm9ybUNvbnRyb2w8RmVhdHVyZVtdPjtcclxuICAvLyByb290XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgLy8gZWxlbWVudHMgcGFyc2VkIGZyb20gU1ZHIGFuZCBoYXZpbmcgYW4gaWQgYXR0cmlidXRlO1xyXG4gIC8vIHdlIGNhbiBhdHRhY2ggZmVhdHVyZXMgdG8gZWFjaCBvZiB0aGVzZSBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50czogU1ZHRWxlbWVudFtdO1xyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50SWQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIHNvdXJjZVxyXG4gIHB1YmxpYyBlZGl0ZWRTb3VyY2U/OiBPcGVyYXRpb25Tb3VyY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfY2xpcGJvYXJkOiBDbGlwYm9hcmQsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nczogU2V0dGluZ3NTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzID0gW107XHJcbiAgICAvLyBnZW5lcmFsXHJcbiAgICB0aGlzLnJhbmsgPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZ3JvdXBJZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICB0aGlzLmZlYXR1cmVzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxGZWF0dXJlW10+KFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5zb3VyY2VzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxPcGVyYXRpb25Tb3VyY2VbXT4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHlwZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8T3BlcmF0aW9uVHlwZT4oT3BlcmF0aW9uVHlwZS5yZXBsYWNlLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmF0ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxudW1iZXI+KDAsIHtcclxuICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXRBc0luZGV4ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxib29sZWFuPihmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudG8gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudG9Bc0luZGV4ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxib29sZWFuPihmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW5wdXRUYWcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5vdXRwdXRUYWcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5ydW4gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50b1J1biA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8bnVtYmVyPigwLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy52YWx1ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gICAgLy8gc3ZnXHJcbiAgICB0aGlzLnN2ZyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nPignJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBbU3ZnVmFsaWRhdG9ycy5yb290R1ZhbGlkYXRvcigpXSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxSZWNvcmQ8c3RyaW5nLCBGZWF0dXJlW10+PihcclxuICAgICAge30sXHJcbiAgICAgIHsgbm9uTnVsbGFibGU6IHRydWUgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8RmVhdHVyZVtdPihbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHJhbms6IHRoaXMucmFuayxcclxuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLFxyXG4gICAgICBmZWF0dXJlczogdGhpcy5mZWF0dXJlcyxcclxuICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLFxyXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgIGF0OiB0aGlzLmF0LFxyXG4gICAgICBhdEFzSW5kZXg6IHRoaXMuYXRBc0luZGV4LFxyXG4gICAgICB0bzogdGhpcy50byxcclxuICAgICAgdG9Bc0luZGV4OiB0aGlzLnRvQXNJbmRleCxcclxuICAgICAgaW5wdXRUYWc6IHRoaXMuaW5wdXRUYWcsXHJcbiAgICAgIG91dHB1dFRhZzogdGhpcy5vdXRwdXRUYWcsXHJcbiAgICAgIHJ1bjogdGhpcy5ydW4sXHJcbiAgICAgIHRvUnVuOiB0aGlzLnRvUnVuLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgc3ZnOiB0aGlzLnN2ZyxcclxuICAgICAgZWxlbWVudEZlYXR1cmVzOiB0aGlzLmVsZW1lbnRGZWF0dXJlcyxcclxuICAgICAgZHBGZWF0dXJlczogdGhpcy5kcEZlYXR1cmVzLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU1ZHIGVsZW1lbnRzXHJcbiAgICB0aGlzLmVsZW1lbnRzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyB3aGVuZXZlciBzdmcgb3IgYmFzZSBjaGFuZ2UsIHVwZGF0ZSBwcmV2aWV3XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpbHRlcigoY2hhbmdlcykgPT4gJ3N2ZycgaW4gY2hhbmdlcyB8fCAnc25hcHNob3QnIGluIGNoYW5nZXMpLFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDUwMClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlcXVlc3RQcmV2aWV3KCk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgdHlwZSBjaGFuZ2VzLCB1cGRhdGUgYXJncyBVSVxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLnR5cGUudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUFyZ3NVSSgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmZvckVhY2goKGQpID0+IGQuZGlzcG9zZSgpKTtcclxuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcclxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1RleHRDaGFuZ2VzKHNuYXBzaG90PzogU25hcHNob3RCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoKCFzbmFwc2hvdCAmJiB0aGlzLl9zbmFwc2hvdCkgfHwgKHNuYXBzaG90ICYmICF0aGlzLl9zbmFwc2hvdCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHNuYXBzaG90Py5zaXplPy53aWR0aCAhPT0gdGhpcy5fc25hcHNob3Q/LnNpemU/LndpZHRoIHx8XHJcbiAgICAgIHNuYXBzaG90Py5zaXplPy5oZWlnaHQgIT09IHRoaXMuX3NuYXBzaG90Py5zaXplPy5oZWlnaHRcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgc25hcHNob3Q/LnN0eWxlICE9PSB0aGlzLl9zbmFwc2hvdD8uc3R5bGUgfHxcclxuICAgICAgc25hcHNob3Q/LnRleHQgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0IHx8XHJcbiAgICAgIHNuYXBzaG90Py50ZXh0U3R5bGUgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0U3R5bGVcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIGNvbXBhcmUgdGV4dE9wdGlvbnMgcmV0dXJuaW5nIHRydWUgaWYgYW55IGRpZmZlcmVudFxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHNuYXBzaG90Py50ZXh0T3B0aW9ucztcclxuICAgIGlmIChcclxuICAgICAgb3B0aW9ucz8ubGluZUhlaWdodE9mZnNldCAhPT1cclxuICAgICAgICB0aGlzLl9zbmFwc2hvdD8udGV4dE9wdGlvbnM/LmxpbmVIZWlnaHRPZmZzZXQgfHxcclxuICAgICAgb3B0aW9ucz8uY2hhclNwYWNpbmdPZmZzZXQgIT09XHJcbiAgICAgICAgdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5jaGFyU3BhY2luZ09mZnNldCB8fFxyXG4gICAgICBvcHRpb25zPy5zcGNXaWR0aE9mZnNldCAhPT0gdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5zcGNXaWR0aE9mZnNldFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ3JlYXRlRWRpdG9yKGVkaXRvcjogbW9uYWNvLmVkaXRvci5JRWRpdG9yKSB7XHJcbiAgICBjb25zb2xlLmxvZygnY3JlYXRpbmcgZWRpdG9yJyk7XHJcbiAgICBlZGl0b3IudXBkYXRlT3B0aW9ucyh7XHJcbiAgICAgIG1pbmltYXA6IHtcclxuICAgICAgICBzaWRlOiAncmlnaHQnLFxyXG4gICAgICB9LFxyXG4gICAgICB3b3JkV3JhcDogJ29uJyxcclxuICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9lZGl0b3JNb2RlbCA9XHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsIHx8IG1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5zdmcudmFsdWUsICd4bWwnKTtcclxuICAgIGVkaXRvci5zZXRNb2RlbCh0aGlzLl9lZGl0b3JNb2RlbCk7XHJcbiAgICB0aGlzLl9lZGl0b3IgPSBlZGl0b3IgYXMgbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3I7XHJcblxyXG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChcclxuICAgICAgdGhpcy5fZWRpdG9yTW9kZWwub25EaWRDaGFuZ2VDb250ZW50KChlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NoYW5nZSBjb250ZW50Jyk7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IHRoaXMuX2VkaXRvck1vZGVsIS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmIChjb2RlICE9PSB0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zdmcuc2V0VmFsdWUoY29kZSk7XHJcbiAgICAgICAgICB0aGlzLnN2Zy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgdGhpcy5zdmcudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GZWF0dXJlc0NoYW5nZShmZWF0dXJlczogT3BlcmF0aW9uRmVhdHVyZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLmZlYXR1cmVzLnNldFZhbHVlKGZlYXR1cmVzKTtcclxuICAgIHRoaXMuZmVhdHVyZXMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRwRmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IEZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5kcEZlYXR1cmVzLnNldFZhbHVlKGZlYXR1cmVzKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBzb3VyY2VzXHJcbiAgcHVibGljIGFkZFNvdXJjZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdGVkU291cmNlID0geyBpZDogJycsIHR5cGU6ICcnIH07XHJcbiAgICB0aGlzLl9lZGl0ZWRTb3VyY2VJbmRleCA9IC0xO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRTb3VyY2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZWRpdGVkU291cmNlSW5kZXggPSBpbmRleDtcclxuICAgIHRoaXMuZWRpdGVkU291cmNlID0gdGhpcy5zb3VyY2VzLnZhbHVlW2luZGV4XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZVNvdXJjZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID0gLTE7XHJcbiAgICB0aGlzLmVkaXRlZFNvdXJjZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNvdXJjZUNoYW5nZShzb3VyY2U6IE9wZXJhdGlvblNvdXJjZSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IFsuLi50aGlzLnNvdXJjZXMudmFsdWVdO1xyXG4gICAgaWYgKHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID09PSAtMSkge1xyXG4gICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNvdXJjZXNbdGhpcy5fZWRpdGVkU291cmNlSW5kZXhdID0gc291cmNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zb3VyY2VzLnNldFZhbHVlKHNvdXJjZXMpO1xyXG4gICAgdGhpcy5jbG9zZVNvdXJjZSgpO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gc3ZnXHJcbiAgcHVibGljIHNhdmVTdmcoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3ZnLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5zdmcudmFsdWVdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94bWwnIH0pO1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdXJsO1xyXG4gICAgLy8gY3JlYXRlIGZpbGVuYW1lIGZyb20gZGF0ZSBhbmQgdGltZVxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IGRhdGUgPSBub3cudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgY29uc3QgdGltZSA9IG5vdy50b1RpbWVTdHJpbmcoKS5zcGxpdCgnICcpWzBdLnJlcGxhY2UoJzonLCAnLScpO1xyXG4gICAgYS5kb3dubG9hZCA9IGBzdmctJHtkYXRlfV8ke3RpbWV9LnN2Z2A7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5TdmdFZGl0b3IoKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLl9zZXR0aW5ncy5nZXQ8c3RyaW5nPihcclxuICAgICAgJ3N2Zy1lZGl0b3InLFxyXG4gICAgICAnaHR0cHM6Ly9lZGl0b3IubWV0aG9kLmFjLydcclxuICAgICk7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIGlmICh0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaXBib2FyZC5jb3B5KHRoaXMuc3ZnLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkU3ZnKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcclxuICAgIGlucHV0LmFjY2VwdCA9ICcuc3ZnJztcclxuICAgIGlucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdmcuc2V0VmFsdWUoZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN2Z0Zyb21DbGlwYm9hcmQoKTogdm9pZCB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCkudGhlbigodGV4dCkgPT4ge1xyXG4gICAgICB0aGlzLnN2Zy5zZXRWYWx1ZSh0ZXh0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZVN2Zyhzdmc/OiBzdHJpbmcpOiBTVkdFbGVtZW50W10ge1xyXG4gICAgaWYgKCFzdmcpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gcGFyc2UgU1ZHIGNvZGUgZXh0cmFjdGluZyBhbGwgdGhlIFNWRyBlbGVtZW50cyB3aXRoIGFuIGlkIGF0dHJpYnV0ZVxyXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3ZnLCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSk7XHJcblxyXG4gICAgICAvLyBmb3IgZWFjaCBlbGVtZW50LCByZWFkIHggYW5kIHkgYW5kIGFkZCBhIHRyYW5zZm9ybSB3aXRoIGEgdHJhbnNsYXRlXHJcbiAgICAgIC8vIGVxdWFsIHRvIC14IGFuZCAteSBzbyB0aGF0IHRoZSBlbGVtZW50IGlzIGF0IHRoZSBvcmlnaW4uIFRoaXMgaXMgdXNlZnVsXHJcbiAgICAgIC8vIHNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlIHByZXZpZXdlZCBpbiBpdHMgYm94IHdpdGhvdXQgd2FzdGluZyBzcGFjZVxyXG4gICAgICAvLyBqdXN0IGJlY2F1c2UgaXQgaGFwcGVucyBub3QgdG8gYmUgcGxhY2VkIGF0IHRoZSBTVkcgb3JpZ2luXHJcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IHggPSBwYXJzZUZsb2F0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4JykgfHwgJzAnKTtcclxuICAgICAgICBjb25zdCB5ID0gcGFyc2VGbG9hdChlbGVtZW50LmdldEF0dHJpYnV0ZSgneScpIHx8ICcwJyk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHsteH0sJHsteX0pYCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50cyBhcyBTVkdFbGVtZW50W107XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc3ZnLnNldEVycm9ycyh7IGludmFsaWRTdmc6IHRydWUgfSk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIGVsZW1lbnQgZmVhdHVyZXNcclxuICBwdWJsaWMgb25UYWJJbmRleENoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhYkluZGV4ID0gaW5kZXg7XHJcbiAgICBpZiAoaW5kZXggPT09IDMpIHtcclxuICAgICAgdGhpcy5lbGVtZW50cyA9IHRoaXMucGFyc2VTdmcodGhpcy5zdmcudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRFbGVtZW50RmVhdHVyZXMoZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZVtpZF0gfHwgW107XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZSh7XHJcbiAgICAgIC4uLnRoaXMuZWxlbWVudEZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICBbaWRdOiBmZWF0dXJlcyxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lZGl0ZWRFbGVtZW50SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVFbGVtZW50RmVhdHVyZXMoZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY29uc3QgZWxlbWVudEZlYXR1cmVzID0geyAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSB9O1xyXG4gICAgZGVsZXRlIGVsZW1lbnRGZWF0dXJlc1tpZF07XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZShlbGVtZW50RmVhdHVyZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRlZEVsZW1lbnRJZCA9PT0gaWQpIHtcclxuICAgICAgdGhpcy5lZGl0ZWRFbGVtZW50SWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbGVtZW50RmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IEZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWRpdGVkRWxlbWVudElkKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzLnNldFZhbHVlKHtcclxuICAgICAgICAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSxcclxuICAgICAgICBbdGhpcy5lZGl0ZWRFbGVtZW50SWRdOiBmZWF0dXJlcyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBcmdzVUkoKTogdm9pZCB7XHJcbiAgICBsZXQgdG8gPSBmYWxzZSxcclxuICAgICAgdG9SdW4gPSBmYWxzZSxcclxuICAgICAgdmFsdWUgPSBmYWxzZTtcclxuICAgIHN3aXRjaCAodGhpcy50eXBlLnZhbHVlKSB7XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5tb3ZlQWZ0ZXI6XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5tb3ZlQmVmb3JlOlxyXG4gICAgICAgIHRvID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLnN3YXA6XHJcbiAgICAgICAgdG8gPSB0cnVlO1xyXG4gICAgICAgIHRvUnVuID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLmFkZEFmdGVyOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUuYWRkQmVmb3JlOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUucmVwbGFjZTpcclxuICAgICAgICB2YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhc1RvID0gdG87XHJcbiAgICB0aGlzLmhhc1RvUnVuID0gdG9SdW47XHJcbiAgICB0aGlzLmhhc1ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKCF0bykge1xyXG4gICAgICB0aGlzLnRvLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRvUnVuKSB7XHJcbiAgICAgIHRoaXMudG9SdW4ucmVzZXQoKTtcclxuICAgIH1cclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZS5yZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKG9wZXJhdGlvbj86IENoYXJDaGFpbk9wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKCFvcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlQXJnc1VJKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgb3IgZ2VuZXJhdGUgSURcclxuICAgIGlmIChvcGVyYXRpb24uaWQpIHtcclxuICAgICAgdGhpcy5pZCA9IG9wZXJhdGlvbi5pZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaWQgPSB0aGlzLl9uYW5vaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJhbmsuc2V0VmFsdWUob3BlcmF0aW9uLnJhbmsgfHwgMCk7XHJcbiAgICB0aGlzLmdyb3VwSWQuc2V0VmFsdWUob3BlcmF0aW9uLmdyb3VwSWQgfHwgbnVsbCk7XHJcbiAgICB0aGlzLmZlYXR1cmVzLnNldFZhbHVlKG9wZXJhdGlvbi5mZWF0dXJlcyB8fCBbXSk7XHJcbiAgICB0aGlzLnNvdXJjZXMuc2V0VmFsdWUob3BlcmF0aW9uLnNvdXJjZXMgfHwgW10pO1xyXG4gICAgdGhpcy5kcEZlYXR1cmVzLnNldFZhbHVlKG9wZXJhdGlvbi5kaXBsb21hdGljcz8uZmVhdHVyZXMgfHwgW10pO1xyXG5cclxuICAgIHRoaXMudHlwZS5zZXRWYWx1ZShvcGVyYXRpb24udHlwZSk7XHJcbiAgICB0aGlzLmF0LnNldFZhbHVlKG9wZXJhdGlvbi5hdCk7XHJcbiAgICB0aGlzLmF0QXNJbmRleC5zZXRWYWx1ZShvcGVyYXRpb24uYXRBc0luZGV4IHx8IGZhbHNlKTtcclxuICAgIHRoaXMudG8uc2V0VmFsdWUob3BlcmF0aW9uLnRvIHx8IDApO1xyXG4gICAgdGhpcy50b0FzSW5kZXguc2V0VmFsdWUob3BlcmF0aW9uLnRvQXNJbmRleCB8fCBmYWxzZSk7XHJcbiAgICB0aGlzLmlucHV0VGFnLnNldFZhbHVlKG9wZXJhdGlvbi5pbnB1dFRhZyB8fCBudWxsKTtcclxuICAgIHRoaXMub3V0cHV0VGFnLnNldFZhbHVlKG9wZXJhdGlvbi5vdXRwdXRUYWcgfHwgbnVsbCk7XHJcbiAgICB0aGlzLnJ1bi5zZXRWYWx1ZShvcGVyYXRpb24ucnVuKTtcclxuICAgIHRoaXMudG9SdW4uc2V0VmFsdWUob3BlcmF0aW9uLnRvUnVuIHx8IDApO1xyXG4gICAgdGhpcy52YWx1ZS5zZXRWYWx1ZShvcGVyYXRpb24udmFsdWUgfHwgbnVsbCk7XHJcblxyXG4gICAgdGhpcy5zdmcuc2V0VmFsdWUob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5nIHx8ICcnKTtcclxuICAgIHRoaXMuX2VkaXRvck1vZGVsPy5zZXRWYWx1ZSh0aGlzLnN2Zy52YWx1ZSB8fCAnJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZShvcGVyYXRpb24uZGlwbG9tYXRpY3M/LmVsZW1lbnRGZWF0dXJlcyB8fCB7fSk7XHJcblxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cyA9IHRoaXMucGFyc2VTdmcob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5nKTtcclxuXHJcbiAgICAvLyBTVkdcclxuICAgIHRoaXMucmVxdWVzdFByZXZpZXcoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUFyZ3NVSSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlcmF0aW9uQ2FuY2VsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3BlcmF0aW9uKCk6IENoYXJDaGFpbk9wZXJhdGlvbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByYW5rOiB0aGlzLnJhbmsudmFsdWUsXHJcbiAgICAgIGdyb3VwSWQ6IHRoaXMuZ3JvdXBJZC52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIGZlYXR1cmVzOiB0aGlzLmZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuc291cmNlcy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgZGlwbG9tYXRpY3M6IHtcclxuICAgICAgICBnOiB0aGlzLnN2Zy52YWx1ZSxcclxuICAgICAgICBmZWF0dXJlczogdGhpcy5kcEZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICAgIGVsZW1lbnRGZWF0dXJlczogdGhpcy5lbGVtZW50RmVhdHVyZXMudmFsdWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGlkOiB0aGlzLmlkISxcclxuICAgICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLFxyXG4gICAgICBhdDogdGhpcy5hdC52YWx1ZSxcclxuICAgICAgYXRBc0luZGV4OiB0aGlzLmF0QXNJbmRleC52YWx1ZSxcclxuICAgICAgdG86IHRoaXMudG8udmFsdWUsXHJcbiAgICAgIHRvQXNJbmRleDogdGhpcy50b0FzSW5kZXgudmFsdWUsXHJcbiAgICAgIGlucHV0VGFnOiB0aGlzLmlucHV0VGFnLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgb3V0cHV0VGFnOiB0aGlzLm91dHB1dFRhZy52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHJ1bjogdGhpcy5ydW4udmFsdWUsXHJcbiAgICAgIHRvUnVuOiB0aGlzLnRvUnVuLnZhbHVlLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZS52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVyYXRpb25QcmV2aWV3LmVtaXQodGhpcy5nZXRPcGVyYXRpb24oKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25DaGFuZ2UuZW1pdCh0aGlzLl9vcGVyYXRpb24pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDwhLS0gdGFicyAtLT5cclxuICA8bWF0LXRhYi1ncm91cFxyXG4gICAgW3NlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgKHNlbGVjdGVkSW5kZXhDaGFuZ2UpPVwib25UYWJJbmRleENoYW5nZSgkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8IS0tIEdFTkVSQUwgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImdlbmVyYWxcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgPCEtLSBpZCAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwiaWRcIiBjbGFzcz1cIm11dGVkXCI+e3sgaWQgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSB0eXBlIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dHlwZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInR5cGVcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjBcIj5yZXBsYWNlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMVwiPmRlbGV0ZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjJcIj5hZGQtYmVmb3JlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiM1wiPmFkZC1hZnRlcjwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjRcIj5tb3ZlLWJlZm9yZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjVcIj5tb3ZlLWFmdGVyPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiNlwiPnN3YXA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCI3XCI+YW5ub3RhdGU8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueSh0eXBlKS5lcnJvcnM/LnJlcXVpcmVkICYmICh0eXBlLmRpcnR5IHx8IHR5cGUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+dHlwZSByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gYXQgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+YXQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiYXRcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShhdCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoYXQuZGlydHkgfHwgYXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+YXQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gYXRBc0luZGV4IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImF0QXNJbmRleFwiPmlkeDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICA8IS0tIHJ1biAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5ydW48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicnVuXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkocnVuKS5lcnJvcnM/LnJlcXVpcmVkICYmIChydW4uZGlydHkgfHwgcnVuLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnJ1biByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSB0byAtLT5cclxuICAgICAgICBAaWYgKGhhc1RvKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidG9cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueSh0bykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodG8uZGlydHkgfHwgdG8udG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+dG8gcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gdG9Bc0luZGV4IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cInRvQXNJbmRleFwiPmlkeDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICA8IS0tIHRvUnVuIC0tPlxyXG4gICAgICAgIEBpZiAoaGFzVG9SdW4pIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD50byBydW48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidG9SdW5cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueSh0b1J1bikuZXJyb3JzPy5yZXF1aXJlZCAmJiAodG9SdW4uZGlydHkgfHwgdG9SdW4udG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPnRvIHJ1biByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICB9IH1cclxuXHJcbiAgICAgICAgPCEtLSB2YWx1ZSAtLT5cclxuICAgICAgICBAaWYgKGhhc1ZhbHVlKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD52YWx1ZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ2YWx1ZVwiIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICA8IS0tIHJhbmsgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+cmFuazwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJyYW5rXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkocmFuaykuZXJyb3JzPy5yZXF1aXJlZCAmJiAocmFuay5kaXJ0eSB8fCByYW5rLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnJhbmsgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gZ3JvdXBJZCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPmdyb3VwIElEPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdyb3VwSWRcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICRhbnkoZ3JvdXBJZCkuZXJyb3JzPy5yZXF1aXJlZCAmJlxyXG4gICAgICAgICAgICAgIChncm91cElkLmRpcnR5IHx8IGdyb3VwSWQudG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPmdyb3VwIElEIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8IS0tIGlucHV0VGFnIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+aW5wdXQgdGFnPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImlucHV0VGFnXCIgLz5cclxuICAgICAgICAgIDxtYXQtaGludD5ibGFuaz1sYXRlc3Q8L21hdC1oaW50PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gb3V0cHV0VGFnIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+b3V0cHV0IHRhZzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJvdXRwdXRUYWdcIiAvPlxyXG4gICAgICAgICAgPG1hdC1oaW50PmJsYW5rPWF1dG8gKHZOKTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBmZWF0dXJlcyAtLT5cclxuICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICA8bGVnZW5kPm9wZXJhdGlvbiBmZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICAgICAgW2lzVmFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbZmVhdHVyZXNdPVwiZmVhdHVyZXMudmFsdWVcIlxyXG4gICAgICAgICAgICAoZmVhdHVyZXNDaGFuZ2UpPVwib25GZWF0dXJlc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgID48L2d2ZS1mZWF0dXJlLXNldC1lZGl0b3I+XHJcbiAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBTT1VSQ0VTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJzb3VyY2VzXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgICAgIChjbGljayk9XCJhZGRTb3VyY2UoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgc291cmNlXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8dGFibGU+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+aWQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+cmFuazwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgQGZvciAocyBvZiBzb3VyY2VzLnZhbHVlOyB0cmFjayBzKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRTb3VyY2UoJGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ3YXJuXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLnR5cGUgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcy5pZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLnJhbmsgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8IS0tIHNvdXJjZSBlZGl0b3IgLS0+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtkaXNhYmxlZF09XCIhZWRpdGVkU291cmNlXCIgW2V4cGFuZGVkXT1cImVkaXRlZFNvdXJjZVwiPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+c291cmNlPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Z3ZlLW9wZXJhdGlvbi1zb3VyY2UtZWRpdG9yXHJcbiAgICAgICAgICBbc291cmNlXT1cImVkaXRlZFNvdXJjZVwiXHJcbiAgICAgICAgICAoc291cmNlQ2hhbmdlKT1cIm9uU291cmNlQ2hhbmdlKCRldmVudCEpXCJcclxuICAgICAgICAgIChzb3VyY2VDYW5jZWwpPVwiY2xvc2VTb3VyY2UoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRElQTE9NQVRJQyAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwiZGlwbG9tYXRpY1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1yb3dcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1zYXZlXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiU2F2ZSB0byBmaWxlXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3ZnLnZhbHVlXCJcclxuICAgICAgICAgIChjbGljayk9XCJzYXZlU3ZnKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5zYXZlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1sb2FkXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiTG9hZCBmcm9tIGZpbGVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImxvYWRTdmcoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZvbGRlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tY29weVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIkNvcHlcIlxyXG4gICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJzdmcudmFsdWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGlkPVwiYnRuLXBhc3RlXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiU2V0IFNWRyBmcm9tIGNsaXBib2FyZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U3ZnRnJvbUNsaXBib2FyZCgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9wYXN0ZV9nbzwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tZWRpdG9yXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiT3BlbiBTVkcgZXh0ZXJuYWwgZWRpdG9yXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuU3ZnRWRpdG9yKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5sYXVuY2g8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgaWQ9XCJjb2RlXCI+XHJcbiAgICAgICAgPG5nZS1tb25hY28tZWRpdG9yXHJcbiAgICAgICAgICBzdHlsZT1cIi0tZWRpdG9yLWhlaWdodDogNDAwcHhcIlxyXG4gICAgICAgICAgKHJlYWR5KT1cIm9uQ3JlYXRlRWRpdG9yKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgQGlmIChzdmcuaW52YWxpZCkge1xyXG4gICAgICAgIDxtYXQtZXJyb3I+aW52YWxpZCBTVkc8L21hdC1lcnJvcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRUxFTUVOVFMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImVsZW1lbnRzXCI+XHJcbiAgICAgIDx0YWJsZT5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8dGg+aWQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+dmlzdWFsPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICBAZm9yIChlIG9mIGVsZW1lbnRzOyB0cmFjayBlLmlkKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRFbGVtZW50RmVhdHVyZXMoZSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRWxlbWVudEZlYXR1cmVzKGUpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBlLmlkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic3ZnLWNlbGxcIj5cclxuICAgICAgICAgICAgICA8c3ZnIFtpbm5lckhUTUxdPVwiZS5vdXRlckhUTUwgfCBzYWZlSHRtbCA6ICdodG1sJ1wiPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWxcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRlZEVsZW1lbnRJZFwiXHJcbiAgICAgICAgW2V4cGFuZGVkXT1cImVkaXRlZEVsZW1lbnRJZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+ZWxlbWVudDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICAgIFtmZWF0dXJlc109XCJlbGVtZW50RmVhdHVyZXMudmFsdWVbZWRpdGVkRWxlbWVudElkIV0gfHwgW11cIlxyXG4gICAgICAgICAgKGZlYXR1cmVzQ2hhbmdlKT1cIm9uRWxlbWVudEZlYXR1cmVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIERQIEZFQVRTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJkLWZlYXR1cmVzXCI+XHJcbiAgICAgIDxndmUtZmVhdHVyZS1zZXQtZWRpdG9yXHJcbiAgICAgICAgW2ZlYXR1cmVzXT1cImRwRmVhdHVyZXMudmFsdWVcIlxyXG4gICAgICAgIChmZWF0dXJlc0NoYW5nZSk9XCJvbkRwRmVhdHVyZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID48L2d2ZS1mZWF0dXJlLXNldC1lZGl0b3I+XHJcbiAgICA8L21hdC10YWI+XHJcbiAgPC9tYXQtdGFiLWdyb3VwPlxyXG5cclxuICA8IS0tIGJ1dHRvbnMgLS0+XHJcbiAgPGRpdiBpZD1cInN1Ym1pdC1yb3dcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiRGlzY2FyZCBjaGFuZ2VzXCJcclxuICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXdhcm5cIj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIEBpZiAoIWhpZGVQcmV2aWV3KSB7XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIlByZXZpZXcgb3BlcmF0aW9uXCJcclxuICAgICAgKGNsaWNrKT1cInJlcXVlc3RQcmV2aWV3KClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPnByZXZpZXc8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJBY2NlcHQgY2hhbmdlc1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgZm9ybS5wcmlzdGluZVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICBzYXZlXHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
|
|
512
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvY2hhaW4tb3BlcmF0aW9uLWVkaXRvci9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9jaGFpbi1vcGVyYXRpb24tZWRpdG9yL2NoYWluLW9wZXJhdGlvbi1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELFdBQVc7QUFDWCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlC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Q0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLElB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O3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsU0FBUzt3QkFDVCx5QkFBeUI7d0JBQ3pCLG1CQUFtQjt3QkFDbkIsOEJBQThCO3FCQUMvQjtzSUFxQlUsU0FBUztzQkFEbkIsS0FBSztnQkFnQkssUUFBUTtzQkFEbEIsS0FBSztnQkFvQkMsV0FBVztzQkFEakIsS0FBSztnQkFPVSxlQUFlO3NCQUQ5QixNQUFNO2dCQU9TLGdCQUFnQjtzQkFEL0IsTUFBTTtnQkFPUyxlQUFlO3NCQUQ5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vLyBtYXRlcmlhbFxyXG5pbXBvcnQgeyBDbGlwYm9hcmQsIENsaXBib2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuLy8gdmVuZG9yXHJcbmltcG9ydCB7IE5nZU1vbmFjb01vZHVsZSB9IGZyb20gJ0BjaXNzdGVjaC9uZ2UvbW9uYWNvJztcclxuaW1wb3J0IHsgY3VzdG9tQWxwaGFiZXQgfSBmcm9tICduYW5vaWQnO1xyXG5cclxuLy8gbXlybWlkb25cclxuaW1wb3J0IHsgTmdUb29sc01vZHVsZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcbmltcG9ydCB7IE5nTWF0VG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuaW1wb3J0IHtcclxuICBDaGFyQ2hhaW5PcGVyYXRpb24sXHJcbiAgRmVhdHVyZSxcclxuICBPcGVyYXRpb25GZWF0dXJlLFxyXG4gIE9wZXJhdGlvblR5cGUsXHJcbiAgT3BlcmF0aW9uU291cmNlLFxyXG4gIFNuYXBzaG90QmFzZSxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5cclxuLy8gbG9jYWxcclxuaW1wb3J0IHsgRmVhdHVyZVNldEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2ZlYXR1cmUtc2V0LWVkaXRvci9mZWF0dXJlLXNldC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3BlcmF0aW9uU291cmNlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3Ivb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFN2Z1ZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N2Zy12YWxpZGF0b3JzJztcclxuaW1wb3J0IHsgU2ltcGxlVHJlZUNvbXBvbmVudCB9IGZyb20gJy4uL3NpbXBsZS10cmVlL3NpbXBsZS10cmVlLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQSBjb21wb25lbnQgZm9yIGVkaXRpbmcgYSB2YXJpYW50IGdlbmVyYXRpb24gb3BlcmF0aW9uLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtY2hhaW4tb3BlcmF0aW9uLWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgLy8gbWF0ZXJpYWxcclxuICAgIENsaXBib2FyZE1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VGFic01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAvLyBtb25hY29cclxuICAgIE5nZU1vbmFjb01vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBOZ01hdFRvb2xzTW9kdWxlLFxyXG4gICAgLy8gbXlybWV4XHJcbiAgICBGZWF0dXJlU2V0RWRpdG9yQ29tcG9uZW50LFxyXG4gICAgU2ltcGxlVHJlZUNvbXBvbmVudCxcclxuICAgIE9wZXJhdGlvblNvdXJjZUVkaXRvckNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYWluT3BlcmF0aW9uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vIG1vbmFjb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3Bvc2FibGVzOiBtb25hY28uSURpc3Bvc2FibGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2VkaXRvck1vZGVsPzogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsO1xyXG4gIHByaXZhdGUgX2VkaXRvcj86IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9zdWJzOiBTdWJzY3JpcHRpb25bXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9uYW5vaWQgPSBjdXN0b21BbHBoYWJldCgnMTIzNDU2Nzg5MGFiY2RlZicsIDEwKTtcclxuXHJcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uOiBDaGFyQ2hhaW5PcGVyYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWRpdGVkU291cmNlSW5kZXggPSAtMTtcclxuICBwcml2YXRlIF9zbmFwc2hvdDogU25hcHNob3RCYXNlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgb3BlcmF0aW9uIHRvIGVkaXQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpOiBDaGFyQ2hhaW5PcGVyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb24gfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IG9wZXJhdGlvbih2YWx1ZTogQ2hhckNoYWluT3BlcmF0aW9uIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fb3BlcmF0aW9uID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgc25hcHNob3QgdGhlIG9wZXJhdGlvbiByZWZlcnMgdG8uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHNuYXBzaG90KCk6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc25hcHNob3Q7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgc25hcHNob3QodmFsdWU6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl9zbmFwc2hvdCA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlydHkgPSB0aGlzLmhhc1RleHRDaGFuZ2VzKHZhbHVlIHx8IHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLl9zbmFwc2hvdCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIGlmIChkaXJ0eSkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RQcmV2aWV3KCk7XHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsPy5zZXRWYWx1ZSh0aGlzLnN2Zy52YWx1ZSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGhpZGUgdGhlIHByZXZpZXcgcmVxdWVzdCBidXR0b24uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaGlkZVByZXZpZXc/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyQ2hhaW5PcGVyYXRpb24+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gdGhlIG9wZXJhdGlvbiBwcmV2aWV3IGlzIHJlcXVlc3RlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhckNoYWluT3BlcmF0aW9uPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBvcGVyYXRpb24gZWRpdGluZyBpcyBjYW5jZWxsZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRhYkluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBpZD86IHN0cmluZztcclxuICBwdWJsaWMgaGFzVG8gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVG9SdW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgLy8gZ2VuZXJhbFxyXG4gIHB1YmxpYyByYW5rOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBncm91cElkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgZmVhdHVyZXM6IEZvcm1Db250cm9sPEZlYXR1cmVbXT47XHJcbiAgcHVibGljIHNvdXJjZXM6IEZvcm1Db250cm9sPE9wZXJhdGlvblNvdXJjZVtdPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8T3BlcmF0aW9uVHlwZT47XHJcbiAgcHVibGljIGF0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBhdEFzSW5kZXg6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyB0bzogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgdG9Bc0luZGV4OiBGb3JtQ29udHJvbDxib29sZWFuPjtcclxuICBwdWJsaWMgaW5wdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBvdXRwdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBydW46IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHRvUnVuOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gc3ZnXHJcbiAgcHVibGljIHN2ZzogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICAvLyBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50RmVhdHVyZXM6IEZvcm1Db250cm9sPFJlY29yZDxzdHJpbmcsIEZlYXR1cmVbXT4+O1xyXG4gIC8vIGRpcGxvbWF0aWNcclxuICBwdWJsaWMgZHBGZWF0dXJlczogRm9ybUNvbnRyb2w8RmVhdHVyZVtdPjtcclxuICAvLyByb290XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgLy8gZWxlbWVudHMgcGFyc2VkIGZyb20gU1ZHIGFuZCBoYXZpbmcgYW4gaWQgYXR0cmlidXRlO1xyXG4gIC8vIHdlIGNhbiBhdHRhY2ggZmVhdHVyZXMgdG8gZWFjaCBvZiB0aGVzZSBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50czogU1ZHRWxlbWVudFtdO1xyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50SWQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIHNvdXJjZVxyXG4gIHB1YmxpYyBlZGl0ZWRTb3VyY2U/OiBPcGVyYXRpb25Tb3VyY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfY2xpcGJvYXJkOiBDbGlwYm9hcmQsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nczogU2V0dGluZ3NTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzID0gW107XHJcbiAgICAvLyBnZW5lcmFsXHJcbiAgICB0aGlzLnJhbmsgPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZ3JvdXBJZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICB0aGlzLmZlYXR1cmVzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxGZWF0dXJlW10+KFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5zb3VyY2VzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxPcGVyYXRpb25Tb3VyY2VbXT4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHlwZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8T3BlcmF0aW9uVHlwZT4oT3BlcmF0aW9uVHlwZS5yZXBsYWNlLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmF0ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxudW1iZXI+KDAsIHtcclxuICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXRBc0luZGV4ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxib29sZWFuPihmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudG8gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudG9Bc0luZGV4ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxib29sZWFuPihmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW5wdXRUYWcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5vdXRwdXRUYWcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5ydW4gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50b1J1biA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8bnVtYmVyPigwLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy52YWx1ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gICAgLy8gc3ZnXHJcbiAgICB0aGlzLnN2ZyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nPignJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBbU3ZnVmFsaWRhdG9ycy5yb290R1ZhbGlkYXRvcigpXSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxSZWNvcmQ8c3RyaW5nLCBGZWF0dXJlW10+PihcclxuICAgICAge30sXHJcbiAgICAgIHsgbm9uTnVsbGFibGU6IHRydWUgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8RmVhdHVyZVtdPihbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHJhbms6IHRoaXMucmFuayxcclxuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLFxyXG4gICAgICBmZWF0dXJlczogdGhpcy5mZWF0dXJlcyxcclxuICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLFxyXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgIGF0OiB0aGlzLmF0LFxyXG4gICAgICBhdEFzSW5kZXg6IHRoaXMuYXRBc0luZGV4LFxyXG4gICAgICB0bzogdGhpcy50byxcclxuICAgICAgdG9Bc0luZGV4OiB0aGlzLnRvQXNJbmRleCxcclxuICAgICAgaW5wdXRUYWc6IHRoaXMuaW5wdXRUYWcsXHJcbiAgICAgIG91dHB1dFRhZzogdGhpcy5vdXRwdXRUYWcsXHJcbiAgICAgIHJ1bjogdGhpcy5ydW4sXHJcbiAgICAgIHRvUnVuOiB0aGlzLnRvUnVuLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgc3ZnOiB0aGlzLnN2ZyxcclxuICAgICAgZWxlbWVudEZlYXR1cmVzOiB0aGlzLmVsZW1lbnRGZWF0dXJlcyxcclxuICAgICAgZHBGZWF0dXJlczogdGhpcy5kcEZlYXR1cmVzLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU1ZHIGVsZW1lbnRzXHJcbiAgICB0aGlzLmVsZW1lbnRzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyB3aGVuZXZlciBzdmcgb3IgYmFzZSBjaGFuZ2UsIHVwZGF0ZSBwcmV2aWV3XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpbHRlcigoY2hhbmdlcykgPT4gJ3N2ZycgaW4gY2hhbmdlcyB8fCAnc25hcHNob3QnIGluIGNoYW5nZXMpLFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDUwMClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlcXVlc3RQcmV2aWV3KCk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgdHlwZSBjaGFuZ2VzLCB1cGRhdGUgYXJncyBVSVxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLnR5cGUudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUFyZ3NVSSgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmZvckVhY2goKGQpID0+IGQuZGlzcG9zZSgpKTtcclxuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcclxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1RleHRDaGFuZ2VzKHNuYXBzaG90PzogU25hcHNob3RCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoKCFzbmFwc2hvdCAmJiB0aGlzLl9zbmFwc2hvdCkgfHwgKHNuYXBzaG90ICYmICF0aGlzLl9zbmFwc2hvdCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHNuYXBzaG90Py5zaXplPy53aWR0aCAhPT0gdGhpcy5fc25hcHNob3Q/LnNpemU/LndpZHRoIHx8XHJcbiAgICAgIHNuYXBzaG90Py5zaXplPy5oZWlnaHQgIT09IHRoaXMuX3NuYXBzaG90Py5zaXplPy5oZWlnaHRcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgc25hcHNob3Q/LnN0eWxlICE9PSB0aGlzLl9zbmFwc2hvdD8uc3R5bGUgfHxcclxuICAgICAgc25hcHNob3Q/LnRleHQgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0IHx8XHJcbiAgICAgIHNuYXBzaG90Py50ZXh0U3R5bGUgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0U3R5bGVcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIGNvbXBhcmUgdGV4dE9wdGlvbnMgcmV0dXJuaW5nIHRydWUgaWYgYW55IGRpZmZlcmVudFxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHNuYXBzaG90Py50ZXh0T3B0aW9ucztcclxuICAgIGlmIChcclxuICAgICAgb3B0aW9ucz8ubGluZUhlaWdodE9mZnNldCAhPT1cclxuICAgICAgICB0aGlzLl9zbmFwc2hvdD8udGV4dE9wdGlvbnM/LmxpbmVIZWlnaHRPZmZzZXQgfHxcclxuICAgICAgb3B0aW9ucz8uY2hhclNwYWNpbmdPZmZzZXQgIT09XHJcbiAgICAgICAgdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5jaGFyU3BhY2luZ09mZnNldCB8fFxyXG4gICAgICBvcHRpb25zPy5zcGNXaWR0aE9mZnNldCAhPT0gdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5zcGNXaWR0aE9mZnNldFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ3JlYXRlRWRpdG9yKGVkaXRvcjogbW9uYWNvLmVkaXRvci5JRWRpdG9yKSB7XHJcbiAgICBjb25zb2xlLmxvZygnY3JlYXRpbmcgZWRpdG9yJyk7XHJcbiAgICBlZGl0b3IudXBkYXRlT3B0aW9ucyh7XHJcbiAgICAgIG1pbmltYXA6IHtcclxuICAgICAgICBzaWRlOiAncmlnaHQnLFxyXG4gICAgICB9LFxyXG4gICAgICB3b3JkV3JhcDogJ29uJyxcclxuICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9lZGl0b3JNb2RlbCA9XHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsIHx8IG1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5zdmcudmFsdWUsICd4bWwnKTtcclxuICAgIGVkaXRvci5zZXRNb2RlbCh0aGlzLl9lZGl0b3JNb2RlbCk7XHJcbiAgICB0aGlzLl9lZGl0b3IgPSBlZGl0b3IgYXMgbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3I7XHJcblxyXG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChcclxuICAgICAgdGhpcy5fZWRpdG9yTW9kZWwub25EaWRDaGFuZ2VDb250ZW50KChlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NoYW5nZSBjb250ZW50Jyk7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IHRoaXMuX2VkaXRvck1vZGVsIS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmIChjb2RlICE9PSB0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zdmcuc2V0VmFsdWUoY29kZSk7XHJcbiAgICAgICAgICB0aGlzLnN2Zy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgdGhpcy5zdmcudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GZWF0dXJlc0NoYW5nZShmZWF0dXJlczogT3BlcmF0aW9uRmVhdHVyZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLmZlYXR1cmVzLnNldFZhbHVlKGZlYXR1cmVzKTtcclxuICAgIHRoaXMuZmVhdHVyZXMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRwRmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IEZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5kcEZlYXR1cmVzLnNldFZhbHVlKGZlYXR1cmVzKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBzb3VyY2VzXHJcbiAgcHVibGljIGFkZFNvdXJjZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdGVkU291cmNlID0geyBpZDogJycsIHR5cGU6ICcnIH07XHJcbiAgICB0aGlzLl9lZGl0ZWRTb3VyY2VJbmRleCA9IC0xO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRTb3VyY2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZWRpdGVkU291cmNlSW5kZXggPSBpbmRleDtcclxuICAgIHRoaXMuZWRpdGVkU291cmNlID0gdGhpcy5zb3VyY2VzLnZhbHVlW2luZGV4XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZVNvdXJjZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID0gLTE7XHJcbiAgICB0aGlzLmVkaXRlZFNvdXJjZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNvdXJjZUNoYW5nZShzb3VyY2U6IE9wZXJhdGlvblNvdXJjZSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IFsuLi50aGlzLnNvdXJjZXMudmFsdWVdO1xyXG4gICAgaWYgKHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID09PSAtMSkge1xyXG4gICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNvdXJjZXNbdGhpcy5fZWRpdGVkU291cmNlSW5kZXhdID0gc291cmNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zb3VyY2VzLnNldFZhbHVlKHNvdXJjZXMpO1xyXG4gICAgdGhpcy5jbG9zZVNvdXJjZSgpO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gc3ZnXHJcbiAgcHVibGljIHNhdmVTdmcoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3ZnLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5zdmcudmFsdWVdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94bWwnIH0pO1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdXJsO1xyXG4gICAgLy8gY3JlYXRlIGZpbGVuYW1lIGZyb20gZGF0ZSBhbmQgdGltZVxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IGRhdGUgPSBub3cudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgY29uc3QgdGltZSA9IG5vdy50b1RpbWVTdHJpbmcoKS5zcGxpdCgnICcpWzBdLnJlcGxhY2UoJzonLCAnLScpO1xyXG4gICAgYS5kb3dubG9hZCA9IGBzdmctJHtkYXRlfV8ke3RpbWV9LnN2Z2A7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5TdmdFZGl0b3IoKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLl9zZXR0aW5ncy5nZXQ8c3RyaW5nPihcclxuICAgICAgJ3N2Zy1lZGl0b3InLFxyXG4gICAgICAnaHR0cHM6Ly9lZGl0b3IubWV0aG9kLmFjLydcclxuICAgICk7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIGlmICh0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaXBib2FyZC5jb3B5KHRoaXMuc3ZnLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkU3ZnKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcclxuICAgIGlucHV0LmFjY2VwdCA9ICcuc3ZnJztcclxuICAgIGlucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdmcuc2V0VmFsdWUoZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN2Z0Zyb21DbGlwYm9hcmQoKTogdm9pZCB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCkudGhlbigodGV4dCkgPT4ge1xyXG4gICAgICB0aGlzLnN2Zy5zZXRWYWx1ZSh0ZXh0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZVN2Zyhzdmc/OiBzdHJpbmcpOiBTVkdFbGVtZW50W10ge1xyXG4gICAgaWYgKCFzdmcpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gcGFyc2UgU1ZHIGNvZGUgZXh0cmFjdGluZyBhbGwgdGhlIFNWRyBlbGVtZW50cyB3aXRoIGFuIGlkIGF0dHJpYnV0ZVxyXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3ZnLCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSk7XHJcblxyXG4gICAgICAvLyBmb3IgZWFjaCBlbGVtZW50LCByZWFkIHggYW5kIHkgYW5kIGFkZCBhIHRyYW5zZm9ybSB3aXRoIGEgdHJhbnNsYXRlXHJcbiAgICAgIC8vIGVxdWFsIHRvIC14IGFuZCAteSBzbyB0aGF0IHRoZSBlbGVtZW50IGlzIGF0IHRoZSBvcmlnaW4uIFRoaXMgaXMgdXNlZnVsXHJcbiAgICAgIC8vIHNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlIHByZXZpZXdlZCBpbiBpdHMgYm94IHdpdGhvdXQgd2FzdGluZyBzcGFjZVxyXG4gICAgICAvLyBqdXN0IGJlY2F1c2UgaXQgaGFwcGVucyBub3QgdG8gYmUgcGxhY2VkIGF0IHRoZSBTVkcgb3JpZ2luXHJcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IHggPSBwYXJzZUZsb2F0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4JykgfHwgJzAnKTtcclxuICAgICAgICBjb25zdCB5ID0gcGFyc2VGbG9hdChlbGVtZW50LmdldEF0dHJpYnV0ZSgneScpIHx8ICcwJyk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHsteH0sJHsteX0pYCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50cyBhcyBTVkdFbGVtZW50W107XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc3ZnLnNldEVycm9ycyh7IGludmFsaWRTdmc6IHRydWUgfSk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIGVsZW1lbnQgZmVhdHVyZXNcclxuICBwdWJsaWMgb25UYWJJbmRleENoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhYkluZGV4ID0gaW5kZXg7XHJcbiAgICBpZiAoaW5kZXggPT09IDMpIHtcclxuICAgICAgdGhpcy5lbGVtZW50cyA9IHRoaXMucGFyc2VTdmcodGhpcy5zdmcudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRFbGVtZW50RmVhdHVyZXMoZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZVtpZF0gfHwgW107XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZSh7XHJcbiAgICAgIC4uLnRoaXMuZWxlbWVudEZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICBbaWRdOiBmZWF0dXJlcyxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lZGl0ZWRFbGVtZW50SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVFbGVtZW50RmVhdHVyZXMoZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY29uc3QgZWxlbWVudEZlYXR1cmVzID0geyAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSB9O1xyXG4gICAgZGVsZXRlIGVsZW1lbnRGZWF0dXJlc1tpZF07XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZShlbGVtZW50RmVhdHVyZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRlZEVsZW1lbnRJZCA9PT0gaWQpIHtcclxuICAgICAgdGhpcy5lZGl0ZWRFbGVtZW50SWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbGVtZW50RmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IEZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWRpdGVkRWxlbWVudElkKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzLnNldFZhbHVlKHtcclxuICAgICAgICAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSxcclxuICAgICAgICBbdGhpcy5lZGl0ZWRFbGVtZW50SWRdOiBmZWF0dXJlcyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBcmdzVUkoKTogdm9pZCB7XHJcbiAgICBsZXQgdG8gPSBmYWxzZSxcclxuICAgICAgdG9SdW4gPSBmYWxzZSxcclxuICAgICAgdmFsdWUgPSBmYWxzZTtcclxuICAgIHN3aXRjaCAodGhpcy50eXBlLnZhbHVlKSB7XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5tb3ZlQWZ0ZXI6XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5tb3ZlQmVmb3JlOlxyXG4gICAgICAgIHRvID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLnN3YXA6XHJcbiAgICAgICAgdG8gPSB0cnVlO1xyXG4gICAgICAgIHRvUnVuID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLmFkZEFmdGVyOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUuYWRkQmVmb3JlOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUucmVwbGFjZTpcclxuICAgICAgICB2YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhc1RvID0gdG87XHJcbiAgICB0aGlzLmhhc1RvUnVuID0gdG9SdW47XHJcbiAgICB0aGlzLmhhc1ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKCF0bykge1xyXG4gICAgICB0aGlzLnRvLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRvUnVuKSB7XHJcbiAgICAgIHRoaXMudG9SdW4ucmVzZXQoKTtcclxuICAgIH1cclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZS5yZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKG9wZXJhdGlvbj86IENoYXJDaGFpbk9wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKCFvcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlQXJnc1VJKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgb3IgZ2VuZXJhdGUgSURcclxuICAgIGlmIChvcGVyYXRpb24uaWQpIHtcclxuICAgICAgdGhpcy5pZCA9IG9wZXJhdGlvbi5pZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaWQgPSB0aGlzLl9uYW5vaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJhbmsuc2V0VmFsdWUob3BlcmF0aW9uLnJhbmsgfHwgMCk7XHJcbiAgICB0aGlzLmdyb3VwSWQuc2V0VmFsdWUob3BlcmF0aW9uLmdyb3VwSWQgfHwgbnVsbCk7XHJcbiAgICB0aGlzLmZlYXR1cmVzLnNldFZhbHVlKG9wZXJhdGlvbi5mZWF0dXJlcyB8fCBbXSk7XHJcbiAgICB0aGlzLnNvdXJjZXMuc2V0VmFsdWUob3BlcmF0aW9uLnNvdXJjZXMgfHwgW10pO1xyXG4gICAgdGhpcy5kcEZlYXR1cmVzLnNldFZhbHVlKG9wZXJhdGlvbi5kaXBsb21hdGljcz8uZmVhdHVyZXMgfHwgW10pO1xyXG5cclxuICAgIHRoaXMudHlwZS5zZXRWYWx1ZShvcGVyYXRpb24udHlwZSk7XHJcbiAgICB0aGlzLmF0LnNldFZhbHVlKG9wZXJhdGlvbi5hdCk7XHJcbiAgICB0aGlzLmF0QXNJbmRleC5zZXRWYWx1ZShvcGVyYXRpb24uYXRBc0luZGV4IHx8IGZhbHNlKTtcclxuICAgIHRoaXMudG8uc2V0VmFsdWUob3BlcmF0aW9uLnRvIHx8IDApO1xyXG4gICAgdGhpcy50b0FzSW5kZXguc2V0VmFsdWUob3BlcmF0aW9uLnRvQXNJbmRleCB8fCBmYWxzZSk7XHJcbiAgICB0aGlzLmlucHV0VGFnLnNldFZhbHVlKG9wZXJhdGlvbi5pbnB1dFRhZyB8fCBudWxsKTtcclxuICAgIHRoaXMub3V0cHV0VGFnLnNldFZhbHVlKG9wZXJhdGlvbi5vdXRwdXRUYWcgfHwgbnVsbCk7XHJcbiAgICB0aGlzLnJ1bi5zZXRWYWx1ZShvcGVyYXRpb24ucnVuKTtcclxuICAgIHRoaXMudG9SdW4uc2V0VmFsdWUob3BlcmF0aW9uLnRvUnVuIHx8IDApO1xyXG4gICAgdGhpcy52YWx1ZS5zZXRWYWx1ZShvcGVyYXRpb24udmFsdWUgfHwgbnVsbCk7XHJcblxyXG4gICAgdGhpcy5zdmcuc2V0VmFsdWUob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5nIHx8ICcnKTtcclxuICAgIHRoaXMuX2VkaXRvck1vZGVsPy5zZXRWYWx1ZSh0aGlzLnN2Zy52YWx1ZSB8fCAnJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZShvcGVyYXRpb24uZGlwbG9tYXRpY3M/LmVsZW1lbnRGZWF0dXJlcyB8fCB7fSk7XHJcblxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cyA9IHRoaXMucGFyc2VTdmcob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5nKTtcclxuXHJcbiAgICAvLyBTVkdcclxuICAgIHRoaXMucmVxdWVzdFByZXZpZXcoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUFyZ3NVSSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlcmF0aW9uQ2FuY2VsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3BlcmF0aW9uKCk6IENoYXJDaGFpbk9wZXJhdGlvbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByYW5rOiB0aGlzLnJhbmsudmFsdWUsXHJcbiAgICAgIGdyb3VwSWQ6IHRoaXMuZ3JvdXBJZC52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIGZlYXR1cmVzOiB0aGlzLmZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuc291cmNlcy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgZGlwbG9tYXRpY3M6IHtcclxuICAgICAgICBnOiB0aGlzLnN2Zy52YWx1ZSxcclxuICAgICAgICBmZWF0dXJlczogdGhpcy5kcEZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICAgIGVsZW1lbnRGZWF0dXJlczogdGhpcy5lbGVtZW50RmVhdHVyZXMudmFsdWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGlkOiB0aGlzLmlkISxcclxuICAgICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLFxyXG4gICAgICBhdDogdGhpcy5hdC52YWx1ZSxcclxuICAgICAgYXRBc0luZGV4OiB0aGlzLmF0QXNJbmRleC52YWx1ZSxcclxuICAgICAgdG86IHRoaXMudG8udmFsdWUsXHJcbiAgICAgIHRvQXNJbmRleDogdGhpcy50b0FzSW5kZXgudmFsdWUsXHJcbiAgICAgIGlucHV0VGFnOiB0aGlzLmlucHV0VGFnLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgb3V0cHV0VGFnOiB0aGlzLm91dHB1dFRhZy52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHJ1bjogdGhpcy5ydW4udmFsdWUsXHJcbiAgICAgIHRvUnVuOiB0aGlzLnRvUnVuLnZhbHVlLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZS52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVyYXRpb25QcmV2aWV3LmVtaXQodGhpcy5nZXRPcGVyYXRpb24oKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25DaGFuZ2UuZW1pdCh0aGlzLl9vcGVyYXRpb24pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDwhLS0gdGFicyAtLT5cclxuICA8bWF0LXRhYi1ncm91cFxyXG4gICAgW3NlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgKHNlbGVjdGVkSW5kZXhDaGFuZ2UpPVwib25UYWJJbmRleENoYW5nZSgkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8IS0tIEdFTkVSQUwgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImdlbmVyYWxcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgPCEtLSBpZCAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwiaWRcIiBjbGFzcz1cIm11dGVkXCI+e3sgaWQgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSB0eXBlIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dHlwZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInR5cGVcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjBcIj5yZXBsYWNlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMVwiPmRlbGV0ZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjJcIj5hZGQtYmVmb3JlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiM1wiPmFkZC1hZnRlcjwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjRcIj5tb3ZlLWJlZm9yZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjVcIj5tb3ZlLWFmdGVyPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiNlwiPnN3YXA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCI3XCI+YW5ub3RhdGU8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueSh0eXBlKS5lcnJvcnM/LnJlcXVpcmVkICYmICh0eXBlLmRpcnR5IHx8IHR5cGUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+dHlwZSByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gYXQgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+YXQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiYXRcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShhdCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoYXQuZGlydHkgfHwgYXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+YXQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gYXRBc0luZGV4IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImF0QXNJbmRleFwiPmlkeDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICA8IS0tIHJ1biAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5ydW48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicnVuXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkocnVuKS5lcnJvcnM/LnJlcXVpcmVkICYmIChydW4uZGlydHkgfHwgcnVuLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnJ1biByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSB0byAtLT5cclxuICAgICAgICBAaWYgKGhhc1RvKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidG9cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueSh0bykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodG8uZGlydHkgfHwgdG8udG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+dG8gcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gdG9Bc0luZGV4IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cInRvQXNJbmRleFwiPmlkeDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICA8IS0tIHRvUnVuIC0tPlxyXG4gICAgICAgIEBpZiAoaGFzVG9SdW4pIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD50byBydW48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidG9SdW5cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueSh0b1J1bikuZXJyb3JzPy5yZXF1aXJlZCAmJiAodG9SdW4uZGlydHkgfHwgdG9SdW4udG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPnRvIHJ1biByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICB9IH1cclxuXHJcbiAgICAgICAgPCEtLSB2YWx1ZSAtLT5cclxuICAgICAgICBAaWYgKGhhc1ZhbHVlKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD52YWx1ZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ2YWx1ZVwiIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICA8IS0tIHJhbmsgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+cmFuazwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJyYW5rXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkocmFuaykuZXJyb3JzPy5yZXF1aXJlZCAmJiAocmFuay5kaXJ0eSB8fCByYW5rLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnJhbmsgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gZ3JvdXBJZCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPmdyb3VwIElEPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdyb3VwSWRcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICRhbnkoZ3JvdXBJZCkuZXJyb3JzPy5yZXF1aXJlZCAmJlxyXG4gICAgICAgICAgICAgIChncm91cElkLmRpcnR5IHx8IGdyb3VwSWQudG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPmdyb3VwIElEIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8IS0tIGlucHV0VGFnIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+aW5wdXQgdGFnPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImlucHV0VGFnXCIgLz5cclxuICAgICAgICAgIDxtYXQtaGludD5ibGFuaz1sYXRlc3Q8L21hdC1oaW50PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gb3V0cHV0VGFnIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+b3V0cHV0IHRhZzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJvdXRwdXRUYWdcIiAvPlxyXG4gICAgICAgICAgPG1hdC1oaW50PmJsYW5rPWF1dG8gKHZOKTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBmZWF0dXJlcyAtLT5cclxuICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICA8bGVnZW5kPm9wZXJhdGlvbiBmZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICAgICAgW2lzVmFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbZmVhdHVyZXNdPVwiZmVhdHVyZXMudmFsdWVcIlxyXG4gICAgICAgICAgICAoZmVhdHVyZXNDaGFuZ2UpPVwib25GZWF0dXJlc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgID48L2d2ZS1mZWF0dXJlLXNldC1lZGl0b3I+XHJcbiAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBTT1VSQ0VTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJzb3VyY2VzXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgICAgIChjbGljayk9XCJhZGRTb3VyY2UoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgc291cmNlXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8dGFibGU+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+aWQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+cmFuazwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgQGZvciAocyBvZiBzb3VyY2VzLnZhbHVlOyB0cmFjayBzKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRTb3VyY2UoJGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ3YXJuXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLnR5cGUgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcy5pZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLnJhbmsgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8IS0tIHNvdXJjZSBlZGl0b3IgLS0+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtkaXNhYmxlZF09XCIhZWRpdGVkU291cmNlXCIgW2V4cGFuZGVkXT1cImVkaXRlZFNvdXJjZVwiPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+c291cmNlPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Z3ZlLW9wZXJhdGlvbi1zb3VyY2UtZWRpdG9yXHJcbiAgICAgICAgICBbc291cmNlXT1cImVkaXRlZFNvdXJjZVwiXHJcbiAgICAgICAgICAoc291cmNlQ2hhbmdlKT1cIm9uU291cmNlQ2hhbmdlKCRldmVudCEpXCJcclxuICAgICAgICAgIChzb3VyY2VDYW5jZWwpPVwiY2xvc2VTb3VyY2UoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRElQTE9NQVRJQyAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwiZGlwbG9tYXRpY1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1yb3dcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1zYXZlXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiU2F2ZSB0byBmaWxlXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3ZnLnZhbHVlXCJcclxuICAgICAgICAgIChjbGljayk9XCJzYXZlU3ZnKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5zYXZlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1sb2FkXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiTG9hZCBmcm9tIGZpbGVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImxvYWRTdmcoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZvbGRlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tY29weVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIkNvcHlcIlxyXG4gICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJzdmcudmFsdWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGlkPVwiYnRuLXBhc3RlXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiU2V0IFNWRyBmcm9tIGNsaXBib2FyZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U3ZnRnJvbUNsaXBib2FyZCgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9wYXN0ZV9nbzwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tZWRpdG9yXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiT3BlbiBTVkcgZXh0ZXJuYWwgZWRpdG9yXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuU3ZnRWRpdG9yKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5sYXVuY2g8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgaWQ9XCJjb2RlXCI+XHJcbiAgICAgICAgPG5nZS1tb25hY28tZWRpdG9yXHJcbiAgICAgICAgICBzdHlsZT1cIi0tZWRpdG9yLWhlaWdodDogNDAwcHhcIlxyXG4gICAgICAgICAgKHJlYWR5KT1cIm9uQ3JlYXRlRWRpdG9yKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgQGlmIChzdmcuaW52YWxpZCkge1xyXG4gICAgICAgIDxtYXQtZXJyb3I+aW52YWxpZCBTVkc8L21hdC1lcnJvcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRUxFTUVOVFMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImVsZW1lbnRzXCI+XHJcbiAgICAgIDx0YWJsZT5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8dGg+aWQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+dmlzdWFsPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICBAZm9yIChlIG9mIGVsZW1lbnRzOyB0cmFjayBlLmlkKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRFbGVtZW50RmVhdHVyZXMoZSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRWxlbWVudEZlYXR1cmVzKGUpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBlLmlkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic3ZnLWNlbGxcIj5cclxuICAgICAgICAgICAgICA8c3ZnIFtpbm5lckhUTUxdPVwiZS5vdXRlckhUTUwgfCBzYWZlSHRtbCA6ICdodG1sJ1wiPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWxcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRlZEVsZW1lbnRJZFwiXHJcbiAgICAgICAgW2V4cGFuZGVkXT1cImVkaXRlZEVsZW1lbnRJZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+ZWxlbWVudDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICAgIFtmZWF0dXJlc109XCJlbGVtZW50RmVhdHVyZXMudmFsdWVbZWRpdGVkRWxlbWVudElkIV0gfHwgW11cIlxyXG4gICAgICAgICAgKGZlYXR1cmVzQ2hhbmdlKT1cIm9uRWxlbWVudEZlYXR1cmVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIERQIEZFQVRTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJkLWZlYXR1cmVzXCI+XHJcbiAgICAgIDxndmUtZmVhdHVyZS1zZXQtZWRpdG9yXHJcbiAgICAgICAgW2ZlYXR1cmVzXT1cImRwRmVhdHVyZXMudmFsdWVcIlxyXG4gICAgICAgIChmZWF0dXJlc0NoYW5nZSk9XCJvbkRwRmVhdHVyZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID48L2d2ZS1mZWF0dXJlLXNldC1lZGl0b3I+XHJcbiAgICA8L21hdC10YWI+XHJcbiAgPC9tYXQtdGFiLWdyb3VwPlxyXG5cclxuICA8IS0tIGJ1dHRvbnMgLS0+XHJcbiAgPGRpdiBpZD1cInN1Ym1pdC1yb3dcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiRGlzY2FyZCBvcGVyYXRpb25cIlxyXG4gICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgQGlmICghaGlkZVByZXZpZXcpIHtcclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiUHJldmlldyBvcGVyYXRpb25cIlxyXG4gICAgICAoY2xpY2spPVwicmVxdWVzdFByZXZpZXcoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+cHJldmlldzwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIlNhdmUgb3BlcmF0aW9uXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCB8fCBmb3JtLnByaXN0aW5lXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgIHNhdmVcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
|