@arsedizioni/ars-utils 18.1.26 → 18.1.28

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.
Files changed (30) hide show
  1. package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +3 -3
  2. package/esm2022/clipper.ui/ui/document/document.component.mjs +3 -3
  3. package/esm2022/clipper.ui/ui/last-15-days/last-15-days.component.mjs +3 -3
  4. package/esm2022/clipper.ui/ui/references/references.component.mjs +3 -3
  5. package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +3 -3
  6. package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +3 -3
  7. package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +3 -3
  8. package/esm2022/help/components/help-viewer/help-viewer.component.mjs +3 -3
  9. package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +3 -3
  10. package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +3 -3
  11. package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +3 -3
  12. package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +3 -3
  13. package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +3 -3
  14. package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +3 -3
  15. package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +3 -3
  16. package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +3 -3
  17. package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +3 -3
  18. package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +3 -3
  19. package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +3 -3
  20. package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +3 -3
  21. package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +3 -3
  22. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +14 -14
  23. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  24. package/fesm2022/arsedizioni-ars-utils-help.mjs +2 -2
  25. package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
  26. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +16 -16
  27. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  28. package/fesm2022/arsedizioni-ars-utils-ui.mjs +10 -10
  29. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  30. package/package.json +7 -7
@@ -514,7 +514,7 @@ export class ClipperReferencesComponent extends ClipperDocumentBaseComponent {
514
514
  this.dialogRef.close({ id: id });
515
515
  }
516
516
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperReferencesComponent, deps: [{ token: i1.DialogService }, { token: i2.ClipperService }, { token: i3.ScreenService }, { token: i4.MediaObserver }, { token: i5.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
517
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: ClipperReferencesComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "facetsSidenav", first: true, predicate: ["facetsSidenav"], descendants: true }, { propertyName: "facetsSearch", first: true, predicate: ["facetsSearch"], descendants: true }, { propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }, { propertyName: "contextMenu", first: true, predicate: ["contextMenuTrigger"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxFill style=\"padding: 0 0 0 15px;\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n @if (snapshot.searchParams.mode == 1) {\r\n <mat-checkbox color=\"primary\" name=\"excludeTextReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note</mat-checkbox>\r\n }\r\n @if (snapshot.searchParams.mode == 2) {\r\n <mat-checkbox color=\"primary\" name=\"excludeNotesReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\" color=\"primary\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Nascondi\"\r\n (click)=\"facetsClose(true)\" color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"references_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px;\">\r\n <div class=\"item-greyed-1\" style='text-align: center'>\r\n <p>Nessun elemento da visualizzare.</p>\r\n <p>Il filtro applicato non consente la selezione di alcun risulato.</p>\r\n </div>\r\n </div>\r\n }\r\n @if (snapshot.total) {\r\n <div>\r\n @for (item of snapshot.items; track item) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div style=\"padding-left: 15px; padding-top:24px;\">\r\n <div class=\"item-accent\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"0px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\" fxLayoutAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (!item.isJuris && item.model != 9 && (item.model != 11 || snapshot.searchParams.mode == 2) &&\r\n item.modelName && item.modelName.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">\r\n {{item.modelName}}</div>\r\n }\r\n @if (!item.isJuris && item.model == 22) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">ARS\r\n BLOG</div>\r\n }\r\n @if (item.author && item.origin === 'LR') {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">{{item.author}}</div>\r\n }\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n <a (click)=\"open(item.documentId)\"\r\n [attr.aria-label]=\"'Apri documento ' + (item.title1 ? item.title1: item.title2)\">{{item.title1\r\n ? item.title1 : item.title2}}</a>\r\n @if (item.part > 0) {\r\n <span class=\"item-badge\">PARTE {{item.part}}</span>\r\n }\r\n\r\n </div>\r\n @if (item.title1 && item.title2) {\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n {{item.title2}}\r\n </div>\r\n }\r\n @if (item.originDescription ) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-2\">\r\n {{item.originDescription}}\r\n </div>\r\n }\r\n @if (item.anchors.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <div class=\"item-line-block\">\r\n <div class=\"item-line-block-title\">DETTAGLIO</div>\r\n <div>\r\n @for (a of item.anchors; track a) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a class=\"link\" style='line-height: 18px; margin-right: 8px'\r\n (click)=\"open(a.documentId + '#' + a.uri)\" [matTooltip]=\"a.title\">{{a.text}} @if\r\n (a.veryRelevant) {\r\n <sup>\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px' color=\"primary\"\r\n matTooltip=\"Molto rilevante\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span style='line-height: 18px; margin-right: 8px '>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @if (item.validityState > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <span\r\n style=\"background-color: red; color: white; padding: 2px 4px; border-radius: 3px; border: 1px solid red\">\r\n {{item.validityDescription}}\r\n </span>\r\n </div>\r\n }\r\n\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot.total\"\r\n [pageSize]=\"25\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>", styles: [":root{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i6.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i6.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i6.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i6.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.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: FormsModule }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ClipperDocumentMenuComponent, selector: "clipper-document-menu", inputs: ["selectionSource", "parent", "item", "isReference", "isReadable", "isSelectable", "isDeadline", "isLawInForce", "isLaw"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i14.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i14.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i15.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i15.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i15.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i16.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ClipperSearchFacetsComponent, selector: "clipper-search-facets", inputs: ["busy"], outputs: ["changed"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i17.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] }); }
517
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: ClipperReferencesComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "facetsSidenav", first: true, predicate: ["facetsSidenav"], descendants: true }, { propertyName: "facetsSearch", first: true, predicate: ["facetsSearch"], descendants: true }, { propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }, { propertyName: "contextMenu", first: true, predicate: ["contextMenuTrigger"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxFill style=\"padding: 0 0 0 15px;\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n @if (snapshot.searchParams.mode == 1) {\r\n <mat-checkbox color=\"primary\" name=\"excludeTextReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note</mat-checkbox>\r\n }\r\n @if (snapshot.searchParams.mode == 2) {\r\n <mat-checkbox color=\"primary\" name=\"excludeNotesReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\" color=\"primary\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Nascondi\"\r\n (click)=\"facetsClose(true)\" color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"references_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px;\">\r\n <div class=\"item-greyed-1\" style='text-align: center'>\r\n <p>Nessun elemento da visualizzare.</p>\r\n <p>Il filtro applicato non consente la selezione di alcun risulato.</p>\r\n </div>\r\n </div>\r\n }\r\n @if (snapshot.total) {\r\n <div>\r\n @for (item of snapshot.items; track item) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div style=\"padding-left: 15px; padding-top:24px;\">\r\n <div class=\"item-accent\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"0px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\" fxLayoutAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (!item.isJuris && item.model != 9 && (item.model != 11 || snapshot.searchParams.mode == 2) &&\r\n item.modelName && item.modelName.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">\r\n {{item.modelName}}</div>\r\n }\r\n @if (!item.isJuris && item.model == 22) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">ARS\r\n BLOG</div>\r\n }\r\n @if (item.author && item.origin === 'LR') {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">{{item.author}}</div>\r\n }\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n <a (click)=\"open(item.documentId)\"\r\n [attr.aria-label]=\"'Apri documento ' + (item.title1 ? item.title1: item.title2)\">{{item.title1\r\n ? item.title1 : item.title2}}</a>\r\n @if (item.part > 0) {\r\n <span class=\"item-badge\">PARTE {{item.part}}</span>\r\n }\r\n\r\n </div>\r\n @if (item.title1 && item.title2) {\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n {{item.title2}}\r\n </div>\r\n }\r\n @if (item.originDescription ) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-2\">\r\n {{item.originDescription}}\r\n </div>\r\n }\r\n @if (item.anchors.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <div class=\"item-line-block\">\r\n <div class=\"item-line-block-title\">DETTAGLIO</div>\r\n <div>\r\n @for (a of item.anchors; track a) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a class=\"link\" style='line-height: 18px; margin-right: 8px'\r\n (click)=\"open(a.documentId + '#' + a.uri)\" [matTooltip]=\"a.title\">{{a.text}} @if\r\n (a.veryRelevant) {\r\n <sup>\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px' color=\"primary\"\r\n matTooltip=\"Molto rilevante\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span style='line-height: 18px; margin-right: 8px '>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @if (item.validityState > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <span\r\n style=\"background-color: red; color: white; padding: 2px 4px; border-radius: 3px; border: 1px solid red\">\r\n {{item.validityDescription}}\r\n </span>\r\n </div>\r\n }\r\n\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot.total\"\r\n [pageSize]=\"25\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>", styles: ["@media (prefers-color-scheme: dark){.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, \"#4CAF50\")}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error, \"#ff5449\")}}.dialog-info{font-size:x-small;font-weight:700;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, \"#388E3C\")}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error, \"#a80710\")}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i6.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i6.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i6.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i6.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.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: FormsModule }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ClipperDocumentMenuComponent, selector: "clipper-document-menu", inputs: ["selectionSource", "parent", "item", "isReference", "isReadable", "isSelectable", "isDeadline", "isLawInForce", "isLaw"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i14.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i14.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i15.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i15.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i15.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i16.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ClipperSearchFacetsComponent, selector: "clipper-search-facets", inputs: ["busy"], outputs: ["changed"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i17.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] }); }
518
518
  }
519
519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperReferencesComponent, decorators: [{
520
520
  type: Component,
@@ -537,7 +537,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
537
537
  ClipperSearchFacetsComponent,
538
538
  NgClass,
539
539
  MatPaginatorModule,
540
- ], template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxFill style=\"padding: 0 0 0 15px;\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n @if (snapshot.searchParams.mode == 1) {\r\n <mat-checkbox color=\"primary\" name=\"excludeTextReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note</mat-checkbox>\r\n }\r\n @if (snapshot.searchParams.mode == 2) {\r\n <mat-checkbox color=\"primary\" name=\"excludeNotesReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\" color=\"primary\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Nascondi\"\r\n (click)=\"facetsClose(true)\" color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"references_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px;\">\r\n <div class=\"item-greyed-1\" style='text-align: center'>\r\n <p>Nessun elemento da visualizzare.</p>\r\n <p>Il filtro applicato non consente la selezione di alcun risulato.</p>\r\n </div>\r\n </div>\r\n }\r\n @if (snapshot.total) {\r\n <div>\r\n @for (item of snapshot.items; track item) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div style=\"padding-left: 15px; padding-top:24px;\">\r\n <div class=\"item-accent\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"0px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\" fxLayoutAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (!item.isJuris && item.model != 9 && (item.model != 11 || snapshot.searchParams.mode == 2) &&\r\n item.modelName && item.modelName.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">\r\n {{item.modelName}}</div>\r\n }\r\n @if (!item.isJuris && item.model == 22) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">ARS\r\n BLOG</div>\r\n }\r\n @if (item.author && item.origin === 'LR') {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">{{item.author}}</div>\r\n }\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n <a (click)=\"open(item.documentId)\"\r\n [attr.aria-label]=\"'Apri documento ' + (item.title1 ? item.title1: item.title2)\">{{item.title1\r\n ? item.title1 : item.title2}}</a>\r\n @if (item.part > 0) {\r\n <span class=\"item-badge\">PARTE {{item.part}}</span>\r\n }\r\n\r\n </div>\r\n @if (item.title1 && item.title2) {\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n {{item.title2}}\r\n </div>\r\n }\r\n @if (item.originDescription ) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-2\">\r\n {{item.originDescription}}\r\n </div>\r\n }\r\n @if (item.anchors.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <div class=\"item-line-block\">\r\n <div class=\"item-line-block-title\">DETTAGLIO</div>\r\n <div>\r\n @for (a of item.anchors; track a) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a class=\"link\" style='line-height: 18px; margin-right: 8px'\r\n (click)=\"open(a.documentId + '#' + a.uri)\" [matTooltip]=\"a.title\">{{a.text}} @if\r\n (a.veryRelevant) {\r\n <sup>\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px' color=\"primary\"\r\n matTooltip=\"Molto rilevante\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span style='line-height: 18px; margin-right: 8px '>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @if (item.validityState > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <span\r\n style=\"background-color: red; color: white; padding: 2px 4px; border-radius: 3px; border: 1px solid red\">\r\n {{item.validityDescription}}\r\n </span>\r\n </div>\r\n }\r\n\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot.total\"\r\n [pageSize]=\"25\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>", styles: [":root{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}\n"] }]
540
+ ], template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxFill style=\"padding: 0 0 0 15px;\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n @if (snapshot.searchParams.mode == 1) {\r\n <mat-checkbox color=\"primary\" name=\"excludeTextReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note</mat-checkbox>\r\n }\r\n @if (snapshot.searchParams.mode == 2) {\r\n <mat-checkbox color=\"primary\" name=\"excludeNotesReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\" color=\"primary\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Nascondi\"\r\n (click)=\"facetsClose(true)\" color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"references_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px;\">\r\n <div class=\"item-greyed-1\" style='text-align: center'>\r\n <p>Nessun elemento da visualizzare.</p>\r\n <p>Il filtro applicato non consente la selezione di alcun risulato.</p>\r\n </div>\r\n </div>\r\n }\r\n @if (snapshot.total) {\r\n <div>\r\n @for (item of snapshot.items; track item) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div style=\"padding-left: 15px; padding-top:24px;\">\r\n <div class=\"item-accent\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"0px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\" fxLayoutAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (!item.isJuris && item.model != 9 && (item.model != 11 || snapshot.searchParams.mode == 2) &&\r\n item.modelName && item.modelName.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">\r\n {{item.modelName}}</div>\r\n }\r\n @if (!item.isJuris && item.model == 22) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">ARS\r\n BLOG</div>\r\n }\r\n @if (item.author && item.origin === 'LR') {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">{{item.author}}</div>\r\n }\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n <a (click)=\"open(item.documentId)\"\r\n [attr.aria-label]=\"'Apri documento ' + (item.title1 ? item.title1: item.title2)\">{{item.title1\r\n ? item.title1 : item.title2}}</a>\r\n @if (item.part > 0) {\r\n <span class=\"item-badge\">PARTE {{item.part}}</span>\r\n }\r\n\r\n </div>\r\n @if (item.title1 && item.title2) {\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n {{item.title2}}\r\n </div>\r\n }\r\n @if (item.originDescription ) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-2\">\r\n {{item.originDescription}}\r\n </div>\r\n }\r\n @if (item.anchors.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <div class=\"item-line-block\">\r\n <div class=\"item-line-block-title\">DETTAGLIO</div>\r\n <div>\r\n @for (a of item.anchors; track a) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a class=\"link\" style='line-height: 18px; margin-right: 8px'\r\n (click)=\"open(a.documentId + '#' + a.uri)\" [matTooltip]=\"a.title\">{{a.text}} @if\r\n (a.veryRelevant) {\r\n <sup>\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px' color=\"primary\"\r\n matTooltip=\"Molto rilevante\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span style='line-height: 18px; margin-right: 8px '>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @if (item.validityState > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <span\r\n style=\"background-color: red; color: white; padding: 2px 4px; border-radius: 3px; border: 1px solid red\">\r\n {{item.validityDescription}}\r\n </span>\r\n </div>\r\n }\r\n\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot.total\"\r\n [pageSize]=\"25\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>", styles: ["@media (prefers-color-scheme: dark){.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, \"#4CAF50\")}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error, \"#ff5449\")}}.dialog-info{font-size:x-small;font-weight:700;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, \"#388E3C\")}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error, \"#a80710\")}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}\n"] }]
541
541
  }], ctorParameters: () => [{ type: i1.DialogService }, { type: i2.ClipperService }, { type: i3.ScreenService }, { type: i4.MediaObserver }, { type: i5.MatDialogRef }, { type: undefined, decorators: [{
542
542
  type: Inject,
543
543
  args: [MAT_DIALOG_DATA]
@@ -554,4 +554,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
554
554
  type: ViewChild,
555
555
  args: ['contextMenuTrigger']
556
556
  }] } });
557
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvY2xpcHBlci51aS91aS9yZWZlcmVuY2VzL3JlZmVyZW5jZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvcmVmZXJlbmNlcy9yZWZlcmVuY2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFnQixlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0csT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBaUIsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQ0wsa0JBQWtCLEVBR25CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXhGLE9B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LENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO3dCQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDN0UsQ0FBQzt5QkFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVc7d0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxJ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LDRCQUE0Qjt3QkFDNUIsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixvQkFBb0I7d0JBQ3BCLDRCQUE0Qjt3QkFFNUIsT0FBTzt3QkFDUCxrQkFBa0I7cUJBQ3JCOzswQkE0QkEsTUFBTTsyQkFBQyxlQUFlO3lDQXhCRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNELFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDVyxXQUFXO3NCQUEzQyxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lZGlhQ2hhbmdlLCBNZWRpYU9ic2VydmVyIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1RpdGxlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIsIE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBEYXRlRm9ybWF0LCBTY3JlZW5TZXJ2aWNlLCBTZWxlY3RhYmxlTW9kZWwsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZUb2RheSwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJ1xyXG5pbXBvcnQgeyBDbGlwcGVyRG9jdW1lbnRCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vZG9jdW1lbnQvYmFzZS9kb2N1bWVudC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ2xpcHBlckRlZmluaXRpb25zLFxyXG4gIENsaXBwZXJTZXJ2aWNlLFxyXG4gIERvY3VtZW50UmVmZXJlbmNlU25hcHNob3RcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NsaXBwZXIuY29tbW9uJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2LCBNYXRTaWRlbmF2TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZmFjZXRzL3NlYXJjaC1mYWNldHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWknO1xyXG5pbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XHJcbmltcG9ydCB7IEV4dGVuZGVkTW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2V4dGVuZGVkJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2RvY3VtZW50LW1lbnUvZG9jdW1lbnQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyAgTmdTdHlsZSwgIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9mbGV4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgaG9zdDogeyAnQmluZCc6IFN5c3RlbVV0aWxzLmdlbmVyYXRlVVVJRCgpIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVmZXJlbmNlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9yZWZlcmVuY2VzLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIEZsZXhNb2R1bGUsXHJcbiAgICAgICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcclxuICAgICAgICBcclxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgICAgICBGb3Jtc01vZHVsZSxcclxuICAgICAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxyXG4gICAgICAgIENsaXBwZXJEb2N1bWVudE1lbnVDb21wb25lbnQsXHJcbiAgICAgICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgICAgICBOZ1N0eWxlLFxyXG4gICAgICAgIEV4dGVuZGVkTW9kdWxlLFxyXG4gICAgICAgIE1hdFNpZGVuYXZNb2R1bGUsXHJcbiAgICAgICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXHJcbiAgICAgICAgQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudCxcclxuICAgICAgICBcclxuICAgICAgICBOZ0NsYXNzLFxyXG4gICAgICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudCBleHRlbmRzIENsaXBwZXJEb2N1bWVudEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTaWRlbmF2JykgZmFjZXRzU2lkZW5hdiA6IE1hdFNpZGVuYXY7XHJcbiAgQFZpZXdDaGlsZCgnZmFjZXRzU2VhcmNoJykgZmFjZXRzU2VhcmNoIDogQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdwYWdpbmF0b3InKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XHJcbiAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnVUcmlnZ2VyJykgY29udGV4dE1lbnUhOiBNYXRNZW51VHJpZ2dlcjtcclxuXHJcbiAgcHJpdmF0ZSBfX2QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgdGl0bGU6IHN0cmluZyA9IG51bGw7XHJcbiAgc2VsZWN0aW9uOiBTZWxlY3RhYmxlTW9kZWw8YW55LCBzdHJpbmc+ID0gbmV3IFNlbGVjdGFibGVNb2RlbCh0cnVlLCAnZG9jdW1lbnRJZCcpO1xyXG4gIHNuYXBzaG90OiBEb2N1bWVudFJlZmVyZW5jZVNuYXBzaG90ID0gbnVsbDtcclxuICBmYWNldHNNb2RlOiBzdHJpbmcgPSAnc2lkZSc7XHJcbiAgZmFjZXRzQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29udGVudEhlaWdodDogbnVtYmVyID0gbnVsbDtcclxuICBjb250ZXh0TWVudVBvc2l0aW9uID0geyB4OiAnMHB4JywgeTogJzBweCcgfTtcclxuICBtcTogc3RyaW5nID0gbnVsbDtcclxuICBhbmNob3I6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbTogYW55ID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgJGRpYWxvZzogRGlhbG9nU2VydmljZSxcclxuICAgIHB1YmxpYyAkY2xpcHBlcjogQ2xpcHBlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgJHNjcmVlbjogU2NyZWVuU2VydmljZSxcclxuICAgIHByaXZhdGUgbWVkaWE6IE1lZGlhT2JzZXJ2ZXIsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBfZGF0YTogYW55XHJcbiAgKSB7XHJcbiAgICBzdXBlcigkZGlhbG9nLCAkY2xpcHBlcik7XHJcblxyXG4gICAgLy8gQ2hvb3NlIHRoZSB0aXRsZVxyXG4gICAgc3dpdGNoIChfZGF0YS5tb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX1JFRkVSRU5DRVNfSU46XHJcbiAgICAgICAgdGhpcy50aXRsZSA9ICdEb2N1bWVudGkgcmljaGlhbWF0aSBuZWxsZSBub3RlIG8gbmVsIHRlc3RvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fUkVGRVJFTkNFU19PVVQ6XHJcbiAgICAgICAgdGhpcy50aXRsZSA9ICdEb2N1bWVudGkgY2hlIHJpY2hpYW1hbm8gcXVlbGxvIGluIHZpc2lvbmUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX0lOOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnTW9kaWZpY2hlIHN1Yml0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX0NIQU5HRVNfT1VUOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnTW9kaWZpY2hlIGFwcG9ydGF0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX0pVUklTOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnR2l1cmlzcHJ1ZGVuemEgYXNzb2NpYXRhJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChfZGF0YS5hbmNob3JUaXRsZSkgdGhpcy50aXRsZSArPSAnIC0gJyArIF9kYXRhLmFuY2hvclRpdGxlO1xyXG5cclxuICAgIHRoaXMuYW5jaG9yID0gX2RhdGEuYW5jaG9yO1xyXG5cclxuICAgIC8vIFVzZSBzZXJ2aWNlIHNuYXBzaG90XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gJGNsaXBwZXIucmVmZXJlbmNlc1NuYXBzaG90O1xyXG4gICAgaWYgKCF0aGlzLnNuYXBzaG90KVxyXG4gICAgICB0aGlzLnNuYXBzaG90ID0ge1xyXG4gICAgICAgIHNlYXJjaFBhcmFtczoge30sXHJcbiAgICAgIH07XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGUgIT09IF9kYXRhLm1vZGUgfHxcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZG9jdW1lbnRJZCAhPT0gX2RhdGEuaWQgfHxcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYW5jaG9yICE9PSBfZGF0YS5hbmNob3JcclxuICAgICkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgICBtb2RlOiBfZGF0YS5tb2RlLFxyXG4gICAgICAgIG1vZGVsOiBfZGF0YS5tb2RlbCxcclxuICAgICAgICBhbmNob3I6IF9kYXRhLmFuY2hvcixcclxuICAgICAgICBkb2N1bWVudElkOiBfZGF0YS5pZCxcclxuICAgICAgICB1c2VNb2RpZmllckluZm86IF9kYXRhLm1vZGUgPT09IENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX09VVCxcclxuICAgICAgICByZXR1cm5Nb2RpZmllckluZm86IF9kYXRhLm1vZGUgIT09IENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX09VVCxcclxuICAgICAgICBmaXJzdDogMCxcclxuICAgICAgICBjb3VudDogMjUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBTdG9yZSBzbmFwc2hvdFxyXG4gICAgICAkY2xpcHBlci5yZWZlcmVuY2VzU25hcHNob3QgPSB0aGlzLnNuYXBzaG90O1xyXG5cclxuICAgICAgLy8gTmV3IHNlYXJjaFxyXG4gICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gRGlzcGxheSBjdXJyZW50IHNuYXBzaG90IGZhY2V0cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICB0aGlzLmRpc3BsYXlGYWNldHMoKTtcclxuICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgICB9LCAyNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBSZWFjdCB0byBtZWRpYSBxdWVyeSBjaGFuZ2VzXHJcbiAgICB0aGlzLm1lZGlhXHJcbiAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX2QkKSlcclxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlczogTWVkaWFDaGFuZ2VbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMubXEgPSBjaGFuZ2VzWzBdLm1xQWxpYXM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gd2luZG93IHNpemUgY2hhbmdlXHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX19kJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIHNpZGVuYXYgc3RhdGUgY2hhbmdlXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NpZGVuYXYpXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb25maWd1cmUgZmFjZXQgc2VhY2ggY29tcG9uZW50XHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaCkge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5mcm9tRGF0ZSA9IHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5jaGFuZ2VkSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudG9EYXRlID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFNlY3RvcilcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2VjdG9yID0gdGhpcy5mYWNldHNTZWFyY2guc2VjdG9yO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLnR5cGUgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFR5cGUpXHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnR5cGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50eXBlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLmF1dGhvciB8fCB0aGlzLmZhY2V0c1NlYXJjaC5jaGFuZ2VkQXV0aG9yKVxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5hdXRob3IgPSB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3I7XHJcbiAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2gucmVhc29uIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRSZWFzb24pXHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnJlYXNvbiA9IHRoaXMuZmFjZXRzU2VhcmNoLnJlYXNvbjtcclxuICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmFuY2hvciA9IHRoaXMuZmFjZXRzU2VhcmNoLmFuY2hvclxyXG4gICAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLmFuY2hvclxyXG4gICAgICAgICAgICA6IHRoaXMuYW5jaG9yO1xyXG4gICAgICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5fX2QkLm5leHQoKTtcclxuICAgIHRoaXMuX19kJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25Db250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudVBvc2l0aW9uLnggPSBldmVudC5jbGllbnRYICsgJ3B4JztcclxuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbi55ID0gZXZlbnQuY2xpZW50WSArICdweCc7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51Lm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH07XHJcbiAgICB0aGlzLmNvbnRleHRNZW51Lm9wZW5NZW51KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBkaWFsb2dcclxuICAgKi9cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuc2F2ZVNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBzY3JvbGwgcG9zaXRpb25cclxuICAgKi9cclxuICBzYXZlU2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICB0aGlzLiRjbGlwcGVyLnNjcm9sbGFibGUuc2F2ZVBvc2l0aW9uKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5kb2N1bWVudElkLFxyXG4gICAgICAnI3JlZmVyZW5jZXNfY29udGFpbmVyJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVmZXJlbmNlc19jb250YWluZXInKS5zY3JvbGxUbygwLCAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCkge1xyXG4gICAgdGhpcy4kY2xpcHBlci5zY3JvbGxhYmxlLnRyeVJlc3RvcmVQb3NpdGlvbihcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZG9jdW1lbnRJZCxcclxuICAgICAgJyNyZWZlcmVuY2VzX2NvbnRhaW5lcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbWVudSBidXR0b25zIHZpc2liaWxpdHkgd2hlbiB0aGUgbWVudSBpcyBjbG9zZWRcclxuICAgKi9cclxuICB1cGRhdGVNZW51QnV0dG9uc1Zpc2liaWxpdHkoKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zLmZvckVhY2goKG46IGFueSkgPT4ge1xyXG4gICAgICBuLmlzTWVudU9wZW4gPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRqdXN0IHZpZXdcclxuICAgKi9cclxuICBhZGp1c3RWaWV3KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB2aWV3XHJcbiAgICovXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIC8vIFVwZGF0ZSByb3V0ZXIgaGVpZ2h0XHJcbiAgICBsZXQgYSA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgIGxldCBiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaXBwZXItcmVmZXJlbmNlcy1maXhlZCcpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCFhIHx8ICFiIHx8IGEgPT09IDApIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICBsZXQgaGIgPSBiLmNsaWVudEhlaWdodDtcclxuICAgICAgaWYgKGhiID09PSAwKSB0aGlzLmFkanVzdFZpZXcoKTtcclxuICAgICAgdGhpcy5jb250ZW50SGVpZ2h0ID0gYSAtIChoYiArIDEyKTtcclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgc2lkZW5hdiB2aXNpYmlsaXR5XHJcbiAgICogQHBhcmFtIG1xIDogdGhlIGN1cnJlbnQgbWVkaWEgcXVlcnlcclxuICAgKi9cclxuICB1cGRhdGVGYWNldHNWaXNpYmlsaXR5KCkge1xyXG4gICAgaWYgKHRoaXMubXEgPT09ICd4cycpIHtcclxuICAgICAgdGhpcy5mYWNldHNNb2RlID0gJ292ZXInO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYub3BlbmVkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmFjZXRzTW9kZSA9ICdzaWRlJztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guaGFzRmFjZXRzICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2ICYmXHJcbiAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYudG9nZ2xlKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBmYWNldHNTaWRlbmF2IHNpZGViYXJcclxuICAgKi9cclxuICBmYWNldHNPcGVuKCkge1xyXG4gICAgdGhpcy5mYWNldHNDbG9zZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBmYWNldHMgc2lkZWJhclxyXG4gICAqIEBwYXJhbSBjbG9zZWRNYW51YWxseSA6IHR1cmUgaWYgZmFjZXRzIGhhcyBiZWVuIGNsb3NlZCBtYW51YWxseSBieSBjbGlja2luZyB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZmFjZXRzQ2xvc2UoY2xvc2VkTWFudWFsbHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubXEgIT09ICd4cycpIHRoaXMuZmFjZXRzQ2xvc2VkID0gY2xvc2VkTWFudWFsbHk7XHJcbiAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBhIGRvY3VtZW50IGluIHBkZiBmb3JtYXRcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudCB0byBleHBvcnRcclxuICAgKi9cclxuICBleHBvcnRQZGYoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuJGNsaXBwZXIubG9nZ2VkSW4pIHJldHVybjtcclxuICAgIGlmICghaXRlbSB8fCBpdGVtLm1vZGVsID09PSAxMSkgcmV0dXJuO1xyXG4gICAgdGhpcy4kZGlhbG9nXHJcbiAgICAgIC5jb25maXJtKFwiQ29uZmVybWkgbCdlc3BvcnRhemlvbmU/XCIsICdBdHRlbnppb25lIScpXHJcbiAgICAgIC5jb21wb25lbnRJbnN0YW5jZS5jaG9vc2VuXHJcbiAgICAgIC5zdWJzY3JpYmUoKHI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyLnJlc3VsdCA9PT0gJ29rJykge1xyXG4gICAgICAgICAgdGhpcy4kZGlhbG9nLmJ1c3koJ0VzcG9ydGF6aW9uZSBpbiBjb3Jzby4uLicpO1xyXG4gICAgICAgICAgdGhpcy4kY2xpcHBlclxyXG4gICAgICAgICAgICAuZXhwb3J0UGRmKGl0ZW0uZG9jdW1lbnRJZClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKHIyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHNhdmVBcyhcclxuICAgICAgICAgICAgICAgICAgcjIsXHJcbiAgICAgICAgICAgICAgICAgIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxIDogaXRlbS5kb2N1bWVudElkKSArICcucGRmJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRkaWFsb2cuY2xlYXJCdXN5KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBkb2N1bWVudCBsaW5rcyBieSBlbWFpbFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gYWRkXHJcbiAgICovXHJcbiAgc2VuZFRvKGl0ZW06IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2VuZEl0ZW1zVG8oaXRlbSA/IFtpdGVtXSA6IHRoaXMuc2VsZWN0aW9uLmFsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtIGEgc2VhcmNoXHJcbiAgICogQHBhcmFtIG5ld1NlYXJjaDogdHJ1ZSBpZiBpcyBhIG5ldyBzZWFyY2hcclxuICAgKi9cclxuICBmZXRjaChuZXdTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCF0aGlzLiRjbGlwcGVyLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICBpZiAobmV3U2VhcmNoKSB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5maXJzdCA9IDA7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy51c2VNb2RpZmllckluZm8gPVxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fQ0hBTkdFU19PVVQ7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5yZXR1cm5Nb2RpZmllckluZm8gPVxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlICE9PSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fQ0hBTkdFU19PVVQ7XHJcbiAgICB0aGlzLiRkaWFsb2cuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy4kY2xpcHBlci5yZWZlcmVuY2VzKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHRoaXMuJGRpYWxvZy5lcnJvcihyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gc3RhcnRPZlRvZGF5KCk7XHJcbiAgICAgICAgICAgIGxldCBncm91cCA9ICcnOyAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnRvdGFsID0gci52YWx1ZT8udG90YWwgPz8gMDtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcyA9IHIudmFsdWU/Lml0ZW1zID8/IFtdOyAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NBREVOWkEgfHxcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJEZWZpbml0aW9ucy5ETV9TRUdOQUxBWklPTkVcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAobi5tb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0FERU5aQTpcclxuICAgICAgICAgICAgICAgICAgICBuLm9yaWdpbkRlc2NyaXB0aW9uID0gJ1NjYWRlbnphJztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0VHTkFMQVpJT05FOlxyXG4gICAgICAgICAgICAgICAgICAgIG4ub3JpZ2luRGVzY3JpcHRpb24gPSAnU2VnbmFsYXppb25lJztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nSW5mbykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBuLmV4cGlyaW5nSW5mby5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSBuLmRlc2NyaXB0aW9uID0gcGFydHNbMl07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5leHBpcmluZ0RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgbi5kYXRlID0gc3RhcnRPZkRheShuZXcgRGF0ZShuLmV4cGlyaW5nRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKG4uZGF0ZSwgMTUpKVxyXG4gICAgICAgICAgICAgICAgICBuLmlzRXhwaXJpbmcgPSB0b2RheSA8PSBuLmRhdGUgJiYgdG9kYXkgPj0gZDtcclxuICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBuLmRhdGUgPCB0b2RheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKHN0YXJ0T2ZUb2RheSgpLCA3KSlcclxuICAgICAgICAgICAgICAgICAgbi5pc05ldyA9IG4uZGF0ZSA+IGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5hbmNob3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JUeXBlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT09IDIwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSAhPT0gYW5jaG9yVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSA+PSAzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goeyB0ZXh0OiBhLnR5cGVEZXNjcmlwdGlvbiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclR5cGUgPSBhLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY29yZSA9IGEuc2NvcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gNykgc2NvcmUgLT0gNztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29yZSA+IDUpIHNjb3JlIC09IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAzKSBzY29yZSAtPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGEuZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHVyaTogYS51cmksXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJ5UmVsZXZhbnQ6IHNjb3JlID4gMC42LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzID0gYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLnZhbGlkaXR5U3RhdGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9ICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSc7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG4udmFsaWRVbnRpbERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmluZ0RhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4udmFsaWRVbnRpbERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmdEYXRlIDwgdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSBkYWwgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZXhwaXJpbmdEYXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcuJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi52YWxpZGl0eURlc2NyaXB0aW9uID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lsIGRvY3VtZW50byBub24gc2Fyw6AgcGnDuSB2aWdlbnRlIGRhbCAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShleHBpcmluZ0RhdGUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gbi5kYXRlIDwgdG9kYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCB5ZWFyID0gU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShuLmRhdGUsIERhdGVGb3JtYXQuTG9uZ01vbnRoQW5kWWVhcikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICBpZiAoZ3JvdXAgIT09IHllYXIpIHtcclxuICAgICAgICAgICAgICAgIG4uZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobi50YXhvbm9teSkge1xyXG4gICAgICAgICAgICAgICAgbi50YXhvbm9teU5vZGVzID0gbi50YXhvbm9teS5zcGxpdCgnXFxyXFxuJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fR1VJREEgfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5ETV9HVUlEQV9OT1JNQVRJVkEgfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0hFREFfQURFTVBJTUVOVElcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4udGF4b25vbXlOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gbi50YXhvbm9teU5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwID0gbm9kZS5pbmRleE9mKCc+Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgICAgbi50YXhvbm9teU5vZGVzW2ldID0gbm9kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHAgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFw+L2dpLCAnID4gJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gSGFuZGxlIGZhY2V0c1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoKVxyXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZhY2V0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmFjZXRzKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5yZXNldCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobmV3U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLiRkaWFsb2cuY2xlYXJCdXN5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBuZXcgcGFnZSByZXN1bHRcclxuICAgKiBAcGFyYW0gZSA6IHRoZSBNYXRQYWdpbmF0b3IgUGFnZUV2ZW50IGRhdGFcclxuICAgKi9cclxuICBmZXRjaE1vcmUoZTogYW55KSB7XHJcbiAgICBsZXQgZmlyc3QgPSBlLnBhZ2VJbmRleCAqIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNvdW50O1xyXG4gICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZmlyc3QgPSBmaXJzdDtcclxuICAgIHRoaXMuZmV0Y2goKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmYWNldHNcclxuICAgKiBAcGFyYW0gc2VhcmNoUGFyYW1zIDogdGhlIGN1cnJlbnQgc2VhcmNoIHBhcmFtcyB0byB1c2UgdG8gZ2F0aGVyIGZhY2V0cyBvciBudWxsIHRvIHVzZSBjdXJyZW50IHNuYXBzaG90XHJcbiAgICovXHJcbiAgZGlzcGxheUZhY2V0cyhzZWFyY2hQYXJhbXM6IGFueSA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy4kY2xpcHBlci5sb2dnZWRJbikgcmV0dXJuO1xyXG4gICAgaWYgKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4kY2xpcHBlci5yZWZlcmVuY2VzRmFjZXRzKHNlYXJjaFBhcmFtcylcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC51cGRhdGUoci52YWx1ZS5mYWNldHMsIG51bGwpO1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmhhc0ZhY2V0cyAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1xICE9PSAneHMnXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYWNldHNPcGVuKCk7XHJcbiAgICAgICAgICAgICAgZWxzZSB0aGlzLmZhY2V0c0Nsb3NlKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSB0aGlzLmZhY2V0c1NlYXJjaDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cykge1xyXG4gICAgICB0aGlzLmZhY2V0c1NlYXJjaC5yZXN0b3JlRnJvbSh0aGlzLnNuYXBzaG90LmZhY2V0cyk7XHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgIXRoaXMuZmFjZXRzQ2xvc2VkICYmIHRoaXMubXEgIT09ICd4cycpXHJcbiAgICAgICAgdGhpcy5mYWNldHNPcGVuKCk7XHJcbiAgICAgIGVsc2UgdGhpcy5mYWNldHNDbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgY3VycmVudCBkaWFsb2cgYW5kIHJldHVybiB0aGUgaWQgdG8gbmF2aWdhdGUgdG9cclxuICAgKiBAcGFyYW0gaWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBvcGVuKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgaWQ6IGlkIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiY2xpcHBlci1yZWZlcmVuY2VzLWZpeGVkXCI+XHJcbiAgPGRpdiBpZD1cImNsaXBwZXItcmVmZXJlbmNlcy1oZWFkZXJcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7dGl0bGV9fSA8L2gyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkNoaXVkaVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2hpdWRpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4RmlsbCBzdHlsZT1cInBhZGRpbmc6IDAgMCAwIDE1cHg7XCI+XHJcbiAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09IDEpIHtcclxuICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiBuYW1lPVwiZXhjbHVkZVRleHRSZWZlcmVuY2VzXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5leGNsdWRlVGV4dFJlZmVyZW5jZXNcIiAoY2hhbmdlKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgTW9zdHJhIHNvbG8gc2UgY2l0YXRpIG5lbGxlIG5vdGU8L21hdC1jaGVja2JveD5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09IDIpIHtcclxuICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiBuYW1lPVwiZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMuZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiIChjaGFuZ2UpPVwiZmV0Y2godHJ1ZSlcIj5cclxuICAgICAgICBNb3N0cmEgc29sbyBzZSBjaXRhbm8gbmVsIHRlc3RvIGlsIGRvY3VtZW50b1xyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIkF6aW9uaSBkYSBlc2VndWlyZSBzdWdsaSBlbGVtZW50aSBzZWxlemlvbmF0aVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBvcHppb25pIHBlciBlbGVtZW50aSBzZWxlemlvbmF0aSdcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVNlbGVjdGlvbnNcIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIFttYXRCYWRnZV09XCJzZWxlY3Rpb24uYWxsLmxlbmd0aFwiXHJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCI+cGxheWxpc3RfYWRkX2NoZWNrPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxjbGlwcGVyLWRvY3VtZW50LW1lbnUgW3BhcmVudF09XCJ0aGlzXCIgW3NlbGVjdGlvblNvdXJjZV09XCJzZWxlY3Rpb25cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIEBpZiAoZmFjZXRzU2VhcmNoICYmIGZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgZmFjZXRzU2lkZW5hdiAmJiAoIWZhY2V0c1NpZGVuYXYub3BlbmVkIHx8IGZhY2V0c0Nsb3NlZCkpIHtcclxuICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXRUb29sdGlwPVwiQWZmaW5hIHJpY2VyY2FcIiBhcmlhLWxhYmVsPVwiJ0FmZmluYSByaWNlcmNhJ1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmFjZXRzT3BlbigpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+bWVudV9vcGVuPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgc3R5bGU9XCJwYWRkaW5nOjAgMCAwIDE1cHhcIiBbbmdTdHlsZV09XCJ7J21pbi1oZWlnaHQucHgnOiBjb250ZW50SGVpZ2h0fVwiPlxyXG4gIDxtYXQtc2lkZW5hdi1jb250YWluZXIgW25nU3R5bGVdPVwieydoZWlnaHQucHgnOiBjb250ZW50SGVpZ2h0fVwiPlxyXG4gICAgPG1hdC1zaWRlbmF2ICNmYWNldHNTaWRlbmF2IHBvc2l0aW9uPVwiZW5kXCIgYXV0b0ZvY3VzPVwiZmFsc2VcIiBvcGVuZWQ9XCJmYWxzZVwiIG1vZGU9XCJ7e2ZhY2V0c01vZGV9fVwiXHJcbiAgICAgIGNsYXNzPVwic2lkZW5hdiBzaWRlbmF2LWZhY2V0c1wiPlxyXG4gICAgICBAaWYgKGZhY2V0c1NlYXJjaC5idXN5KSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6NXB4XCI+XHJcbiAgICAgICAgICBAaWYgKGZhY2V0c1NlYXJjaC5idXN5KSB7XHJcbiAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBjbGFzcz1cInNpZGVuYXYtbG9hZGVyXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCI2NHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGaWxsIGNsYXNzPVwic2lkZW5hdi10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBmeExheW91dEFsaWduPVwic3RhcnRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpZGVuYXYtdGl0bGVcIj5BZmZpbmEgcmljZXJjYTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmFjZXRzQ2xvc2UodHJ1ZSlcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiPlxyXG4gICAgICAgICAgPGNsaXBwZXItc2VhcmNoLWZhY2V0cyAjZmFjZXRzU2VhcmNoPjwvY2xpcHBlci1zZWFyY2gtZmFjZXRzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXNpZGVuYXY+XHJcbiAgICA8bWF0LXNpZGVuYXYtY29udGVudD5cclxuICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6IGNvbnRlbnRIZWlnaHQgfVwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGw+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGlkPVwicmVmZXJlbmNlc19jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW5cIj5cclxuICAgICAgICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjMycHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXInPlxyXG4gICAgICAgICAgICAgICAgICA8cD5OZXNzdW4gZWxlbWVudG8gZGEgdmlzdWFsaXp6YXJlLjwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+SWwgZmlsdHJvIGFwcGxpY2F0byBub24gY29uc2VudGUgbGEgc2VsZXppb25lIGRpIGFsY3VuIHJpc3VsYXRvLjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc25hcHNob3QuaXRlbXM7IHRyYWNrIGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyKT1cIml0ZW0uaXNPdmVyID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIml0ZW0uaXNPdmVyID0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDE1cHg7IHBhZGRpbmctdG9wOjI0cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tYWNjZW50XCI+e3tpdGVtLmdyb3VwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMHB4XCIgZnhGaWxsIGNsYXNzPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpdGVtLXNlbGVjdGVkJzogc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRzY3JlZW4uaXNUb3VjaGFibGUgfHwgaXRlbS5pc092ZXIgfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKGl0ZW0sIGl0ZW0uZG9jdW1lbnRJZCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIxMDBcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghaXRlbS5pc0p1cmlzICYmIGl0ZW0ubW9kZWwgIT0gOSAmJiAoaXRlbS5tb2RlbCAhPSAxMSB8fCBzbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZSA9PSAyKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5tb2RlbE5hbWUgJiYgaXRlbS5tb2RlbE5hbWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZCBpdGVtLWdyZXllZC0xIHVwcGVyY2FzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubW9kZWxOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWl0ZW0uaXNKdXJpcyAmJiBpdGVtLm1vZGVsID09IDIyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0zIGl0ZW0tbGluZS1yZWFkIGl0ZW0tZ3JleWVkLTEgdXBwZXJjYXNlXCI+QVJTXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJMT0c8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5hdXRob3IgJiYgaXRlbS5vcmlnaW4gPT09ICdMUicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxpbmUgaXRlbS1saW5lLTMgaXRlbS1saW5lLXJlYWQgaXRlbS1ncmV5ZWQtMSB1cHBlcmNhc2VcIj57e2l0ZW0uYXV0aG9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxpbmUgaXRlbS1saW5lLTIgaXRlbS1saW5lLXJlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW4oaXRlbS5kb2N1bWVudElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQXByaSBkb2N1bWVudG8gJyArIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxOiBpdGVtLnRpdGxlMilcIj57e2l0ZW0udGl0bGUxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnRpdGxlMSA6IGl0ZW0udGl0bGUyfX08L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5wYXJ0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tYmFkZ2VcIj5QQVJURSB7e2l0ZW0ucGFydH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGl0bGUxICYmIGl0ZW0udGl0bGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0yIGl0ZW0tbGluZS1yZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS50aXRsZTJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0ub3JpZ2luRGVzY3JpcHRpb24gKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0zIGl0ZW0tbGluZS1yZWFkIGl0ZW0tZ3JleWVkLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLm9yaWdpbkRlc2NyaXB0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmFuY2hvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZS1ibG9jay10aXRsZVwiPkRFVFRBR0xJTzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChhIG9mIGl0ZW0uYW5jaG9yczsgdHJhY2sgYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoYS51cmkgJiYgYS50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGlua1wiIHN0eWxlPSdsaW5lLWhlaWdodDogMThweDsgbWFyZ2luLXJpZ2h0OiA4cHgnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4oYS5kb2N1bWVudElkICsgJyMnICsgYS51cmkpXCIgW21hdFRvb2x0aXBdPVwiYS50aXRsZVwiPnt7YS50ZXh0fX0gQGlmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEudmVyeVJlbGV2YW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT0nZm9udC1zaXplOngtc21hbGw7IGhlaWdodDogMTBweDsgd2lkdGg6MTBweCcgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vbHRvIHJpbGV2YW50ZVwiPnRodW1iX3VwX2FsdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFhLnVyaSAmJiBhLnRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9J2xpbmUtaGVpZ2h0OiAxOHB4OyBtYXJnaW4tcmlnaHQ6IDhweCAnPnt7YS50ZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS52YWxpZGl0eVN0YXRlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmVkOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDJweCA0cHg7IGJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyOiAxcHggc29saWQgcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnZhbGlkaXR5RGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmlzT3ZlciB8fCBpdGVtLmlzTWVudU9wZW4gfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIk1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7aXRlbTogaXRlbX1cIiAoY2xpY2spPVwiaXRlbS5pc01lbnVPcGVuID0gdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPGRpdiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZFwiIFtzdHlsZS5sZWZ0XT1cImNvbnRleHRNZW51UG9zaXRpb24ueFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3BdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7aXRlbTogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG1hdC1tZW51ICNjb250ZXh0TWVudT1cIm1hdE1lbnVcIiAoY2xvc2VkKT1cInVwZGF0ZU1lbnVCdXR0b25zVmlzaWJpbGl0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2xpcHBlci1kb2N1bWVudC1tZW51IFtwYXJlbnRdPVwidGhpc1wiIFtpdGVtXT1cIml0ZW1cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIiBbbGVuZ3RoXT1cInNuYXBzaG90LnRvdGFsXCJcclxuICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjI1XCIgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIiAocGFnZSk9XCJmZXRjaE1vcmUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXNpZGVuYXYtY29udGVudD5cclxuICA8L21hdC1zaWRlbmF2LWNvbnRhaW5lcj5cclxuPC9kaXY+Il19
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvY2xpcHBlci51aS91aS9yZWZlcmVuY2VzL3JlZmVyZW5jZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvcmVmZXJlbmNlcy9yZWZlcmVuY2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFnQixlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0csT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBaUIsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQ0wsa0JBQWtCLEVBR25CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXhGLE9BQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDakcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUcsT0FBTyxFQUFHLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJ4RCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsNEJBQTRCO0lBb0IxRSxZQUNTLE9BQXNCLEVBQ3RCLFFBQXdCLEVBQ3hCLE9BQXNCLEVBQ3JCLEtBQW9CLEVBQ3BCLFNBQW1ELEVBQ2xDLEtBQVU7UUFFbkMsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQVBsQixZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQWU7UUFDckIsVUFBSyxHQUFMLEtBQUssQ0FBZTtRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUEwQztRQWxCckQsU0FBSSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRWxELFVBQUssR0FBVyxJQUFJLENBQUM7UUFDckIsY0FBUyxHQUFpQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbEYsYUFBUSxHQUE4QixJQUFJLENBQUM7UUFDM0MsZUFBVSxHQUFXLE1BQU0sQ0FBQztRQUM1QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixrQkFBYSxHQUFXLElBQUksQ0FBQztRQUM3Qix3QkFBbUIsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzdDLE9BQUUsR0FBVyxJQUFJLENBQUM7UUFDbEIsV0FBTSxHQUFXLElBQUksQ0FBQztRQUN0QixTQUFJLEdBQVEsSUFBSSxDQUFDO1FBWWYsbUJBQW1CO1FBQ25CLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLEtBQUssa0JBQWtCLENBQUMsZ0JBQWdCO2dCQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLDZDQUE2QyxDQUFDO2dCQUMzRCxNQUFNO1lBQ1IsS0FBSyxrQkFBa0IsQ0FBQyxpQkFBaUI7Z0JBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsNENBQTRDLENBQUM7Z0JBQzFELE1BQU07WUFDUixLQUFLLGtCQUFrQixDQUFDLGFBQWE7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ2hDLE1BQU07WUFDUixLQUFLLGtCQUFrQixDQUFDLGNBQWM7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUM7Z0JBQ25DLE1BQU07WUFDUixLQUFLLGtCQUFrQixDQUFDLFFBQVE7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQTBCLENBQUM7Z0JBQ3hDLE1BQU07UUFDVixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFFL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBRTNCLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRztnQkFDZCxZQUFZLEVBQUUsRUFBRTthQUNqQixDQUFDO1FBQ0osSUFDRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUk7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxFQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUc7Z0JBQzNCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDcEIsZUFBZSxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsY0FBYztnQkFDakUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxjQUFjO2dCQUNwRSxLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLEVBQUUsRUFBRTthQUNWLENBQUM7WUFFRixpQkFBaUI7WUFDakIsUUFBUSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFFNUMsYUFBYTtZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLCtDQUErQztnQkFDL0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLEtBQUs7YUFDUCxZQUFZLEVBQUU7YUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQixTQUFTLENBQUMsQ0FBQyxPQUFzQixFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzdCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFOUIsOEJBQThCO1FBQzlCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxjQUFjO1lBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxnQ0FBZ0M7WUFDaEMsSUFBSSxJQUFJLENBQUMsYUFBYTtnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZO3FCQUM1QixTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsQ0FBQyxDQUFDLENBQUM7WUFFUCxrQ0FBa0M7WUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO3dCQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDN0UsQ0FBQzt5QkFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVc7d0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTt3QkFDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTt3QkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBaUIsRUFBRSxJQUFTO1FBQ3hDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQ3JDLHVCQUF1QixDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CO1FBQ2pCLFFBQVEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFxQjtRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUNyQyx1QkFBdUIsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILDJCQUEyQjtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNyQyxDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0MsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUN4QixJQUFJLEVBQUUsS0FBSyxDQUFDO2dCQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxzQkFBc0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLElBQ0UsSUFBSSxDQUFDLFlBQVk7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztnQkFDM0IsSUFBSSxDQUFDLGFBQWE7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTtnQkFFekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLElBQ0UsSUFBSSxDQUFDLFlBQVk7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztnQkFDM0IsSUFBSSxDQUFDLGFBQWE7Z0JBQ2xCLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBRWxCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLGlCQUEwQixLQUFLO1FBQ3pDLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUM7UUFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLElBQVM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDcEMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPO1FBQ3ZDLElBQUksQ0FBQyxPQUFPO2FBQ1QsT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQzthQUNsRCxpQkFBaUIsQ0FBQyxPQUFPO2FBQ3pCLFNBQVMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFFBQVE7cUJBQ1YsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7cUJBQzFCLFNBQVMsQ0FBQztvQkFDVCxJQUFJLEVBQUUsQ0FBQyxFQUFPLEVBQUUsRUFBRTt3QkFDaEIsTUFBTSxDQUNKLEVBQUUsRUFDRixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQ3ZELENBQUM7b0JBQ0osQ0FBQztvQkFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO3dCQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzNCLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFZLElBQUk7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxZQUFxQixLQUFLO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3BDLElBQUksU0FBUztZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZTtZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsY0FBYyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGtCQUFrQjtZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsY0FBYyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7YUFDakQsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDekMsQ0FBQztvQkFDSixNQUFNLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTt3QkFDckMsSUFDRSxDQUFDLENBQUMsS0FBSyxLQUFLLGtCQUFrQixDQUFDLFdBQVc7NEJBQzFDLENBQUMsQ0FBQyxLQUFLLEtBQUssa0JBQWtCLENBQUMsZUFBZSxFQUM5QyxDQUFDOzRCQUNELFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUNoQixLQUFLLGtCQUFrQixDQUFDLFdBQVc7b0NBQ2pDLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7b0NBQ2pDLE1BQU07Z0NBQ1IsS0FBSyxrQkFBa0IsQ0FBQyxlQUFlO29DQUNyQyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO29DQUNyQyxNQUFNOzRCQUNWLENBQUM7NEJBQ0QsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7Z0NBQ25CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztvQ0FBRSxDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbkQsQ0FBQzs0QkFDRCxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQ0FDbkIsQ0FBQyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0NBQzlDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO2dDQUN6QyxDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7Z0NBQzdDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7NEJBQy9CLENBQUM7d0JBQ0gsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dDQUNYLENBQUMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dDQUN0QyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0NBQ2hELENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7NEJBQ3ZCLENBQUM7NEJBQ0QsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0NBQ2QsSUFBSSxVQUFrQixDQUFDO2dDQUN2QixJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0NBQ3RCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0NBQzNCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFO3dDQUFFLE9BQU87b0NBQzFCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQzt3Q0FDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7NENBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQzt3Q0FDNUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7b0NBQ3RCLENBQUM7b0NBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQ0FDcEIsSUFBSSxLQUFLLEdBQUcsQ0FBQzt3Q0FBRSxLQUFLLElBQUksQ0FBQyxDQUFDO3lDQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDO3dDQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7eUNBQzFCLElBQUksS0FBSyxHQUFHLENBQUM7d0NBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztvQ0FDL0IsT0FBTyxDQUFDLElBQUksQ0FBQzt3Q0FDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7d0NBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3dDQUNkLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTt3Q0FDeEIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHO3dDQUNWLFlBQVksRUFBRSxLQUFLLEdBQUcsR0FBRztxQ0FDMUIsQ0FBQyxDQUFDO2dDQUNMLENBQUMsQ0FBQyxDQUFDO2dDQUNILENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOzRCQUN0QixDQUFDOzRCQUNELElBQUksQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDeEIsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLGdDQUFnQyxDQUFDO2dDQUN6RCxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQ0FDbkIsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7b0NBQ3JCLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztvQ0FDNUQsSUFBSSxZQUFZLEdBQUcsS0FBSyxFQUFFLENBQUM7d0NBQ3pCLENBQUMsQ0FBQyxtQkFBbUI7NENBQ25CLHFDQUFxQztnREFDckMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7Z0RBQ3BDLEdBQUcsQ0FBQztvQ0FDUixDQUFDO3lDQUFNLENBQUM7d0NBQ04sQ0FBQyxDQUFDLG1CQUFtQjs0Q0FDbkIsd0NBQXdDO2dEQUN4QyxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztnREFDcEMsR0FBRyxDQUFDO3dDQUNOLENBQUMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29DQUN0QixDQUFDO2dDQUNILENBQUM7NEJBQ0gsQ0FBQzs0QkFDRCxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQ0FDbkIsQ0FBQyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0NBQzlDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7NEJBQy9CLENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3JGLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUNuQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs0QkFDZixLQUFLLEdBQUcsSUFBSSxDQUFDO3dCQUNmLENBQUM7d0JBQ0QsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ2YsQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDM0MsSUFDRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLO2dDQUNoQyxrQkFBa0IsQ0FBQyxRQUFRO2dDQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLO29DQUNoQyxrQkFBa0IsQ0FBQyxrQkFBa0I7Z0NBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUs7b0NBQ2hDLGtCQUFrQixDQUFDLHFCQUFxQixFQUN4QyxDQUFDO2dDQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29DQUNoRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUM5QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29DQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0NBQ1YsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJOzZDQUN0QixTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs2Q0FDaEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQ0FDOUIsQ0FBQzs0QkFDSCxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBRUgsZ0JBQWdCO29CQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM1QixJQUFJLFNBQVM7NEJBQ1gsZ0JBQWdCOzRCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ25ELENBQUM7eUJBQU0sQ0FBQzt3QkFDTixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM3QixDQUFDO29CQUVELElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUzs0QkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQ25ELENBQUM7b0JBRUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLENBQU07UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsZUFBb0IsSUFBSTtRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUNwQyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztpQkFDekMsU0FBUyxDQUFDO2dCQUNULElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNWLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMvQyxJQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUzs0QkFDM0IsQ0FBQyxJQUFJLENBQUMsWUFBWTs0QkFDbEIsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJOzRCQUVoQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7OzRCQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDM0MsQ0FBQztvQkFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztnQkFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDakMsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUk7Z0JBQ3ZFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLEVBQVU7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7OEdBNWZVLDBCQUEwQixtS0EwQjNCLGVBQWU7a0dBMUJkLDBCQUEwQiw4RUEzQm5CLFdBQVcsQ0FBQyxZQUFZLEVBQUUsaWNDaEM5QyxvelhBa09NLDA1RkQ3TEUsVUFBVSxnaUdBQ1YsY0FBYyw4SEFDZCxlQUFlLHdVQUNmLGdCQUFnQiw0VEFDaEIsYUFBYSxtTEFFYixpQkFBaUIsOFdBQ2pCLFdBQVcsZ1dBQ1gsYUFBYSxxc0JBQ2IsY0FBYyw2UEFDZCw0QkFBNEIscU1BQzVCLGdCQUFnQix5R0FDaEIsT0FBTywwRUFDUCxjQUFjLHVpQ0FDZCxnQkFBZ0IsNllBQ2hCLG9CQUFvQiwwTkFDcEIsNEJBQTRCLDBHQUU1QixPQUFPLG1GQUNQLGtCQUFrQjs7MkZBR2IsMEJBQTBCO2tCQTVCdEMsU0FBUzsyQkFDQSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUUsY0FHaEMsSUFBSSxXQUNQO3dCQUNMLFVBQVU7d0JBQ1YsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFFYixpQkFBaUI7d0JBQ2pCLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixjQUFjO3dCQUNkLDRCQUE0Qjt3QkFDNUIsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixvQkFBb0I7d0JBQ3BCLDRCQUE0Qjt3QkFFNUIsT0FBTzt3QkFDUCxrQkFBa0I7cUJBQ3JCOzswQkE0QkEsTUFBTTsyQkFBQyxlQUFlO3lDQXhCRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNELFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDVyxXQUFXO3NCQUEzQyxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lZGlhQ2hhbmdlLCBNZWRpYU9ic2VydmVyIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1RpdGxlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIsIE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBEYXRlRm9ybWF0LCBTY3JlZW5TZXJ2aWNlLCBTZWxlY3RhYmxlTW9kZWwsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZUb2RheSwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJ1xyXG5pbXBvcnQgeyBDbGlwcGVyRG9jdW1lbnRCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vZG9jdW1lbnQvYmFzZS9kb2N1bWVudC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ2xpcHBlckRlZmluaXRpb25zLFxyXG4gIENsaXBwZXJTZXJ2aWNlLFxyXG4gIERvY3VtZW50UmVmZXJlbmNlU25hcHNob3RcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NsaXBwZXIuY29tbW9uJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2LCBNYXRTaWRlbmF2TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZmFjZXRzL3NlYXJjaC1mYWNldHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWknO1xyXG5pbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XHJcbmltcG9ydCB7IEV4dGVuZGVkTW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2V4dGVuZGVkJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2RvY3VtZW50LW1lbnUvZG9jdW1lbnQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyAgTmdTdHlsZSwgIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9mbGV4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgaG9zdDogeyAnQmluZCc6IFN5c3RlbVV0aWxzLmdlbmVyYXRlVVVJRCgpIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVmZXJlbmNlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9yZWZlcmVuY2VzLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIEZsZXhNb2R1bGUsXHJcbiAgICAgICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcclxuICAgICAgICBcclxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgICAgICBGb3Jtc01vZHVsZSxcclxuICAgICAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxyXG4gICAgICAgIENsaXBwZXJEb2N1bWVudE1lbnVDb21wb25lbnQsXHJcbiAgICAgICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgICAgICBOZ1N0eWxlLFxyXG4gICAgICAgIEV4dGVuZGVkTW9kdWxlLFxyXG4gICAgICAgIE1hdFNpZGVuYXZNb2R1bGUsXHJcbiAgICAgICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXHJcbiAgICAgICAgQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudCxcclxuICAgICAgICBcclxuICAgICAgICBOZ0NsYXNzLFxyXG4gICAgICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudCBleHRlbmRzIENsaXBwZXJEb2N1bWVudEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTaWRlbmF2JykgZmFjZXRzU2lkZW5hdiA6IE1hdFNpZGVuYXY7XHJcbiAgQFZpZXdDaGlsZCgnZmFjZXRzU2VhcmNoJykgZmFjZXRzU2VhcmNoIDogQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdwYWdpbmF0b3InKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XHJcbiAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnVUcmlnZ2VyJykgY29udGV4dE1lbnUhOiBNYXRNZW51VHJpZ2dlcjtcclxuXHJcbiAgcHJpdmF0ZSBfX2QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgdGl0bGU6IHN0cmluZyA9IG51bGw7XHJcbiAgc2VsZWN0aW9uOiBTZWxlY3RhYmxlTW9kZWw8YW55LCBzdHJpbmc+ID0gbmV3IFNlbGVjdGFibGVNb2RlbCh0cnVlLCAnZG9jdW1lbnRJZCcpO1xyXG4gIHNuYXBzaG90OiBEb2N1bWVudFJlZmVyZW5jZVNuYXBzaG90ID0gbnVsbDtcclxuICBmYWNldHNNb2RlOiBzdHJpbmcgPSAnc2lkZSc7XHJcbiAgZmFjZXRzQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29udGVudEhlaWdodDogbnVtYmVyID0gbnVsbDtcclxuICBjb250ZXh0TWVudVBvc2l0aW9uID0geyB4OiAnMHB4JywgeTogJzBweCcgfTtcclxuICBtcTogc3RyaW5nID0gbnVsbDtcclxuICBhbmNob3I6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbTogYW55ID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgJGRpYWxvZzogRGlhbG9nU2VydmljZSxcclxuICAgIHB1YmxpYyAkY2xpcHBlcjogQ2xpcHBlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgJHNjcmVlbjogU2NyZWVuU2VydmljZSxcclxuICAgIHByaXZhdGUgbWVkaWE6IE1lZGlhT2JzZXJ2ZXIsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBfZGF0YTogYW55XHJcbiAgKSB7XHJcbiAgICBzdXBlcigkZGlhbG9nLCAkY2xpcHBlcik7XHJcblxyXG4gICAgLy8gQ2hvb3NlIHRoZSB0aXRsZVxyXG4gICAgc3dpdGNoIChfZGF0YS5tb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX1JFRkVSRU5DRVNfSU46XHJcbiAgICAgICAgdGhpcy50aXRsZSA9ICdEb2N1bWVudGkgcmljaGlhbWF0aSBuZWxsZSBub3RlIG8gbmVsIHRlc3RvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fUkVGRVJFTkNFU19PVVQ6XHJcbiAgICAgICAgdGhpcy50aXRsZSA9ICdEb2N1bWVudGkgY2hlIHJpY2hpYW1hbm8gcXVlbGxvIGluIHZpc2lvbmUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX0lOOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnTW9kaWZpY2hlIHN1Yml0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX0NIQU5HRVNfT1VUOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnTW9kaWZpY2hlIGFwcG9ydGF0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX0pVUklTOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnR2l1cmlzcHJ1ZGVuemEgYXNzb2NpYXRhJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChfZGF0YS5hbmNob3JUaXRsZSkgdGhpcy50aXRsZSArPSAnIC0gJyArIF9kYXRhLmFuY2hvclRpdGxlO1xyXG5cclxuICAgIHRoaXMuYW5jaG9yID0gX2RhdGEuYW5jaG9yO1xyXG5cclxuICAgIC8vIFVzZSBzZXJ2aWNlIHNuYXBzaG90XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gJGNsaXBwZXIucmVmZXJlbmNlc1NuYXBzaG90O1xyXG4gICAgaWYgKCF0aGlzLnNuYXBzaG90KVxyXG4gICAgICB0aGlzLnNuYXBzaG90ID0ge1xyXG4gICAgICAgIHNlYXJjaFBhcmFtczoge30sXHJcbiAgICAgIH07XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGUgIT09IF9kYXRhLm1vZGUgfHxcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZG9jdW1lbnRJZCAhPT0gX2RhdGEuaWQgfHxcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYW5jaG9yICE9PSBfZGF0YS5hbmNob3JcclxuICAgICkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgICBtb2RlOiBfZGF0YS5tb2RlLFxyXG4gICAgICAgIG1vZGVsOiBfZGF0YS5tb2RlbCxcclxuICAgICAgICBhbmNob3I6IF9kYXRhLmFuY2hvcixcclxuICAgICAgICBkb2N1bWVudElkOiBfZGF0YS5pZCxcclxuICAgICAgICB1c2VNb2RpZmllckluZm86IF9kYXRhLm1vZGUgPT09IENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX09VVCxcclxuICAgICAgICByZXR1cm5Nb2RpZmllckluZm86IF9kYXRhLm1vZGUgIT09IENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX09VVCxcclxuICAgICAgICBmaXJzdDogMCxcclxuICAgICAgICBjb3VudDogMjUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBTdG9yZSBzbmFwc2hvdFxyXG4gICAgICAkY2xpcHBlci5yZWZlcmVuY2VzU25hcHNob3QgPSB0aGlzLnNuYXBzaG90O1xyXG5cclxuICAgICAgLy8gTmV3IHNlYXJjaFxyXG4gICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gRGlzcGxheSBjdXJyZW50IHNuYXBzaG90IGZhY2V0cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICB0aGlzLmRpc3BsYXlGYWNldHMoKTtcclxuICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgICB9LCAyNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBSZWFjdCB0byBtZWRpYSBxdWVyeSBjaGFuZ2VzXHJcbiAgICB0aGlzLm1lZGlhXHJcbiAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX2QkKSlcclxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlczogTWVkaWFDaGFuZ2VbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMubXEgPSBjaGFuZ2VzWzBdLm1xQWxpYXM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gd2luZG93IHNpemUgY2hhbmdlXHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX19kJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIHNpZGVuYXYgc3RhdGUgY2hhbmdlXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NpZGVuYXYpXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb25maWd1cmUgZmFjZXQgc2VhY2ggY29tcG9uZW50XHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaCkge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5mcm9tRGF0ZSA9IHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5jaGFuZ2VkSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudG9EYXRlID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFNlY3RvcilcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2VjdG9yID0gdGhpcy5mYWNldHNTZWFyY2guc2VjdG9yO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLnR5cGUgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFR5cGUpXHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnR5cGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50eXBlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLmF1dGhvciB8fCB0aGlzLmZhY2V0c1NlYXJjaC5jaGFuZ2VkQXV0aG9yKVxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5hdXRob3IgPSB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3I7XHJcbiAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2gucmVhc29uIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRSZWFzb24pXHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnJlYXNvbiA9IHRoaXMuZmFjZXRzU2VhcmNoLnJlYXNvbjtcclxuICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmFuY2hvciA9IHRoaXMuZmFjZXRzU2VhcmNoLmFuY2hvclxyXG4gICAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLmFuY2hvclxyXG4gICAgICAgICAgICA6IHRoaXMuYW5jaG9yO1xyXG4gICAgICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5fX2QkLm5leHQoKTtcclxuICAgIHRoaXMuX19kJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25Db250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudVBvc2l0aW9uLnggPSBldmVudC5jbGllbnRYICsgJ3B4JztcclxuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbi55ID0gZXZlbnQuY2xpZW50WSArICdweCc7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51Lm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH07XHJcbiAgICB0aGlzLmNvbnRleHRNZW51Lm9wZW5NZW51KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBkaWFsb2dcclxuICAgKi9cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuc2F2ZVNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBzY3JvbGwgcG9zaXRpb25cclxuICAgKi9cclxuICBzYXZlU2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICB0aGlzLiRjbGlwcGVyLnNjcm9sbGFibGUuc2F2ZVBvc2l0aW9uKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5kb2N1bWVudElkLFxyXG4gICAgICAnI3JlZmVyZW5jZXNfY29udGFpbmVyJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVmZXJlbmNlc19jb250YWluZXInKS5zY3JvbGxUbygwLCAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCkge1xyXG4gICAgdGhpcy4kY2xpcHBlci5zY3JvbGxhYmxlLnRyeVJlc3RvcmVQb3NpdGlvbihcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZG9jdW1lbnRJZCxcclxuICAgICAgJyNyZWZlcmVuY2VzX2NvbnRhaW5lcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbWVudSBidXR0b25zIHZpc2liaWxpdHkgd2hlbiB0aGUgbWVudSBpcyBjbG9zZWRcclxuICAgKi9cclxuICB1cGRhdGVNZW51QnV0dG9uc1Zpc2liaWxpdHkoKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zLmZvckVhY2goKG46IGFueSkgPT4ge1xyXG4gICAgICBuLmlzTWVudU9wZW4gPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRqdXN0IHZpZXdcclxuICAgKi9cclxuICBhZGp1c3RWaWV3KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB2aWV3XHJcbiAgICovXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIC8vIFVwZGF0ZSByb3V0ZXIgaGVpZ2h0XHJcbiAgICBsZXQgYSA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgIGxldCBiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaXBwZXItcmVmZXJlbmNlcy1maXhlZCcpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCFhIHx8ICFiIHx8IGEgPT09IDApIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICBsZXQgaGIgPSBiLmNsaWVudEhlaWdodDtcclxuICAgICAgaWYgKGhiID09PSAwKSB0aGlzLmFkanVzdFZpZXcoKTtcclxuICAgICAgdGhpcy5jb250ZW50SGVpZ2h0ID0gYSAtIChoYiArIDEyKTtcclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgc2lkZW5hdiB2aXNpYmlsaXR5XHJcbiAgICogQHBhcmFtIG1xIDogdGhlIGN1cnJlbnQgbWVkaWEgcXVlcnlcclxuICAgKi9cclxuICB1cGRhdGVGYWNldHNWaXNpYmlsaXR5KCkge1xyXG4gICAgaWYgKHRoaXMubXEgPT09ICd4cycpIHtcclxuICAgICAgdGhpcy5mYWNldHNNb2RlID0gJ292ZXInO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYub3BlbmVkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmFjZXRzTW9kZSA9ICdzaWRlJztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guaGFzRmFjZXRzICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2ICYmXHJcbiAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYudG9nZ2xlKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBmYWNldHNTaWRlbmF2IHNpZGViYXJcclxuICAgKi9cclxuICBmYWNldHNPcGVuKCkge1xyXG4gICAgdGhpcy5mYWNldHNDbG9zZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBmYWNldHMgc2lkZWJhclxyXG4gICAqIEBwYXJhbSBjbG9zZWRNYW51YWxseSA6IHR1cmUgaWYgZmFjZXRzIGhhcyBiZWVuIGNsb3NlZCBtYW51YWxseSBieSBjbGlja2luZyB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZmFjZXRzQ2xvc2UoY2xvc2VkTWFudWFsbHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubXEgIT09ICd4cycpIHRoaXMuZmFjZXRzQ2xvc2VkID0gY2xvc2VkTWFudWFsbHk7XHJcbiAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBhIGRvY3VtZW50IGluIHBkZiBmb3JtYXRcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudCB0byBleHBvcnRcclxuICAgKi9cclxuICBleHBvcnRQZGYoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuJGNsaXBwZXIubG9nZ2VkSW4pIHJldHVybjtcclxuICAgIGlmICghaXRlbSB8fCBpdGVtLm1vZGVsID09PSAxMSkgcmV0dXJuO1xyXG4gICAgdGhpcy4kZGlhbG9nXHJcbiAgICAgIC5jb25maXJtKFwiQ29uZmVybWkgbCdlc3BvcnRhemlvbmU/XCIsICdBdHRlbnppb25lIScpXHJcbiAgICAgIC5jb21wb25lbnRJbnN0YW5jZS5jaG9vc2VuXHJcbiAgICAgIC5zdWJzY3JpYmUoKHI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyLnJlc3VsdCA9PT0gJ29rJykge1xyXG4gICAgICAgICAgdGhpcy4kZGlhbG9nLmJ1c3koJ0VzcG9ydGF6aW9uZSBpbiBjb3Jzby4uLicpO1xyXG4gICAgICAgICAgdGhpcy4kY2xpcHBlclxyXG4gICAgICAgICAgICAuZXhwb3J0UGRmKGl0ZW0uZG9jdW1lbnRJZClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKHIyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHNhdmVBcyhcclxuICAgICAgICAgICAgICAgICAgcjIsXHJcbiAgICAgICAgICAgICAgICAgIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxIDogaXRlbS5kb2N1bWVudElkKSArICcucGRmJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRkaWFsb2cuY2xlYXJCdXN5KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBkb2N1bWVudCBsaW5rcyBieSBlbWFpbFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gYWRkXHJcbiAgICovXHJcbiAgc2VuZFRvKGl0ZW06IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2VuZEl0ZW1zVG8oaXRlbSA/IFtpdGVtXSA6IHRoaXMuc2VsZWN0aW9uLmFsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtIGEgc2VhcmNoXHJcbiAgICogQHBhcmFtIG5ld1NlYXJjaDogdHJ1ZSBpZiBpcyBhIG5ldyBzZWFyY2hcclxuICAgKi9cclxuICBmZXRjaChuZXdTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCF0aGlzLiRjbGlwcGVyLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICBpZiAobmV3U2VhcmNoKSB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5maXJzdCA9IDA7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy51c2VNb2RpZmllckluZm8gPVxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fQ0hBTkdFU19PVVQ7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5yZXR1cm5Nb2RpZmllckluZm8gPVxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlICE9PSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fQ0hBTkdFU19PVVQ7XHJcbiAgICB0aGlzLiRkaWFsb2cuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy4kY2xpcHBlci5yZWZlcmVuY2VzKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHRoaXMuJGRpYWxvZy5lcnJvcihyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gc3RhcnRPZlRvZGF5KCk7XHJcbiAgICAgICAgICAgIGxldCBncm91cCA9ICcnOyAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnRvdGFsID0gci52YWx1ZT8udG90YWwgPz8gMDtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcyA9IHIudmFsdWU/Lml0ZW1zID8/IFtdOyAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NBREVOWkEgfHxcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJEZWZpbml0aW9ucy5ETV9TRUdOQUxBWklPTkVcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAobi5tb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0FERU5aQTpcclxuICAgICAgICAgICAgICAgICAgICBuLm9yaWdpbkRlc2NyaXB0aW9uID0gJ1NjYWRlbnphJztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0VHTkFMQVpJT05FOlxyXG4gICAgICAgICAgICAgICAgICAgIG4ub3JpZ2luRGVzY3JpcHRpb24gPSAnU2VnbmFsYXppb25lJztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nSW5mbykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBuLmV4cGlyaW5nSW5mby5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSBuLmRlc2NyaXB0aW9uID0gcGFydHNbMl07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5leHBpcmluZ0RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgbi5kYXRlID0gc3RhcnRPZkRheShuZXcgRGF0ZShuLmV4cGlyaW5nRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKG4uZGF0ZSwgMTUpKVxyXG4gICAgICAgICAgICAgICAgICBuLmlzRXhwaXJpbmcgPSB0b2RheSA8PSBuLmRhdGUgJiYgdG9kYXkgPj0gZDtcclxuICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBuLmRhdGUgPCB0b2RheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKHN0YXJ0T2ZUb2RheSgpLCA3KSlcclxuICAgICAgICAgICAgICAgICAgbi5pc05ldyA9IG4uZGF0ZSA+IGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5hbmNob3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JUeXBlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT09IDIwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSAhPT0gYW5jaG9yVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSA+PSAzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goeyB0ZXh0OiBhLnR5cGVEZXNjcmlwdGlvbiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclR5cGUgPSBhLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY29yZSA9IGEuc2NvcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gNykgc2NvcmUgLT0gNztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29yZSA+IDUpIHNjb3JlIC09IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAzKSBzY29yZSAtPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGEuZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHVyaTogYS51cmksXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJ5UmVsZXZhbnQ6IHNjb3JlID4gMC42LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzID0gYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLnZhbGlkaXR5U3RhdGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9ICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSc7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG4udmFsaWRVbnRpbERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmluZ0RhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4udmFsaWRVbnRpbERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmdEYXRlIDwgdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSBkYWwgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZXhwaXJpbmdEYXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcuJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi52YWxpZGl0eURlc2NyaXB0aW9uID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lsIGRvY3VtZW50byBub24gc2Fyw6AgcGnDuSB2aWdlbnRlIGRhbCAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShleHBpcmluZ0RhdGUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gbi5kYXRlIDwgdG9kYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCB5ZWFyID0gU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShuLmRhdGUsIERhdGVGb3JtYXQuTG9uZ01vbnRoQW5kWWVhcikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICBpZiAoZ3JvdXAgIT09IHllYXIpIHtcclxuICAgICAgICAgICAgICAgIG4uZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobi50YXhvbm9teSkge1xyXG4gICAgICAgICAgICAgICAgbi50YXhvbm9teU5vZGVzID0gbi50YXhvbm9teS5zcGxpdCgnXFxyXFxuJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fR1VJREEgfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5ETV9HVUlEQV9OT1JNQVRJVkEgfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0hFREFfQURFTVBJTUVOVElcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4udGF4b25vbXlOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gbi50YXhvbm9teU5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwID0gbm9kZS5pbmRleE9mKCc+Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgICAgbi50YXhvbm9teU5vZGVzW2ldID0gbm9kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHAgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFw+L2dpLCAnID4gJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gSGFuZGxlIGZhY2V0c1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoKVxyXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZhY2V0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmFjZXRzKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5yZXNldCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobmV3U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLiRkaWFsb2cuY2xlYXJCdXN5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBuZXcgcGFnZSByZXN1bHRcclxuICAgKiBAcGFyYW0gZSA6IHRoZSBNYXRQYWdpbmF0b3IgUGFnZUV2ZW50IGRhdGFcclxuICAgKi9cclxuICBmZXRjaE1vcmUoZTogYW55KSB7XHJcbiAgICBsZXQgZmlyc3QgPSBlLnBhZ2VJbmRleCAqIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNvdW50O1xyXG4gICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZmlyc3QgPSBmaXJzdDtcclxuICAgIHRoaXMuZmV0Y2goKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmYWNldHNcclxuICAgKiBAcGFyYW0gc2VhcmNoUGFyYW1zIDogdGhlIGN1cnJlbnQgc2VhcmNoIHBhcmFtcyB0byB1c2UgdG8gZ2F0aGVyIGZhY2V0cyBvciBudWxsIHRvIHVzZSBjdXJyZW50IHNuYXBzaG90XHJcbiAgICovXHJcbiAgZGlzcGxheUZhY2V0cyhzZWFyY2hQYXJhbXM6IGFueSA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy4kY2xpcHBlci5sb2dnZWRJbikgcmV0dXJuO1xyXG4gICAgaWYgKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4kY2xpcHBlci5yZWZlcmVuY2VzRmFjZXRzKHNlYXJjaFBhcmFtcylcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC51cGRhdGUoci52YWx1ZS5mYWNldHMsIG51bGwpO1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmhhc0ZhY2V0cyAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1xICE9PSAneHMnXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYWNldHNPcGVuKCk7XHJcbiAgICAgICAgICAgICAgZWxzZSB0aGlzLmZhY2V0c0Nsb3NlKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSB0aGlzLmZhY2V0c1NlYXJjaDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cykge1xyXG4gICAgICB0aGlzLmZhY2V0c1NlYXJjaC5yZXN0b3JlRnJvbSh0aGlzLnNuYXBzaG90LmZhY2V0cyk7XHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgIXRoaXMuZmFjZXRzQ2xvc2VkICYmIHRoaXMubXEgIT09ICd4cycpXHJcbiAgICAgICAgdGhpcy5mYWNldHNPcGVuKCk7XHJcbiAgICAgIGVsc2UgdGhpcy5mYWNldHNDbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgY3VycmVudCBkaWFsb2cgYW5kIHJldHVybiB0aGUgaWQgdG8gbmF2aWdhdGUgdG9cclxuICAgKiBAcGFyYW0gaWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBvcGVuKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgaWQ6IGlkIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiY2xpcHBlci1yZWZlcmVuY2VzLWZpeGVkXCI+XHJcbiAgPGRpdiBpZD1cImNsaXBwZXItcmVmZXJlbmNlcy1oZWFkZXJcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7dGl0bGV9fSA8L2gyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkNoaXVkaVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2hpdWRpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4RmlsbCBzdHlsZT1cInBhZGRpbmc6IDAgMCAwIDE1cHg7XCI+XHJcbiAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09IDEpIHtcclxuICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiBuYW1lPVwiZXhjbHVkZVRleHRSZWZlcmVuY2VzXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5leGNsdWRlVGV4dFJlZmVyZW5jZXNcIiAoY2hhbmdlKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgTW9zdHJhIHNvbG8gc2UgY2l0YXRpIG5lbGxlIG5vdGU8L21hdC1jaGVja2JveD5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09IDIpIHtcclxuICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiBuYW1lPVwiZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMuZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiIChjaGFuZ2UpPVwiZmV0Y2godHJ1ZSlcIj5cclxuICAgICAgICBNb3N0cmEgc29sbyBzZSBjaXRhbm8gbmVsIHRlc3RvIGlsIGRvY3VtZW50b1xyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIkF6aW9uaSBkYSBlc2VndWlyZSBzdWdsaSBlbGVtZW50aSBzZWxlemlvbmF0aVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBvcHppb25pIHBlciBlbGVtZW50aSBzZWxlemlvbmF0aSdcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVNlbGVjdGlvbnNcIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIFttYXRCYWRnZV09XCJzZWxlY3Rpb24uYWxsLmxlbmd0aFwiXHJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCI+cGxheWxpc3RfYWRkX2NoZWNrPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxjbGlwcGVyLWRvY3VtZW50LW1lbnUgW3BhcmVudF09XCJ0aGlzXCIgW3NlbGVjdGlvblNvdXJjZV09XCJzZWxlY3Rpb25cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIEBpZiAoZmFjZXRzU2VhcmNoICYmIGZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgZmFjZXRzU2lkZW5hdiAmJiAoIWZhY2V0c1NpZGVuYXYub3BlbmVkIHx8IGZhY2V0c0Nsb3NlZCkpIHtcclxuICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXRUb29sdGlwPVwiQWZmaW5hIHJpY2VyY2FcIiBhcmlhLWxhYmVsPVwiJ0FmZmluYSByaWNlcmNhJ1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmFjZXRzT3BlbigpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+bWVudV9vcGVuPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgc3R5bGU9XCJwYWRkaW5nOjAgMCAwIDE1cHhcIiBbbmdTdHlsZV09XCJ7J21pbi1oZWlnaHQucHgnOiBjb250ZW50SGVpZ2h0fVwiPlxyXG4gIDxtYXQtc2lkZW5hdi1jb250YWluZXIgW25nU3R5bGVdPVwieydoZWlnaHQucHgnOiBjb250ZW50SGVpZ2h0fVwiPlxyXG4gICAgPG1hdC1zaWRlbmF2ICNmYWNldHNTaWRlbmF2IHBvc2l0aW9uPVwiZW5kXCIgYXV0b0ZvY3VzPVwiZmFsc2VcIiBvcGVuZWQ9XCJmYWxzZVwiIG1vZGU9XCJ7e2ZhY2V0c01vZGV9fVwiXHJcbiAgICAgIGNsYXNzPVwic2lkZW5hdiBzaWRlbmF2LWZhY2V0c1wiPlxyXG4gICAgICBAaWYgKGZhY2V0c1NlYXJjaC5idXN5KSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6NXB4XCI+XHJcbiAgICAgICAgICBAaWYgKGZhY2V0c1NlYXJjaC5idXN5KSB7XHJcbiAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBjbGFzcz1cInNpZGVuYXYtbG9hZGVyXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCI2NHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGaWxsIGNsYXNzPVwic2lkZW5hdi10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBmeExheW91dEFsaWduPVwic3RhcnRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpZGVuYXYtdGl0bGVcIj5BZmZpbmEgcmljZXJjYTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmFjZXRzQ2xvc2UodHJ1ZSlcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiPlxyXG4gICAgICAgICAgPGNsaXBwZXItc2VhcmNoLWZhY2V0cyAjZmFjZXRzU2VhcmNoPjwvY2xpcHBlci1zZWFyY2gtZmFjZXRzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXNpZGVuYXY+XHJcbiAgICA8bWF0LXNpZGVuYXYtY29udGVudD5cclxuICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6IGNvbnRlbnRIZWlnaHQgfVwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGw+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGlkPVwicmVmZXJlbmNlc19jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW5cIj5cclxuICAgICAgICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjMycHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXInPlxyXG4gICAgICAgICAgICAgICAgICA8cD5OZXNzdW4gZWxlbWVudG8gZGEgdmlzdWFsaXp6YXJlLjwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+SWwgZmlsdHJvIGFwcGxpY2F0byBub24gY29uc2VudGUgbGEgc2VsZXppb25lIGRpIGFsY3VuIHJpc3VsYXRvLjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc25hcHNob3QuaXRlbXM7IHRyYWNrIGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyKT1cIml0ZW0uaXNPdmVyID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIml0ZW0uaXNPdmVyID0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDE1cHg7IHBhZGRpbmctdG9wOjI0cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tYWNjZW50XCI+e3tpdGVtLmdyb3VwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMHB4XCIgZnhGaWxsIGNsYXNzPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpdGVtLXNlbGVjdGVkJzogc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRzY3JlZW4uaXNUb3VjaGFibGUgfHwgaXRlbS5pc092ZXIgfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKGl0ZW0sIGl0ZW0uZG9jdW1lbnRJZCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIxMDBcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghaXRlbS5pc0p1cmlzICYmIGl0ZW0ubW9kZWwgIT0gOSAmJiAoaXRlbS5tb2RlbCAhPSAxMSB8fCBzbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZSA9PSAyKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5tb2RlbE5hbWUgJiYgaXRlbS5tb2RlbE5hbWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZCBpdGVtLWdyZXllZC0xIHVwcGVyY2FzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubW9kZWxOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWl0ZW0uaXNKdXJpcyAmJiBpdGVtLm1vZGVsID09IDIyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0zIGl0ZW0tbGluZS1yZWFkIGl0ZW0tZ3JleWVkLTEgdXBwZXJjYXNlXCI+QVJTXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJMT0c8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5hdXRob3IgJiYgaXRlbS5vcmlnaW4gPT09ICdMUicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxpbmUgaXRlbS1saW5lLTMgaXRlbS1saW5lLXJlYWQgaXRlbS1ncmV5ZWQtMSB1cHBlcmNhc2VcIj57e2l0ZW0uYXV0aG9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxpbmUgaXRlbS1saW5lLTIgaXRlbS1saW5lLXJlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW4oaXRlbS5kb2N1bWVudElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQXByaSBkb2N1bWVudG8gJyArIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxOiBpdGVtLnRpdGxlMilcIj57e2l0ZW0udGl0bGUxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnRpdGxlMSA6IGl0ZW0udGl0bGUyfX08L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5wYXJ0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tYmFkZ2VcIj5QQVJURSB7e2l0ZW0ucGFydH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGl0bGUxICYmIGl0ZW0udGl0bGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0yIGl0ZW0tbGluZS1yZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS50aXRsZTJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0ub3JpZ2luRGVzY3JpcHRpb24gKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0zIGl0ZW0tbGluZS1yZWFkIGl0ZW0tZ3JleWVkLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLm9yaWdpbkRlc2NyaXB0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmFuY2hvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZS1ibG9jay10aXRsZVwiPkRFVFRBR0xJTzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChhIG9mIGl0ZW0uYW5jaG9yczsgdHJhY2sgYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoYS51cmkgJiYgYS50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGlua1wiIHN0eWxlPSdsaW5lLWhlaWdodDogMThweDsgbWFyZ2luLXJpZ2h0OiA4cHgnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4oYS5kb2N1bWVudElkICsgJyMnICsgYS51cmkpXCIgW21hdFRvb2x0aXBdPVwiYS50aXRsZVwiPnt7YS50ZXh0fX0gQGlmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEudmVyeVJlbGV2YW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT0nZm9udC1zaXplOngtc21hbGw7IGhlaWdodDogMTBweDsgd2lkdGg6MTBweCcgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vbHRvIHJpbGV2YW50ZVwiPnRodW1iX3VwX2FsdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFhLnVyaSAmJiBhLnRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9J2xpbmUtaGVpZ2h0OiAxOHB4OyBtYXJnaW4tcmlnaHQ6IDhweCAnPnt7YS50ZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS52YWxpZGl0eVN0YXRlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmVkOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDJweCA0cHg7IGJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyOiAxcHggc29saWQgcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnZhbGlkaXR5RGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmlzT3ZlciB8fCBpdGVtLmlzTWVudU9wZW4gfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIk1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7aXRlbTogaXRlbX1cIiAoY2xpY2spPVwiaXRlbS5pc01lbnVPcGVuID0gdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPGRpdiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZFwiIFtzdHlsZS5sZWZ0XT1cImNvbnRleHRNZW51UG9zaXRpb24ueFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3BdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7aXRlbTogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG1hdC1tZW51ICNjb250ZXh0TWVudT1cIm1hdE1lbnVcIiAoY2xvc2VkKT1cInVwZGF0ZU1lbnVCdXR0b25zVmlzaWJpbGl0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2xpcHBlci1kb2N1bWVudC1tZW51IFtwYXJlbnRdPVwidGhpc1wiIFtpdGVtXT1cIml0ZW1cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIiBbbGVuZ3RoXT1cInNuYXBzaG90LnRvdGFsXCJcclxuICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjI1XCIgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIiAocGFnZSk9XCJmZXRjaE1vcmUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXNpZGVuYXYtY29udGVudD5cclxuICA8L21hdC1zaWRlbmF2LWNvbnRhaW5lcj5cclxuPC9kaXY+Il19