@arsedizioni/ars-utils 18.1.31 → 18.1.33

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 (38) 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/credentials/credentials-dialog.component.mjs +3 -3
  12. package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +3 -3
  13. package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +3 -3
  14. package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +3 -3
  15. package/esm2022/ui/ui/services/ui.service.mjs +2 -2
  16. package/esm2022/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +16 -14
  17. package/esm2022/ui.application/ui/components/file-input/file-input.component.mjs +32 -54
  18. package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +3 -3
  19. package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +3 -3
  20. package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +3 -3
  21. package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +3 -3
  22. package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +3 -3
  23. package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +3 -3
  24. package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +3 -3
  25. package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +3 -3
  26. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +14 -14
  27. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  28. package/fesm2022/arsedizioni-ars-utils-help.mjs +2 -2
  29. package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
  30. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +62 -82
  31. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  32. package/fesm2022/arsedizioni-ars-utils-ui.mjs +13 -13
  33. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  34. package/package.json +12 -12
  35. package/styles/ui.scss +11 -3
  36. package/ui/ui/services/ui.service.d.ts +2 -2
  37. package/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.d.ts +4 -4
  38. package/ui.application/ui/components/file-input/file-input.component.d.ts +22 -29
@@ -1166,7 +1166,7 @@ export class ClipperBrowserDialogComponent extends ClipperDocumentBaseComponent
1166
1166
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperBrowserDialogComponent, deps: [{ token: i1.ApplicationDialogService }, { token: i2.ClipperService }, { token: i3.ScreenService }, { token: i3.BroadcastService }, { token: i4.MatDialogRef }, { token: i5.MediaObserver }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
1167
1167
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: ClipperBrowserDialogComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "Bind": SystemUtils.generateUUID() } }, providers: [
1168
1168
  MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER
1169
- ], viewQueries: [{ propertyName: "facetsSidenav", first: true, predicate: ["facetsSidenav"], descendants: true }, { propertyName: "facetsSearch", first: true, predicate: ["facetsSearch"], descendants: true }, { propertyName: "last15Days", first: true, predicate: ["last15Days"], 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-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (data.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\">\r\n @if ($clipper.bag.length > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"$clipper.bag.length\" matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\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 <nav mat-tab-nav-bar mat-stretch-tabs [tabPanel]=\"tabPanel1\">\r\n <a mat-tab-link (click)=\"dialogTab = 1\" [active]=\"dialogTab === 1\" [disabled]=\"!$clipper.loggedIn\">Ricerca</a>\r\n <a mat-tab-link (click)=\"showHome()\" [active]=\"dialogTab === 2\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>update</mat-icon>\r\n <span fxHide.xs style=\"margin-left: 8px\"> Ultimi 15 giorni</span>\r\n </a>\r\n </nav>\r\n <mat-tab-nav-panel #tabPanel1></mat-tab-nav-panel>\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"100\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"snapshot.searchParams.number\" #number=\"ngModel\" name=\"number\"\r\n maxlength=\"10\" (keyup.Enter)=\"fetch(true)\">\r\n @if (snapshot.searchParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"snapshot.searchParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"snapshot.searchParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (snapshot.searchParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"snapshot.searchParams.text\"\r\n maxlength=\"200\" (keyup.Enter)=\"search()\" autofocus />\r\n @if (snapshot.searchParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end\" fxFill>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"search()\" color=\"primary\"\r\n [attr.aria-label]=\"'Avvia la ricerca'\" matTooltip=\"Avvia ricerca\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"advancedSearch()\" color=\"primary\"\r\n [attr.aria-label]=\"'Ricerca avanzata'\" matTooltip=\"Ricerca avanzata\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"search-info small\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <b>RICERCA ATTIVA</b>&nbsp;&nbsp;&nbsp;\r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? '&nbsp;&nbsp;' : ''}} {{si.field}}: <span\r\n class=\"item-primary lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div style=\"padding:0 0 6px 20px;\" fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\"\r\n [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (snapshot.searchParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\" color=\"primary\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\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\"\r\n color=\"primary\" [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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <div class=\"dialog-title form-column\">\r\n <p>Ecco cosa \u00E8 successo negli ultimi 15 giorni in base alla tua configurazione.</p>\r\n <p>Per modificare la tua\r\n configurazione devi accedere a <a class=\"link\" href=\"https://clipper.arsedizioni.it\"\r\n matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">Clipper</a>.</p>\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <button mat-button matTooltip=\"Espandi tutto\" [attr.aria-label]=\"'Espandi tutto \\ comprimi tutto'\"\r\n color=\"primary\" (click)=\"expandHome()\">\r\n Espandi tutto\r\n </button>\r\n <button mat-button matTooltip=\"Comprimi tutto\" [attr.aria-label]=\"'Comprimi tutto'\" color=\"primary\"\r\n (click)=\"expandHome(true)\">\r\n Comprimi tutto\r\n </button>\r\n </div>\r\n </div>\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 <div [hidden]=\"dialogTab !== 1\">\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\" mat-icon-button matTooltip=\"Nascondi\" (click)=\"facetsClose(true)\"\r\n 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=\"search_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n }\r\n @if (snapshot.total > 0) {\r\n <div>\r\n @for (item of snapshot.items; track trackableId($index, 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 class=\"items-group-title item-accent\">{{item.group}}</div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox fxLayoutAlign=\"center\" 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\" style=\"padding:6px 0\">\r\n <clipper-search-result-item [parent]=\"this\" [item]=\"item\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item)) {\r\n <button fxFlexAlign=\"center\" 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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n\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\"\r\n [pageIndex]=\"snapshot.searchParams.first / snapshot.searchParams.count\" [length]=\"snapshot.total\"\r\n [pageSize]=\"snapshot.searchParams.count\" [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>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <clipper-last-15-days #last15Days [showHeader]=\"false\"></clipper-last-15-days>\r\n </div>\r\n</div>", styles: [".dialog-info{font-size:x-small;font-weight:700;text-align:right;padding: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, --mat-form-field-error-text-color)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!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}.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}@media (prefers-color-scheme: dark){.dialog-info,b{font-weight:600}}.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}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\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: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i11.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i11.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i12.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i12.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: i12.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: MatFormFieldModule }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatLabel, selector: "mat-label" }, { kind: "directive", type: i13.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i13.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i15.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i16.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: MatMenuModule }, { kind: "component", type: i17.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i17.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i17.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i17.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: MatDividerModule }, { kind: "component", type: i18.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { 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: MatSidenavModule }, { kind: "component", type: i19.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i19.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i19.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i20.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: "component", type: ClipperSearchResultItemComponent, selector: "clipper-search-result-item", inputs: ["parent", "item"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i21.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: ClipperLast15DaysComponent, selector: "clipper-last-15-days", inputs: ["showHeader"] }] }); }
1169
+ ], viewQueries: [{ propertyName: "facetsSidenav", first: true, predicate: ["facetsSidenav"], descendants: true }, { propertyName: "facetsSearch", first: true, predicate: ["facetsSearch"], descendants: true }, { propertyName: "last15Days", first: true, predicate: ["last15Days"], 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-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (data.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\">\r\n @if ($clipper.bag.length > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"$clipper.bag.length\" matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\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 <nav mat-tab-nav-bar mat-stretch-tabs [tabPanel]=\"tabPanel1\">\r\n <a mat-tab-link (click)=\"dialogTab = 1\" [active]=\"dialogTab === 1\" [disabled]=\"!$clipper.loggedIn\">Ricerca</a>\r\n <a mat-tab-link (click)=\"showHome()\" [active]=\"dialogTab === 2\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>update</mat-icon>\r\n <span fxHide.xs style=\"margin-left: 8px\"> Ultimi 15 giorni</span>\r\n </a>\r\n </nav>\r\n <mat-tab-nav-panel #tabPanel1></mat-tab-nav-panel>\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"100\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"snapshot.searchParams.number\" #number=\"ngModel\" name=\"number\"\r\n maxlength=\"10\" (keyup.Enter)=\"fetch(true)\">\r\n @if (snapshot.searchParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"snapshot.searchParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"snapshot.searchParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (snapshot.searchParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"snapshot.searchParams.text\"\r\n maxlength=\"200\" (keyup.Enter)=\"search()\" autofocus />\r\n @if (snapshot.searchParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end\" fxFill>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"search()\" color=\"primary\"\r\n [attr.aria-label]=\"'Avvia la ricerca'\" matTooltip=\"Avvia ricerca\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"advancedSearch()\" color=\"primary\"\r\n [attr.aria-label]=\"'Ricerca avanzata'\" matTooltip=\"Ricerca avanzata\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"search-info small\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <b>RICERCA ATTIVA</b>&nbsp;&nbsp;&nbsp;\r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? '&nbsp;&nbsp;' : ''}} {{si.field}}: <span\r\n class=\"item-primary lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div style=\"padding:0 0 6px 20px;\" fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\"\r\n [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (snapshot.searchParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\" color=\"primary\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\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\"\r\n color=\"primary\" [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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <div class=\"dialog-title form-column\">\r\n <p>Ecco cosa \u00E8 successo negli ultimi 15 giorni in base alla tua configurazione.</p>\r\n <p>Per modificare la tua\r\n configurazione devi accedere a <a class=\"link\" href=\"https://clipper.arsedizioni.it\"\r\n matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">Clipper</a>.</p>\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <button mat-button matTooltip=\"Espandi tutto\" [attr.aria-label]=\"'Espandi tutto \\ comprimi tutto'\"\r\n color=\"primary\" (click)=\"expandHome()\">\r\n Espandi tutto\r\n </button>\r\n <button mat-button matTooltip=\"Comprimi tutto\" [attr.aria-label]=\"'Comprimi tutto'\" color=\"primary\"\r\n (click)=\"expandHome(true)\">\r\n Comprimi tutto\r\n </button>\r\n </div>\r\n </div>\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 <div [hidden]=\"dialogTab !== 1\">\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\" mat-icon-button matTooltip=\"Nascondi\" (click)=\"facetsClose(true)\"\r\n 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=\"search_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n }\r\n @if (snapshot.total > 0) {\r\n <div>\r\n @for (item of snapshot.items; track trackableId($index, 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 class=\"items-group-title item-accent\">{{item.group}}</div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox fxLayoutAlign=\"center\" 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\" style=\"padding:6px 0\">\r\n <clipper-search-result-item [parent]=\"this\" [item]=\"item\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item)) {\r\n <button fxFlexAlign=\"center\" 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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n\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\"\r\n [pageIndex]=\"snapshot.searchParams.first / snapshot.searchParams.count\" [length]=\"snapshot.total\"\r\n [pageSize]=\"snapshot.searchParams.count\" [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>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <clipper-last-15-days #last15Days [showHeader]=\"false\"></clipper-last-15-days>\r\n </div>\r\n</div>", styles: [".dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!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}.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}@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(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.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}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\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: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i11.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i11.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i12.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i12.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: i12.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: MatFormFieldModule }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatLabel, selector: "mat-label" }, { kind: "directive", type: i13.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i13.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i15.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i16.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: MatMenuModule }, { kind: "component", type: i17.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i17.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i17.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i17.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: MatDividerModule }, { kind: "component", type: i18.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { 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: MatSidenavModule }, { kind: "component", type: i19.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i19.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i19.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i20.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: "component", type: ClipperSearchResultItemComponent, selector: "clipper-search-result-item", inputs: ["parent", "item"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i21.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: ClipperLast15DaysComponent, selector: "clipper-last-15-days", inputs: ["showHeader"] }] }); }
1170
1170
  }
1171
1171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperBrowserDialogComponent, decorators: [{
1172
1172
  type: Component,
@@ -1196,7 +1196,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
1196
1196
  ClipperSearchResultItemComponent,
1197
1197
  MatPaginatorModule,
1198
1198
  ClipperLast15DaysComponent,
1199
- ], template: "<div id=\"clipper-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (data.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\">\r\n @if ($clipper.bag.length > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"$clipper.bag.length\" matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\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 <nav mat-tab-nav-bar mat-stretch-tabs [tabPanel]=\"tabPanel1\">\r\n <a mat-tab-link (click)=\"dialogTab = 1\" [active]=\"dialogTab === 1\" [disabled]=\"!$clipper.loggedIn\">Ricerca</a>\r\n <a mat-tab-link (click)=\"showHome()\" [active]=\"dialogTab === 2\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>update</mat-icon>\r\n <span fxHide.xs style=\"margin-left: 8px\"> Ultimi 15 giorni</span>\r\n </a>\r\n </nav>\r\n <mat-tab-nav-panel #tabPanel1></mat-tab-nav-panel>\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"100\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"snapshot.searchParams.number\" #number=\"ngModel\" name=\"number\"\r\n maxlength=\"10\" (keyup.Enter)=\"fetch(true)\">\r\n @if (snapshot.searchParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"snapshot.searchParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"snapshot.searchParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (snapshot.searchParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"snapshot.searchParams.text\"\r\n maxlength=\"200\" (keyup.Enter)=\"search()\" autofocus />\r\n @if (snapshot.searchParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end\" fxFill>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"search()\" color=\"primary\"\r\n [attr.aria-label]=\"'Avvia la ricerca'\" matTooltip=\"Avvia ricerca\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"advancedSearch()\" color=\"primary\"\r\n [attr.aria-label]=\"'Ricerca avanzata'\" matTooltip=\"Ricerca avanzata\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"search-info small\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <b>RICERCA ATTIVA</b>&nbsp;&nbsp;&nbsp;\r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? '&nbsp;&nbsp;' : ''}} {{si.field}}: <span\r\n class=\"item-primary lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div style=\"padding:0 0 6px 20px;\" fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\"\r\n [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (snapshot.searchParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\" color=\"primary\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\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\"\r\n color=\"primary\" [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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <div class=\"dialog-title form-column\">\r\n <p>Ecco cosa \u00E8 successo negli ultimi 15 giorni in base alla tua configurazione.</p>\r\n <p>Per modificare la tua\r\n configurazione devi accedere a <a class=\"link\" href=\"https://clipper.arsedizioni.it\"\r\n matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">Clipper</a>.</p>\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <button mat-button matTooltip=\"Espandi tutto\" [attr.aria-label]=\"'Espandi tutto \\ comprimi tutto'\"\r\n color=\"primary\" (click)=\"expandHome()\">\r\n Espandi tutto\r\n </button>\r\n <button mat-button matTooltip=\"Comprimi tutto\" [attr.aria-label]=\"'Comprimi tutto'\" color=\"primary\"\r\n (click)=\"expandHome(true)\">\r\n Comprimi tutto\r\n </button>\r\n </div>\r\n </div>\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 <div [hidden]=\"dialogTab !== 1\">\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\" mat-icon-button matTooltip=\"Nascondi\" (click)=\"facetsClose(true)\"\r\n 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=\"search_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n }\r\n @if (snapshot.total > 0) {\r\n <div>\r\n @for (item of snapshot.items; track trackableId($index, 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 class=\"items-group-title item-accent\">{{item.group}}</div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox fxLayoutAlign=\"center\" 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\" style=\"padding:6px 0\">\r\n <clipper-search-result-item [parent]=\"this\" [item]=\"item\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item)) {\r\n <button fxFlexAlign=\"center\" 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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n\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\"\r\n [pageIndex]=\"snapshot.searchParams.first / snapshot.searchParams.count\" [length]=\"snapshot.total\"\r\n [pageSize]=\"snapshot.searchParams.count\" [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>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <clipper-last-15-days #last15Days [showHeader]=\"false\"></clipper-last-15-days>\r\n </div>\r\n</div>", styles: [".dialog-info{font-size:x-small;font-weight:700;text-align:right;padding: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, --mat-form-field-error-text-color)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!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}.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}@media (prefers-color-scheme: dark){.dialog-info,b{font-weight:600}}.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}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\n"] }]
1199
+ ], template: "<div id=\"clipper-browser-fixed\">\r\n <div class=\"clipper-browser-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n <a href=\"https://clipper.arsedizioni.it\" matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">\r\n <img src=\"./../../../assets/images/clipper_logo.png\" alt=\"Clipper\" style=\"max-height: 50px; padding: 5px\" />\r\n </a>\r\n </div>\r\n @if (data.selectionMode > 0) {\r\n <div fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (canSelect()) {\r\n <button type=\"button\" mat-flat-button color=\"primary\" (click)=\"select()\">\r\n Usa selezione\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n <div fxFlex=\"150px\" fxLayoutAlign=\"end\">\r\n @if ($clipper.bag.length > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Documenti di lavoro\"\r\n aria-label=\"'Documenti di lavoro'\" (click)=\"manageBag()\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"$clipper.bag.length\" matBadgeColor=\"accent\">work_outline</mat-icon>\r\n </button>\r\n }\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 <nav mat-tab-nav-bar mat-stretch-tabs [tabPanel]=\"tabPanel1\">\r\n <a mat-tab-link (click)=\"dialogTab = 1\" [active]=\"dialogTab === 1\" [disabled]=\"!$clipper.loggedIn\">Ricerca</a>\r\n <a mat-tab-link (click)=\"showHome()\" [active]=\"dialogTab === 2\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>update</mat-icon>\r\n <span fxHide.xs style=\"margin-left: 8px\"> Ultimi 15 giorni</span>\r\n </a>\r\n </nav>\r\n <mat-tab-nav-panel #tabPanel1></mat-tab-nav-panel>\r\n <div [hidden]=\"dialogTab !== 1\">\r\n <div style=\"padding: 15px 0 10px 15px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlex=\"100\" fxFlex.xs=\"62\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Numero</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"snapshot.searchParams.number\" #number=\"ngModel\" name=\"number\"\r\n maxlength=\"10\" (keyup.Enter)=\"fetch(true)\">\r\n @if (snapshot.searchParams.number) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"snapshot.searchParams.number = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"130px\" fxHide.xs subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Anno</mat-label>\r\n <input type=\"number\" matInput [(ngModel)]=\"snapshot.searchParams.year\" #year=\"ngModel\" name=\"year\" min=\"0\"\r\n maxlength=\"4\" (keyup.Enter)=\"fetch(true)\" />\r\n @if (snapshot.searchParams.year) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.year = null\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (year.invalid) {\r\n <mat-error>Non valido.</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field fxFlex=\"100\" subscriptSizing=\"dynamic\" appearance=\"outline\">\r\n <mat-label>Parole, frasi o concetti...</mat-label>\r\n <input matInput #searchInput=\"matInput\" type=\"text\" #text [(ngModel)]=\"snapshot.searchParams.text\"\r\n maxlength=\"200\" (keyup.Enter)=\"search()\" autofocus />\r\n @if (snapshot.searchParams.text) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\"\r\n (click)=\"snapshot.searchParams.text = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Componi\" matTooltip=\"Componi\"\r\n (click)=\"text.focus(); composeSearch()\">\r\n <mat-icon>build</mat-icon>\r\n </button>\r\n <button fxHide.xs type=\"button\" mat-icon-button matSuffix aria-label=\"Informazioni\"\r\n matTooltip=\"Come effettuare la ricerca in testo libero\" (click)=\"text.focus(); helpSearch()\">\r\n <mat-icon>help_outline</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div fxFlex.xs=\"36\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end\" fxFill>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"search()\" color=\"primary\"\r\n [attr.aria-label]=\"'Avvia la ricerca'\" matTooltip=\"Avvia ricerca\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"advancedSearch()\" color=\"primary\"\r\n [attr.aria-label]=\"'Ricerca avanzata'\" matTooltip=\"Ricerca avanzata\" [disabled]=\"!$clipper.loggedIn\">\r\n <mat-icon>settings</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n @if (snapshot.searchInfo && snapshot.searchInfo.length > 0) {\r\n <div fxHide.xs class=\"search-info small\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <b>RICERCA ATTIVA</b>&nbsp;&nbsp;&nbsp;\r\n @for (si of snapshot.searchInfo; track si) {\r\n <span>\r\n {{si.sep ? '&nbsp;&nbsp;' : ''}} {{si.field}}: <span\r\n class=\"item-primary lowercase\"><i>{{si.value}}</i></span>\r\n </span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"start\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Azzera ricerca\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div style=\"padding:0 0 6px 20px;\" fxLayout=\"row wrap-reverse\" fxLayoutAlign=\"space-between\" fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n @if (snapshot.total > 0) {\r\n <div fxFlexAlign=\"center\">\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\"\r\n [disabled]=\"!snapshot.items || snapshot.items.length == 0\">\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <div fxFlex=\"*\">\r\n @if (snapshot.total > 0) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Ordina\" [attr.aria-label]=\"'Menu ordina'\"\r\n [matMenuTriggerFor]=\"menuSort\" color=\"primary\" [disabled]=\"!snapshot.total\">\r\n <span fxHide.lt-lg>Ordina per:</span>\r\n <mat-icon fxHide.gt-md>sort</mat-icon> {{currentSort}}\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSort=\"matMenu\">\r\n <button mat-menu-item (click)=\"sortBy(3)\" [attr.aria-label]=\"'Ordina per data decrescente'\">\r\n Data decrescente\r\n </button>\r\n <button mat-menu-item (click)=\"sortBy(2)\" [attr.aria-label]=\"'Ordina per data crescente'\">\r\n Data crescente\r\n </button>\r\n @if (snapshot.searchParams.text) {\r\n <button mat-menu-item (click)=\"sortBy(1)\" [attr.aria-label]=\"'Ordina per rilevanza'\">\r\n Rilevanza\r\n </button>\r\n }\r\n <button mat-menu-item (click)=\"sortBy(5)\" [attr.aria-label]=\"'Ordina per popolarit\u00E0'\">\r\n Popolarit\u00E0\r\n </button>\r\n <!-- <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"sortBy(4)\"\r\n [attr.aria-label]=\"'Ordina per data di inserimento descrescente'\">\r\n Data di inserimento decrescente\r\n </button>-->\r\n </mat-menu>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Menu modello'\"\r\n [matMenuTriggerFor]=\"menuModels\" color=\"primary\">\r\n <span fxHide.lt-lg>Mostra:</span>\r\n <mat-icon fxHide.gt-md>filter_list</mat-icon> {{currentModel}}\r\n <mat-icon class=\" icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #menuModels=\"matMenu\">\r\n <button mat-menu-item (click)=\"changeModel(2)\" [attr.aria-label]=\"'Mostra aggiornamento normativo'\">\r\n Gazzette e bollettini\r\n </button>\r\n <button mat-menu-item (click)=\"changeModel(9)\" [attr.aria-label]=\"'Normativa vigente'\">\r\n Normativa vigente\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"changeModel()\" [attr.aria-label]=\"'Mostra tutti i documenti'\">\r\n Tutto\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </div>\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\"\r\n color=\"primary\" [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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\"\r\n aria-label=\"'Affina ricerca'\" (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <div class=\"dialog-title form-column\">\r\n <p>Ecco cosa \u00E8 successo negli ultimi 15 giorni in base alla tua configurazione.</p>\r\n <p>Per modificare la tua\r\n configurazione devi accedere a <a class=\"link\" href=\"https://clipper.arsedizioni.it\"\r\n matTooltip=\"Apri Clipper in un nuovo tab\" target=\"_blank\">Clipper</a>.</p>\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlexAlign=\"center\">\r\n <button mat-button matTooltip=\"Espandi tutto\" [attr.aria-label]=\"'Espandi tutto \\ comprimi tutto'\"\r\n color=\"primary\" (click)=\"expandHome()\">\r\n Espandi tutto\r\n </button>\r\n <button mat-button matTooltip=\"Comprimi tutto\" [attr.aria-label]=\"'Comprimi tutto'\" color=\"primary\"\r\n (click)=\"expandHome(true)\">\r\n Comprimi tutto\r\n </button>\r\n </div>\r\n </div>\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 <div [hidden]=\"dialogTab !== 1\">\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\" mat-icon-button matTooltip=\"Nascondi\" (click)=\"facetsClose(true)\"\r\n 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=\"search_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px; text-align: center;\" class=\"item-greyed-1\">\r\n <p>\r\n Non hai ancora effettuato\r\n la tua prima ricerca oppure la ricerca effettuata non ha prodotto alcun risultato.</p>\r\n <p>Inserisci nell'apposito campo ci\u00F2 che intendi cercare e fai click su <b>Trova</b> oppure utilizza\r\n la\r\n <b>Ricerca avanzata</b>\r\n </p>.\r\n </div>\r\n }\r\n @if (snapshot.total > 0) {\r\n <div>\r\n @for (item of snapshot.items; track trackableId($index, 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 class=\"items-group-title item-accent\">{{item.group}}</div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox fxLayoutAlign=\"center\" 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\" style=\"padding:6px 0\">\r\n <clipper-search-result-item [parent]=\"this\" [item]=\"item\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item)) {\r\n <button fxFlexAlign=\"center\" 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\" [isSelectable]=\"canSelect()\"\r\n [isReadable]=\"false\" [isLawInForce]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n\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\"\r\n [pageIndex]=\"snapshot.searchParams.first / snapshot.searchParams.count\" [length]=\"snapshot.total\"\r\n [pageSize]=\"snapshot.searchParams.count\" [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>\r\n <div [hidden]=\"dialogTab !== 2\">\r\n <clipper-last-15-days #last15Days [showHeader]=\"false\"></clipper-last-15-days>\r\n </div>\r\n</div>", styles: [".dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!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}.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}@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(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.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}.sidenav{width:250px;background-color:#fff;border-left:0!important;border-right:0!important}.sidenav-facets{background-color:#f8f8f8!important}.search-info{padding-left:30px}\n"] }]
1200
1200
  }], ctorParameters: () => [{ type: i1.ApplicationDialogService }, { type: i2.ClipperService }, { type: i3.ScreenService }, { type: i3.BroadcastService }, { type: i4.MatDialogRef }, { type: i5.MediaObserver }, { type: undefined, decorators: [{
1201
1201
  type: Inject,
1202
1202
  args: [MAT_DIALOG_DATA]
@@ -1216,4 +1216,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
1216
1216
  type: ViewChild,
1217
1217
  args: ['contextMenuTrigger']
1218
1218
  }] } });
1219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQWdCLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBa0IsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBRUwsVUFBVSxFQUVWLGVBQWUsRUFDZixXQUFXLEVBQ1osTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFdBQVcsRUFFWCxlQUFlLEVBQ2Ysa0JBQWtCLEdBR25CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDBCQUEwQixF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LDZCQUE2QjtrQkFsQ3pDLFNBQVM7MkJBQ0EsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLGFBR2pDO3dCQUNQLCtDQUErQztxQkFDbEQsY0FDVyxJQUFJLFdBQ1A7d0JBQ0wsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQiw0QkFBNEI7d0JBQzVCLGdCQUFnQjt3QkFDaEIsT0FBTzt3QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsNEJBQTRCO3dCQUM1QixPQUFPO3dCQUNQLGdDQUFnQzt3QkFDaEMsa0JBQWtCO3dCQUNsQiwwQkFBMEI7cUJBQzdCOzswQkE2Q0EsTUFBTTsyQkFBQyxlQUFlO3lDQXhDRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNBLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDQyxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1csV0FBVztzQkFBM0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZWRpYUNoYW5nZSwgTWVkaWFPYnNlcnZlciB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIsIE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2LCBNYXRTaWRlbmF2TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZUb2RheSwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHtcclxuICBCcm9hZGNhc3RTZXJ2aWNlLFxyXG4gIERhdGVGb3JtYXQsXHJcbiAgU2NyZWVuU2VydmljZSxcclxuICBTZWxlY3RhYmxlTW9kZWwsXHJcbiAgU3lzdGVtVXRpbHNcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gIFNlYXJjaFV0aWxzLFxyXG4gIENsaXBwZXJTZXJ2aWNlLFxyXG4gIENsaXBwZXJNZXNzYWdlcyxcclxuICBDbGlwcGVyRGVmaW5pdGlvbnMsXHJcbiAgQ2xpcHBlckRpYWxvZ0RhdGEsXHJcbiAgRG9jdW1lbnRTZWFyY2hTbmFwc2hvdCxcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NsaXBwZXIuY29tbW9uJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2Jhc2UvZG9jdW1lbnQtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudCB9IGZyb20gJy4uL3JlZmVyZW5jZXMvcmVmZXJlbmNlcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWRpYWxvZy9zZWFyY2gtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZmFjZXRzL3NlYXJjaC1mYWNldHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZyZWVUZXh0SGVscENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1mcmVlLXRleHQtaGVscC9zZWFyY2gtZnJlZS10ZXh0LWhlbHAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZyZWVUZXh0UXVlcnlCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWZyZWUtdGV4dC1xdWVyeS1idWlsZGVyL3NlYXJjaC1mcmVlLXRleHQtcXVlcnktYnVpbGRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyRG9jdW1lbnRzVXRpbHMgfSBmcm9tICcuLi9kb2N1bWVudC9kb2N1bWVudHMnO1xyXG5pbXBvcnQgeyBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xyXG5pbXBvcnQgeyBDbGlwcGVyTGFzdDE1RGF5c0NvbXBvbmVudCB9IGZyb20gJy4uL2xhc3QtMTUtZGF5cy9sYXN0LTE1LWRheXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaFJlc3VsdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtcmVzdWx0LWl0ZW0vc2VhcmNoLXJlc3VsdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2RvY3VtZW50LW1lbnUvZG9jdW1lbnQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBFeHRlbmRlZE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9leHRlbmRlZCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgICBOZ1N0eWxlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXgnO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRpYWxvZ1NlcnZpY2UgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUlxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgRmxleE1vZHVsZSxcclxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLCAgICAgIFxyXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgICAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxyXG4gICAgICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICAgICAgRXh0ZW5kZWRNb2R1bGUsXHJcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXHJcbiAgICAgICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgICAgICBDbGlwcGVyRG9jdW1lbnRNZW51Q29tcG9uZW50LFxyXG4gICAgICAgIE1hdERpYWxvZ0NvbnRlbnQsXHJcbiAgICAgICAgTmdTdHlsZSxcclxuICAgICAgICBNYXRTaWRlbmF2TW9kdWxlLFxyXG4gICAgICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxyXG4gICAgICAgIENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQsXHJcbiAgICAgICAgTmdDbGFzcyxcclxuICAgICAgICBDbGlwcGVyU2VhcmNoUmVzdWx0SXRlbUNvbXBvbmVudCxcclxuICAgICAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICAgICAgQ2xpcHBlckxhc3QxNURheXNDb21wb25lbnQsXHJcbiAgICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2xpcHBlckJyb3dzZXJEaWFsb2dDb21wb25lbnRcclxuICBleHRlbmRzIENsaXBwZXJEb2N1bWVudEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTaWRlbmF2JykgZmFjZXRzU2lkZW5hdjogTWF0U2lkZW5hdjtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTZWFyY2gnKSBmYWNldHNTZWFyY2g6IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnRcclxuICBAVmlld0NoaWxkKCdsYXN0MTVEYXlzJykgbGFzdDE1RGF5czogQ2xpcHBlckxhc3QxNURheXNDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgncGFnaW5hdG9yJykgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51VHJpZ2dlcicpIGNvbnRleHRNZW51ITogTWF0TWVudVRyaWdnZXI7XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfX2QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZGlhbG9nVGFiOiBudW1iZXIgPSAxO1xyXG4gIGRhdGE6IENsaXBwZXJEaWFsb2dEYXRhID0ge307XHJcbiAgdGl0bGU6IHN0cmluZyA9ICdSaWNlcmNhIGluIENsaXBwZXInO1xyXG4gIHRyYWNrYWJsZUlkID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4geyBpbmRleCA+PSAwID8gaXRlbS5pZCA6IDAgfVxyXG4gIHNlbGVjdGlvbjogU2VsZWN0YWJsZU1vZGVsPGFueSwgc3RyaW5nPiA9IG5ldyBTZWxlY3RhYmxlTW9kZWwodHJ1ZSwgJ2RvY3VtZW50SWQnKTtcclxuICBzbmFwc2hvdDogRG9jdW1lbnRTZWFyY2hTbmFwc2hvdCA9IHtcclxuICAgIHNlYXJjaEluZm86IG51bGwsXHJcbiAgICBzZWFyY2hQYXJhbXM6IHtcclxuICAgICAgbW9kdWxlOiBDbGlwcGVyRGVmaW5pdGlvbnMuTU9EX1NFTUFOVElDX1NFQVJDSCxcclxuICAgICAgbW9kZWw6IG51bGwsXHJcbiAgICAgIGZpcnN0OiAwLFxyXG4gICAgICBjb3VudDogMjVcclxuICAgIH0sXHJcbiAgfTtcclxuICBmYWNldHNNb2RlOiBzdHJpbmcgPSAnc2lkZSc7XHJcbiAgZmFjZXRzQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudE1vZGVsOiBzdHJpbmcgPSAnVHV0dG8nO1xyXG4gIGN1cnJlbnRTb3J0OiBzdHJpbmcgPSAnUmlsZXZhbnphJztcclxuICBjb250ZW50SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gIGNvbnRleHRNZW51UG9zaXRpb24gPSB7IHg6ICcwcHgnLCB5OiAnMHB4JyB9O1xyXG4gIG1xOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW06IGFueSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljICRkaWFsb2c6IEFwcGxpY2F0aW9uRGlhbG9nU2VydmljZSwgICAgXHJcbiAgICBwdWJsaWMgJGNsaXBwZXI6IENsaXBwZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljICRzY3JlZW46IFNjcmVlblNlcnZpY2UsXHJcbiAgICBwcml2YXRlICRicm9hZGNhc3Q6IEJyb2FkY2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsaXBwZXJCcm93c2VyRGlhbG9nQ29tcG9uZW50PixcclxuICAgIHByaXZhdGUgbWVkaWE6IE1lZGlhT2JzZXJ2ZXIsXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgX2RhdGE6IENsaXBwZXJEaWFsb2dEYXRhXHJcbiAgKSB7XHJcbiAgICBzdXBlcigkZGlhbG9nLCAkY2xpcHBlcik7XHJcblxyXG4gICAgLy8gU3RvcmUgZGlhbG9nIGRhdGFcclxuICAgIHRoaXMuZGF0YSA9IF9kYXRhID8/IHt9O1xyXG5cclxuICAgIC8vIFVzZSBzZXJ2aWNlIHNuYXBzaG90XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gJGNsaXBwZXIuc25hcHNob3Q7XHJcbiAgICBpZiAoIXRoaXMuc25hcHNob3QpXHJcbiAgICAgIHRoaXMuc25hcHNob3QgPSB7XHJcbiAgICAgICAgc2VhcmNoSW5mbzogbnVsbCxcclxuICAgICAgICBzZWFyY2hQYXJhbXM6IG51bGwsXHJcbiAgICAgIH07XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgICBtb2R1bGU6IENsaXBwZXJEZWZpbml0aW9ucy5NT0RfU0VNQU5USUNfU0VBUkNILFxyXG4gICAgICAgIG1vZGVsOiBudWxsLFxyXG4gICAgICAgIGZpcnN0OiAwLFxyXG4gICAgICAgIGNvdW50OiAyNSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIFN0b3JlIHNuYXBzaG90XHJcbiAgICAgICRjbGlwcGVyLnNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgaW5pdGlhbCBtb2RlbFxyXG4gICAgdGhpcy5jaGFuZ2VNb2RlbChfZGF0YT8uaW5pdGlhbE1vZGVsLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy4kY2xpcHBlci52aXNpYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy4kYnJvYWRjYXN0LmdldE1lc3NhZ2UoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX2QkKSlcclxuICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgPT09IENsaXBwZXJNZXNzYWdlcy5ET0NVTUVOVF9TRUxFQ1RFRF9JTk5FUikge1xyXG4gICAgICAgICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5ET0NVTUVOVF9TRUxFQ1RFRCwgbWVzc2FnZS5kYXRhKTtcclxuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFJlYWN0IHRvIG1lZGlhIHF1ZXJ5IGNoYW5nZXNcclxuICAgIHRoaXMubWVkaWFcclxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9fZCQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjaGFuZ2VzOiBNZWRpYUNoYW5nZVtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tcSA9IGNoYW5nZXNbMF0ubXFBbGlhcztcclxuICAgICAgICB0aGlzLnVwZGF0ZUZhY2V0c1Zpc2liaWxpdHkodGhpcy5tcSk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gd2luZG93IHNpemUgY2hhbmdlXHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX19kJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIHNpZGVuYXYgc3RhdGUgY2hhbmdlXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NpZGVuYXYpXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb25maWd1cmUgZmFjZXQgc2VhY2ggY29tcG9uZXRcclxuICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoKSB7XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gdGhpcy5mYWNldHNTZWFyY2guZnJvbURhdGU7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudG9EYXRlID0gdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRJbnRlcnZhbCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFNlY3RvcilcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgPSB0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3I7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC50eXBlIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRUeXBlKVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnR5cGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50eXBlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2guYXV0aG9yIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRBdXRob3IpXHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYXV0aG9yID0gdGhpcy5mYWNldHNTZWFyY2guYXV0aG9yO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cykge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc3RvcmVGcm9tU25hcHNob3QodGhpcy5zbmFwc2hvdC5mYWNldHMpO1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cy5oYXNGYWNldHMpIHRoaXMuZmFjZXRzT3BlbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCAyNTApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9fZCQubmV4dCgpO1xyXG4gICAgdGhpcy5fX2QkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLiRjbGlwcGVyLnZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQ29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbi54ID0gZXZlbnQuY2xpZW50WCArICdweCc7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51UG9zaXRpb24ueSA9IGV2ZW50LmNsaWVudFkgKyAncHgnO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5tZW51RGF0YSA9IHsgaXRlbTogaXRlbSB9O1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5vcGVuTWVudSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNpZGVuYXYgdmlzaWJpbGl0eVxyXG4gICAqIEBwYXJhbSBtcSA6IHRoZSBjdXJyZW50IG1lZGlhIHF1ZXJ5XHJcbiAgICovXHJcbiAgdXBkYXRlRmFjZXRzVmlzaWJpbGl0eShtcTogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgaWYgKCFtcSkgbXEgPSB0aGlzLiRzY3JlZW4ubXE7XHJcbiAgICBpZiAobXEgPT09ICd4cycpIHtcclxuICAgICAgdGhpcy5mYWNldHNNb2RlID0gJ292ZXInO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYub3BlbmVkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmFjZXRzTW9kZSA9ICdzaWRlJztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guaGFzRmFjZXRzICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2ICYmXHJcbiAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYudG9nZ2xlKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBmYWNldHNTaWRlbmF2IHNpZGViYXJcclxuICAgKi9cclxuICBmYWNldHNPcGVuKCkge1xyXG4gICAgdGhpcy5mYWNldHNDbG9zZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBmYWNldHMgc2lkZWJhclxyXG4gICAqIEBwYXJhbSBjbG9zZWRNYW51YWxseSA6IHR1cmUgaWYgZmFjZXRzIGhhcyBiZWVuIGNsb3NlZCBtYW51YWxseSBieSBjbGlja2luZyB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZmFjZXRzQ2xvc2UoY2xvc2VkTWFudWFsbHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubXEgIT09ICd4cycpIHRoaXMuZmFjZXRzQ2xvc2VkID0gY2xvc2VkTWFudWFsbHk7XHJcbiAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmYWNldHNcclxuICAgKiBAcGFyYW0gc2VhcmNoUGFyYW1zIDogdGhlIGN1cnJlbnQgc2VhcmNoIHBhcmFtcyB0byB1c2UgdG8gZ2F0aGVyIGZhY2V0c1xyXG4gICAqL1xyXG4gIGdldEZhY2V0cyhzZWFyY2hQYXJhbXM6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLiRjbGlwcGVyLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuZmFjZXRzU2VhcmNoKSByZXR1cm47XHJcbiAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuJGNsaXBwZXIucXVlcnlGYWNldHMoc2VhcmNoUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC51cGRhdGUoci52YWx1ZS5mYWNldHMsIHIudmFsdWUuaW50ZXJ2YWwpO1xyXG4gICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgIXRoaXMuZmFjZXRzQ2xvc2VkICYmIHRoaXMubXEgIT09ICd4cycpXHJcbiAgICAgICAgICB0aGlzLmZhY2V0c09wZW4oKTtcclxuICAgICAgICBlbHNlIHRoaXMuZmFjZXRzQ2xvc2UoKTtcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc25hcHNob3QuZmFjZXRzID0gdGhpcy5mYWNldHNTZWFyY2guc2F2ZVNuYXBzaG90KCk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBzZWxlY3RlZCBpZHNcclxuICAgKi9cclxuICBnZXRTZWxldGVjdElkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxMDApIHtcclxuICAgICAgdGhpcy4kZGlhbG9nLmVycm9yKCdMYSBzZWxlemlvbmUgbm9uIHB1w7IgY29udGVuZXJlIHBpw7kgZGkgMTAwIGVsZW1lbnRpLicpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBpZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgICAgaWRzLnB1c2gobi5kb2N1bWVudElkKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBhcmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuc25hcHNob3QuaXRlbXMubGVuZ3RoXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFzdGVyIHNlbGVjdGlvbiB0b2dnbGVcclxuICAgKiBAcGFybWEgYXJnczogZXZlbnQgaW5mb1xyXG4gICAqL1xyXG4gIG1hc3RlclNlbGVjdGlvblRvZ2dsZShhcmdzOiBhbnkpIHtcclxuICAgIGlmIChhcmdzLmNoZWNrZWQpXHJcbiAgICAgIHRoaXMuc25hcHNob3QuaXRlbXMuZm9yRWFjaCgocm93OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdywgcm93LmRvY3VtZW50SWQpXHJcbiAgICAgICk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc25hcHNob3QuaXRlbXMuZm9yRWFjaCgocm93OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93LCByb3cuZG9jdW1lbnRJZClcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBkb2N1bWVudHMgY2FuIGJlIHNlbGVjdGVkIGFuZCByZXR1cm5lZCBhcyBtZXNzYWdlXHJcbiAgICovXHJcbiAgY2FuU2VsZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFsbG93ID1cclxuICAgICAgdGhpcy5zZWxlY3Rpb24gJiZcclxuICAgICAgKCh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMSAmJlxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID09PSAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMiAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMyAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSk7XHJcbiAgICBpZiAoYWxsb3cgJiYgdGhpcy5kYXRhLnNlbGVjdGFibGVNb2RlbHM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuc2VsZWN0YWJsZU1vZGVscy5pbmRleE9mKG4ubW9kZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgYWxsb3cgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbG93O1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBtZXNzYWdlIHdpdGggY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsb3NlIGRpYWxvZ1xyXG4gICAqL1xyXG4gIHNlbGVjdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLiRicm9hZGNhc3Quc2VuZE1lc3NhZ2UoXHJcbiAgICAgICAgQ2xpcHBlck1lc3NhZ2VzLkRPQ1VNRU5UX1NFTEVDVEVELFxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZGlhbG9nXHJcbiAgICogQHBhcmFtIG5ld1JvdXRlOiB0aGUgbmV3IHJvdXRlIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgY2xvc2UobmV3Um91dGU6IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG5ld1JvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VhcmNoX2NvbnRhaW5lcicpLnNjcm9sbFRvKDAsIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIG1lbnUgYnV0dG9ucyB2aXNpYmlsaXR5IHdoZW4gdGhlIG1lbnUgaXMgY2xvc2VkXHJcbiAgICovXHJcbiAgdXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5zbmFwc2hvdC5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgbi5pc01lbnVPcGVuID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBzb3J0XHJcbiAgICovXHJcbiAgdXBkYXRlU29ydE9wdGlvbnMoKSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9EQVRFX0FTQzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0ID0gJ0RhdGEgY3JlLic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9QT1BVTEFSSVRZOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUG9wb2xhcml0w6AnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5TUlRfUkVMRVZBTkNFOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUmlsZXZhbnphJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX09SSUdJTkFMOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBpbnMuIGRlY3IuJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX1RBWE9OT01ZOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnQXJnb21lbnRvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJEZWZpbml0aW9ucy5TUlRfREFURV9ERVNDO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBkZWNyLic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQWRqdXN0IHZpZXdcclxuICAgKi9cclxuICBhZGp1c3RWaWV3KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdmlld1xyXG4gICAqL1xyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICAvLyBVcGRhdGUgcm91dGVyIGhlaWdodFxyXG4gICAgbGV0IGEgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICBsZXQgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGlwcGVyLWJyb3dzZXItZml4ZWQnKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghYSB8fCAhYiB8fCBhID09PSAwKSB0aGlzLmFkanVzdFZpZXcoKTtcclxuICAgICAgbGV0IGhiID0gYi5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmIChoYiA9PT0gMCkgdGhpcy5hZGp1c3RWaWV3KCk7XHJcbiAgICAgIHRoaXMuY29udGVudEhlaWdodCA9IGEgLSBoYjtcclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3VycmVudCBzZWFyY2ggaW5mb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlU2VhcmNoSW5mbygpIHtcclxuICAgIGxldCBzaSA9IFtdO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvcilcclxuICAgICkge1xyXG4gICAgICBsZXQgcyA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TRUNUT1JTLFxyXG4gICAgICAgICdpZCcsXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2guc2VjdG9yXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3JcclxuICAgICAgKTtcclxuICAgICAgaWYgKHMpIHtcclxuICAgICAgICBzaS5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkOiAnc2V0dG9yZScsXHJcbiAgICAgICAgICB2YWx1ZTogcy5uYW1lLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzID0gU3lzdGVtVXRpbHMuYXJyYXlGaW5kQnlLZXkoXHJcbiAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuTU9ERUxTLFxyXG4gICAgICAgICAgJ2lkJyxcclxuICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvclxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHMpIHtcclxuICAgICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NlemlvbmUnLFxyXG4gICAgICAgICAgICB2YWx1ZTogcy5uYW1lLFxyXG4gICAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYXV0aG9yIHx8XHJcbiAgICAgICh0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3IpXHJcbiAgICApIHtcclxuICAgICAgbGV0IGEgPSBTeXN0ZW1VdGlscy5hcnJheUZpbmRCeUtleShcclxuICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU0VDVE9SX0FVVEhPUlMsXHJcbiAgICAgICAgJ2F1dGhvcklkJyxcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3JcclxuICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2guYXV0aG9yXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmF1dGhvclxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYSkge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICdhdXRvcmUnLFxyXG4gICAgICAgICAgdmFsdWU6IGEuYXV0aG9yRGVzY3JpcHRpb24sXHJcbiAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b3BpYylcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhcmdvbWVudG8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b3BpYyxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRheG9ub215KVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2FyZ29tZW50bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRheG9ub215Tm9kZSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm51bWJlcilcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdudW1lcm8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5udW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuc25hcHNob3QuaW50ZXJ2YWwgJiZcclxuICAgICAgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlIHx8XHJcbiAgICAgICh0aGlzLmZhY2V0c1NlYXJjaCAmJlxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgIT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKSlcclxuICAgICkge1xyXG4gICAgICBsZXQgZDEgPVxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlO1xyXG4gICAgICBjb25zdCBkMiA9XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGU7XHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAhZDIgPyAnaW4gZGF0YScgOiAnZGEgZGF0YScsXHJcbiAgICAgICAgdmFsdWU6IFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZDEpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc25hcHNob3QuaW50ZXJ2YWwgJiYgXHJcbiAgICAgICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgIT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKSlcclxuICAgICkge1xyXG4gICAgICBsZXQgZCA9XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGU7XHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnYSBkYXRhJyxcclxuICAgICAgICB2YWx1ZTogU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShkKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc25hcHNob3QuaW50ZXJ2YWwpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnaW50ZXJ2YWxsbycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3QuaW50ZXJ2YWwsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2UpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5hcnJheUdldFZhbHVlKFxyXG4gICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLlNPVVJDRVMsXHJcbiAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VcclxuICAgICAgICApLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlTnVtYmVyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ251bS4gZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VOdW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlRnJvbURhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guZnJvbURhdGUgJiZcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9PT1cclxuICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fQUdHSU9STkFNRU5UT19OT1JNQVRJVk8pXHJcbiAgICApIHtcclxuICAgICAgbGV0IGQxID1cclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VGcm9tRGF0ZTtcclxuICAgICAgY29uc3QgZDIgPVxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGVcclxuICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlVG9EYXRlO1xyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogIWQyID8gJ2luIGRhdGEgZm9udGUnIDogJ2RhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQxKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VUb0RhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkID1cclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvdXJjZVRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0ZXN0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHQsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudHlwZSB8fFxyXG4gICAgICAodGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudHlwZSlcclxuICAgICkge1xyXG4gICAgICBsZXQgdCA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TRUNUT1JfVFlQRVMsXHJcbiAgICAgICAgJ2RvY3VtZW50VHlwZUlkJyxcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC50eXBlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnR5cGVcclxuICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudHlwZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodCkge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICd0aXBvJyxcclxuICAgICAgICAgIHZhbHVlOiB0LmRvY3VtZW50VHlwZURlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2hvd1VucmVhZERvY3VtZW50c09ubHkpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnc3RhdG8nLFxyXG4gICAgICAgIHZhbHVlOiAnbm9uIGxldHRpJyxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5yZWFzb24gfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnJlYXNvbilcclxuICAgIClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0aXBvIG1vZC4nLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5hcnJheUdldFZhbHVlKFxyXG4gICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkNIQU5HRV9SRUFTT05TLFxyXG4gICAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gucmVhc29uXHJcbiAgICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2gucmVhc29uXHJcbiAgICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMucmVhc29uXHJcbiAgICAgICAgKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWROdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZE51bWJlcixcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWRZZWFyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2Fubm8gbW9kaWZpY2F0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWRZZWFyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZFRpdGxlKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpdG9sbyBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZFRpdGxlLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kaWZpZXJOdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGlmaWVyTnVtYmVyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kaWZpZXJZZWFyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2Fubm8gbW9kaWZpY2FudGUnLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RpZmllclllYXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RpZmllclRpdGxlKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpdG9sbyBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGlmaWVyVGl0bGUsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaEluZm8gPSBzaTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBDaGFuZ2Ugc2VhcmNoIG1vZGVsXHJcbiAqIEBwYXJhbSBtb2RlbCA6IHRoZSBuZXcgZG9jdW1lbnQgbW9kZWwgXHJcbiAqIEBwYXJhbSBmZXRjaCA6IHRydWUgaWYgZGF0YSBtdXN0IGJlIGZldGNoZWQuIERlZmF1bHQgaXMgdHJ1ZVxyXG4gKi9cclxuICBjaGFuZ2VNb2RlbChtb2RlbDogbnVtYmVyID0gbnVsbCwgZmV0Y2g6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9IG1vZGVsO1xyXG4gICAgc3dpdGNoIChtb2RlbCkge1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9BR0dJT1JOQU1FTlRPX05PUk1BVElWTzogdGhpcy5jdXJyZW50TW9kZWwgPSBcIkdhenpldHRlIGUgYm9sbGV0dGluaVwiOyBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fTk9STUFUSVZBX1ZJR0VOVEU6IHRoaXMuY3VycmVudE1vZGVsID0gXCJOb3JtYXRpdmEgdmlnZW50ZVwiOyBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RlbCA9IFwiVHV0dG9cIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChmZXRjaClcclxuICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGEgc29ydFxyXG4gICAqIEBwYXJhbSBtb2RlIDogdGhlIHNvcnQgbW9kZVxyXG4gICAqL1xyXG4gIHNvcnRCeShtb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlID0gbW9kZTtcclxuICAgIHRoaXMudXBkYXRlU29ydE9wdGlvbnMoKTtcclxuICAgIHRoaXMuZmV0Y2goZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBhIHNlYXJjaCB1c2luZyBjdXJyZW50IHBhcmFtc1xyXG4gICAqL1xyXG4gIGZldGNoKG5ld1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLiRkaWFsb2cuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY291bnQgPSAyNTtcclxuICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZmlyc3QgPSAwO1xyXG4gICAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dClcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJEZWZpbml0aW9ucy5TUlRfUkVMRVZBTkNFO1xyXG4gICAgICBlbHNlIGlmICghdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUpXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUgPSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX0RBVEVfREVTQztcclxuICAgICAgdGhpcy51cGRhdGVTb3J0T3B0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyO1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5mcm9tRGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEsIDIpO1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAxMSwgMzEsIDIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0ID0gU2VhcmNoVXRpbHMubm9ybWFsaXplVGV4dFF1ZXJ5KHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4kY2xpcHBlci5xdWVyeSh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcylcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHRoaXMuJGRpYWxvZy5lcnJvcihyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QudG90YWwgPSByLnZhbHVlPy50b3RhbCA/PyAwO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gci52YWx1ZT8uaXRlbXMgPz8gW107XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QuaW50ZXJ2YWwgPSByLnZhbHVlPy5pbnRlcnZhbDtcclxuICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBzdGFydE9mVG9kYXkoKTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBCeVllYXIgPVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlID09PVxyXG4gICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TUlRfREFURV9BU0MgfHxcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9PT1cclxuICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX0RBVEVfREVTQztcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBCeVJlbGV2YW5jZSA9XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUgPT09XHJcbiAgICAgICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9SRUxFVkFOQ0U7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnlQb3B1bGFyaXR5ID1cclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9PT1cclxuICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX1BPUFVMQVJJVFk7XHJcbiAgICAgICAgICAgIGxldCBncm91cCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90Lml0ZW1zLmZvckVhY2goKG46IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0FERU5aQSB8fFxyXG4gICAgICAgICAgICAgICAgbi5tb2RlbCA9PT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX1NFR05BTEFaSU9ORVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChuLm1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLkRNX1NDQURFTlpBOlxyXG4gICAgICAgICAgICAgICAgICAgIG4ub3JpZ2luRGVzY3JpcHRpb24gPSAnU2NhZGVuemEnO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TRUdOQUxBWklPTkU6XHJcbiAgICAgICAgICAgICAgICAgICAgbi5vcmlnaW5EZXNjcmlwdGlvbiA9ICdTZWduYWxhemlvbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG4uZXhwaXJpbmdJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBwYXJ0cyA9IG4uZXhwaXJpbmdJbmZvLnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIG4uZGVzY3JpcHRpb24gPSBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBzdWJEYXlzKG4uZGF0ZSwgMTUpO1xyXG4gICAgICAgICAgICAgICAgICBuLmlzRXhwaXJpbmcgPSB0b2RheSA8PSBuLmRhdGUgJiYgdG9kYXkgPj0gZDtcclxuICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBuLmRhdGUgPCB0b2RheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKHN0YXJ0T2ZUb2RheSgpLCA3KSlcclxuICAgICAgICAgICAgICAgICAgbi5pc05ldyA9IG4uZGF0ZSA+IGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5hbmNob3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JUeXBlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT09IDIwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSAhPT0gYW5jaG9yVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSA+PSAzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goeyB0ZXh0OiBhLnR5cGVEZXNjcmlwdGlvbiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclR5cGUgPSBhLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY29yZSA9IGEuc2NvcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gNykgc2NvcmUgLT0gNztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29yZSA+IDUpIHNjb3JlIC09IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAzKSBzY29yZSAtPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGEuZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHVyaTogYS51cmksXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJ5UmVsZXZhbnQ6IHNjb3JlID4gMC42LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzID0gYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLnZhbGlkaXR5U3RhdGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9ICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSc7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG4udmFsaWRVbnRpbERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmluZ0RhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4udmFsaWRVbnRpbERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmdEYXRlIDwgdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSBkYWwgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZXhwaXJpbmdEYXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcuJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi52YWxpZGl0eURlc2NyaXB0aW9uID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lsIGRvY3VtZW50byBub24gc2Fyw6AgcGnDuSB2aWdlbnRlIGRhbCAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShleHBpcmluZ0RhdGUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gbi5kYXRlIDwgdG9kYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChncm91cEJ5WWVhcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHllYXIgPSBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKG4uZGF0ZSwgRGF0ZUZvcm1hdC5Mb25nTW9udGhBbmRZZWFyKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwICE9PSB5ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4uZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgICAgICBncm91cCA9IHllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChncm91cEJ5UmVsZXZhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICAgICAgICBuLmdyb3VwID1cclxuICAgICAgICAgICAgICAgICAgICAnRWxlbmNvIHBlciByaWxldmFuemE6IGdsaSBlbGVtZW50aSBwacO5IGltcG9ydGFudGkgc29ubyBpbiB0ZXN0YSc7XHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBCeVBvcHVsYXJpdHkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChncm91cCAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4uZ3JvdXAgPVxyXG4gICAgICAgICAgICAgICAgICAgICdFbGVuY28gcGVyIHBvcG9sYXJpdMOgOiBnbGkgZWxlbWVudGkgcGnDuSBpbXBvcnRhbnRpIHNvbm8gaW4gdGVzdGEnO1xyXG4gICAgICAgICAgICAgICAgICBncm91cCA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKG4udGF4b25vbXkpIHtcclxuICAgICAgICAgICAgICAgIG4udGF4b25vbXlOb2RlcyA9IG4udGF4b25vbXkuc3BsaXQoJ1xcclxcbicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9PT1cclxuICAgICAgICAgICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0dVSURBIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fR1VJREFfTk9STUFUSVZBIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NIRURBX0FERU1QSU1FTlRJXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLnRheG9ub215Tm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG4udGF4b25vbXlOb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IG5vZGUuaW5kZXhPZignPicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwICE9PSAtMSlcclxuICAgICAgICAgICAgICAgICAgICAgIG4udGF4b25vbXlOb2Rlc1tpXSA9IG5vZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhwICsgMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcPi9naSwgJyA+ICcpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNob3cgdG9hc3QgaWYgbmV3IHNlYXJjaFxyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2gpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNUb29NYW55UmVzdWx0cyA9IHRoaXMuc25hcHNob3QudG90YWwgPj0gMTAwMDtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoICYmIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0ID0gdGhpcy4kZGlhbG9nLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdIbyB0cm92YXRvIHBpw7kgZGkgMTAwMCBlbGVtZW50aScsXHJcbiAgICAgICAgICAgICAgICAgICAgMzAwMCxcclxuICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ1JpZmluaXNjaSdcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdC5pbnN0YW5jZS5hY3Rpb24uc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy4kZGlhbG9nLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdIbyB0cm92YXRvICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3QudG90YWwgK1xyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnNuYXBzaG90LnRvdGFsID09PSAxID8gJyBlbGVtZW50bycgOiAnIGVsZW1lbnRpJylcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChuZXdTZWFyY2ggJiYgIXRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZmFjZXRzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldEZhY2V0cyh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgc25hcHNob3RcclxuICAgICAgICAgICAgdGhpcy4kY2xpcHBlci5zbmFwc2hvdCA9IHRoaXMuc25hcHNob3Q7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdmlld1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuJGRpYWxvZy5jbGVhckJ1c3koKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5ldyBwYWdlIHJlc3VsdFxyXG4gICAqIEBwYXJhbSBlIDogdGhlIE1hdFBhZ2luYXRvciBQYWdlRXZlbnQgZGF0YVxyXG4gICAqL1xyXG4gIGZldGNoTW9yZShlOiBhbnkpIHtcclxuICAgIGxldCBmaXJzdCA9IGUucGFnZUluZGV4ICogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY291bnQ7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5mZXRjaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgc2VhcmNoXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgbW9kdWxlOiBDbGlwcGVyRGVmaW5pdGlvbnMuTU9EX1NFTUFOVElDX1NFQVJDSCxcclxuICAgICAgbW9kZWw6IENsaXBwZXJEZWZpbml0aW9ucy5ETV9OT1JNQVRJVkFfVklHRU5URSxcclxuICAgICAgZmlyc3Q6IDAsXHJcbiAgICAgIGNvdW50OiAyNSxcclxuICAgIH07XHJcbiAgICB0aGlzLmN1cnJlbnRNb2RlbCA9ICdOb3JtYXRpdmEgdmlnZW50ZSc7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMuc25hcHNob3QudG90YWwgPSAwO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSBudWxsO1xyXG4gICAgdGhpcy5mYWNldHNTZWFyY2gucmVzZXQoKTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgdGhpcy51cGRhdGVTZWFyY2hJbmZvKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVuIGFuIGl0ZW1cclxuICAgKiBAcGFyYW0gZG9jdW1lbnRJZCA6IHRoZSBkb2N1bWVudCBpZFxyXG4gICAqIEBwYXJhbSBuZXdXaW5kb3c6IHRydWUgaWYgdGhlIGRvY3VtZW50IG11c3QgYmUgb3BlbiBpbnRvIGEgbmV3IHdpbmRvd1xyXG4gICAqL1xyXG4gIG9wZW4oZG9jdW1lbnRJZDogc3RyaW5nLCBuZXdXaW5kb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCFuZXdXaW5kb3cpIHRoaXMub3BlbkRvY3VtZW50KGRvY3VtZW50SWQpO1xyXG4gICAgZWxzZSB3aW5kb3cub3BlbignL2RvY3VtZW50by8nICsgZG9jdW1lbnRJZCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBhIGRvY3VtZW50XHJcbiAgICogQHBhcmFtIGRvY3VtZW50SWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBwcml2YXRlIG9wZW5Eb2N1bWVudChkb2N1bWVudElkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZG9jdW1lbnRJZCkgcmV0dXJuO1xyXG4gICAgQ2xpcHBlckRvY3VtZW50c1V0aWxzLm9wZW5Eb2N1bWVudChcclxuICAgICAgdGhpcy4kZGlhbG9nLFxyXG4gICAgICB0aGlzLiRjbGlwcGVyLFxyXG4gICAgICBkb2N1bWVudElkLFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0LFxyXG4gICAgICB0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBvc2UgYSBmcmVlIHRleHQgc2VhcmNoIHF1ZXJ5XHJcbiAgICovXHJcbiAgY29tcG9zZVNlYXJjaCgpIHtcclxuICAgIGxldCBkID0gdGhpcy4kZGlhbG9nLm9wZW4oQ2xpcHBlclNlYXJjaEZyZWVUZXh0UXVlcnlCdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ2Nvc3RydWlzY2kgcmljZXJjYScsXHJcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICB9KTtcclxuICAgIGQuY29tcG9uZW50SW5zdGFuY2UuZG9uZVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0ID0gci5xdWVyeTtcclxuXHJcbiAgICAgICAgLy8gRmluaXNoZWRcclxuICAgICAgICBkLmNsb3NlKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGl0ZW0gc3RhdGUgY3NzIGNsYXNzXHJcbiAgICogQHBhcmFtIGl0ZW0gOiB0aGUgaXRlbSB0byBldmFsdWF0ZVxyXG4gICAqL1xyXG4gIGdldEl0ZW1TdGF0ZUNzc0NsYXNzKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0uaXNFeHBpcmVkKSByZXR1cm4gJ2l0ZW0tZXhwaXJlZC1pbmQnO1xyXG4gICAgaWYgKGl0ZW0ucG9wdWxhcml0eSA9PT0gMykgcmV0dXJuICdpdGVtLXBvcHVsYXItaW5kJztcclxuICAgIGVsc2UgaWYgKGl0ZW0ucG9wdWxhcml0eSA+IDMpIHJldHVybiAnaXRlbS12ZXJ5LXBvcHVsYXItaW5kJztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBpdGVtIHN0YXRlIHRvb2x0aXAgdGV4dFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gZXZhbHVhdGVcclxuICAgKi9cclxuICBnZXRJdGVtU3RhdGVUb29sdGlwKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0uaXNFeHBpcmVkKSByZXR1cm4gJ05vbiBwacO5IHZpZ2VudGUnO1xyXG4gICAgaWYgKGl0ZW0ucG9wdWxhcml0eSA9PT0gMykgcmV0dXJuICdEb2N1bWVudG8gY29uIG51bWVybyBkaSBjaXRhemlvbmkgYWx0byc7XHJcbiAgICBlbHNlIGlmIChpdGVtLnBvcHVsYXJpdHkgPiAzKVxyXG4gICAgICByZXR1cm4gJ0RvY3VtZW50byBjb24gbnVtZXJvIGRpIGNpdGF6aW9uaSBtb2x0byBhbHRvJztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBpdGVtIGxpbmsgb3IgYWxsIHNlbGVjdGVkIG9uZXMgYnkgZW1haWxcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBvcHRpb25hbCBpdGVtXHJcbiAgICovXHJcbiAgc2VuZFRvKGl0ZW06IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2VuZEl0ZW1zVG8oaXRlbSA/IFtpdGVtXSA6IHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnJvd3NlIGRvY3VtZW50IHJlZmVyZW5jZXNcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudCBpdGVtXHJcbiAgICogQHBhcmFtIG1vZGUgOiB0aGUgbW9kZVxyXG4gICAqL1xyXG4gIHJlZmVyZW5jZXMoaXRlbTogYW55LCBtb2RlOiBudW1iZXIgPSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fUkVGRVJFTkNFU19JTikge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm47XHJcbiAgICBsZXQgZCA9IHRoaXMuJGRpYWxvZy5vcGVuKENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ3JpZmVyaW1lbnRpIGxlZ2F0aSBhbCBkb2N1bWVudG8nLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICBjbG9zZU9uTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHsgaWQ6IGl0ZW0uZG9jdW1lbnRJZCwgbW9kZTogbW9kZSB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAncmVmZXJlbmNlcy1jb250YWluZXInLFxyXG4gICAgICBtaW5XaWR0aDogJzM3NXB4JyxcclxuICAgICAgbWF4V2lkdGg6ICcxMDAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICAgIGhlaWdodDogJzk5JScsXHJcbiAgICB9KTtcclxuICAgIGQuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAociAmJiByLmlkKSB0aGlzLm9wZW4oci5pZCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheSBhIGRvY3VtZW50IHJlcG9ydFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGRvY3VtZW50XHJcbiAgICovXHJcbiAgcmVwb3J0KGl0ZW06IGFueSkge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm47IGlmICghaXRlbSkgcmV0dXJuO1xyXG4gICAgaWYgKGl0ZW0ubW9kZWwgIT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX05PUk1BVElWQV9WSUdFTlRFICYmIGl0ZW0ubW9kZWwgIT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX1NDQURFTlpBKSB7XHJcbiAgICAgIHRoaXMuJGRpYWxvZy5pbmZvKFwiUXVlc3RhIGZ1bnppb25hbGl0w6Agbm9uIMOoIGRpc3BvbmliaWxlIHBlciBxdWVzdG8gdGlwbyBkaSBkb2N1bWVudG8uXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IHRoaXMub3BlblJlcG9ydChpdGVtLmRvY3VtZW50SWQsIGl0ZW0udGl0bGUxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBQZXJmb3JtIHNlYXJjaFxyXG4gKi9cclxuICBzZWFyY2goKSB7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2VjdG9yID09PSB0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IpXHJcbiAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvciA9IG51bGw7XHJcblxyXG4gICAgLy8gUmVzZXQgcGFnaW5hdG9yXHJcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgLy8gUmVzZXQgZmFjZXRzIHNlYXJjaFxyXG4gICAgdGhpcy5mYWNldHNTZWFyY2gucmVzZXQoKTtcclxuXHJcbiAgICAvLyBEbyBzZWFyY2hcclxuICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFkdmFuY2VkIHNlYXJjaFxyXG4gICAqL1xyXG4gIGFkdmFuY2VkU2VhcmNoKCkge1xyXG4gICAgbGV0IGQgPSB0aGlzLiRkaWFsb2cub3BlbihDbGlwcGVyU2VhcmNoRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ3JpY2VyY2EgYXZhbnphdGEnLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgcGFyYW1zOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyxcclxuICAgICAgICBlbmFibGVSZWFkOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTZWN0b3I6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVHlwZTogdHJ1ZSxcclxuICAgICAgICBlbmFibGVBdXRob3I6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVG9waWM6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVGV4dDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVEb2N1bWVudDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVTb3VyY2U6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzcwMHB4JyxcclxuICAgICAgd2lkdGg6ICc5OSUnLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRvbmVcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHNlYXJjaCBwYXJhbXNcclxuICAgICAgICByLm1vZGVsID0gdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWw7XHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMgPSByO1xyXG4gICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0ID0gMDtcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5jb3VudCA9IDI1O1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgPT09IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvcilcclxuICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvciA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHBhZ2luYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgZmFjZXRzIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIC8vIERvIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIEZpbmlzaGVkXHJcbiAgICAgICAgZC5jbG9zZSgpO1xyXG5cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogU2hvdyBmcmVlIHRleHQgaGVscFxyXG4gKi9cclxuICBoZWxwU2VhcmNoKCkge1xyXG4gICAgdGhpcy4kZGlhbG9nLm9wZW4oQ2xpcHBlclNlYXJjaEZyZWVUZXh0SGVscENvbXBvbmVudCwge1xyXG4gICAgICBhcmlhTGFiZWw6ICdpbmZvcm1hemlvbmkgcmljZXJjYScsXHJcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnODAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYW5hZ2UgY2xpcHBlciBiYWdcclxuICAgKi9cclxuICBtYW5hZ2VCYWcoKSB7XHJcbiAgICBsZXQgaXRlbXM6IGFueSA9IFtdO1xyXG4gICAgdGhpcy4kY2xpcHBlci5iYWcuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgIGxldCB0aXRsZSA9IG4uVGl0bGUxID8gbi5UaXRsZTEgOiBuLlRpdGxlMjtcclxuICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgdGVtcGxhdGU6IHRpdGxlLFxyXG4gICAgICAgIGJhZzogbixcclxuICAgICAgICBzZWFyY2hCYWc6IHsgbmFtZTogdGl0bGUgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBkID0gdGhpcy4kZGlhbG9nLnNlbGVjdCh7XHJcbiAgICAgIHRpdGxlOiAnR2VzdGlzY2kgZG9jdW1lbnRpIGRpIGxhdm9ybycsXHJcbiAgICAgIG11bHRpOiBmYWxzZSxcclxuICAgICAgbXVzdFNlbGVjdDogZmFsc2UsXHJcbiAgICAgIG9rQ2FwdGlvbjogJ1NFTEVaSU9OQScsXHJcbiAgICAgIGl0ZW1zOiBpdGVtcyxcclxuICAgICAgY2FuRGVsZXRlOiB0cnVlLFxyXG4gICAgICBjYW5WaWV3OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLnZpZXdcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW0gPSByLmJhZztcclxuICAgICAgICB0aGlzLm9wZW4oaXRlbS5Eb2N1bWVudElkKTtcclxuICAgICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRlbGV0ZVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB2YXIgaXRlbSA9IHIuc2VsZWN0ZWRJdGVtc1swXS5iYWc7XHJcbiAgICAgICAgdGhpcy4kY2xpcHBlci5yZW1vdmVGcm9tQmFnKGl0ZW0uRG9jdW1lbnRJZCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuJGRpYWxvZy50b2FzdCgnT3BlcmF6aW9uZSBjb21wbGV0YXRhIGNvbiBzdWNjZXNzby4nKTtcclxuICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgci5pdGVtcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICBpZiAoci5pdGVtc1twXS5iYWcuRG9jdW1lbnRJZCA9PT0gaXRlbS5Eb2N1bWVudElkKSB7XHJcbiAgICAgICAgICAgICAgci5pdGVtcy5zcGxpY2UocCwgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHIuaXRlbXMubGVuZ3RoID09PSAwKSBkLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgaG9tZSB0YWJcclxuICAgKi9cclxuICBzaG93SG9tZSgpIHtcclxuICAgIHRoaXMuZGlhbG9nVGFiID0gMjtcclxuICAgIGlmICh0aGlzLiRjbGlwcGVyLmxvZ2dlZEluICYmICF0aGlzLmxhc3QxNURheXMuZGF5c0xvYWRlZCkgdGhpcy5sYXN0MTVEYXlzLmZldGNoKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgb3IgY29sbGFwc2UgaG9tZSBkYXlzIHZpZXdcclxuICAgKiBAcGFyYW0gY29sbGFwc2VcclxuICAgKi9cclxuICBleHBhbmRIb21lKGNvbGxhcHNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIHRoaXMubGFzdDE1RGF5cy5leHBhbmQoY29sbGFwc2UpXHJcbiAgfVxyXG4gIFxyXG4gIC8vXHJcbiAgLy8gUmVnaXN0cm8gZSBzY2FkZW56YXJpb1xyXG4gIC8vXHJcblxyXG4gIC8qKlxyXG4gKiBDaGVja3MgaWYgYWxsIGRvY3VtZW50cyBhcmUgc3VwcG9ydGVkIGJ5IFJTXHJcbiAqIEBwYXJhbSBkb2N1bWVudHMgOiB0aGUgbGlzdCBvZiBkb2N1bWVuc1xyXG4gKiBAcmV0dXJuczogdHJ1ZSBpZiBhbGwgZG9jdW1lbnRzIHN1cHBvcnRzIFJTXHJcbiAqL1xyXG4gIFJTX2VuYWJsZWQoZG9jdW1lbnRzOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghZG9jdW1lbnRzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgYWxsb3cgPSBmYWxzZTtcclxuICAgIGRvY3VtZW50cy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgYWxsb3cgPSBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fTk9STUFUSVZBX1ZJR0VOVEUgfHxcclxuICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fQUdHSU9STkFNRU5UT19OT1JNQVRJVk8gfHxcclxuICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NBREVOWkE7XHJcbiAgICAgIGlmICghYWxsb3cpIHJldHVybjtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFsbG93O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmV3IGxhd1xyXG4gICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGxhd1xyXG4gICAqL1xyXG4gIFJTX25ld0xhdyhkb2N1bWVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwIHx8ICF0aGlzLiRjbGlwcGVyLnN1cHBvcnRzUlMpIHJldHVybjtcclxuICAgIHRoaXMuJGJyb2FkY2FzdC5zZW5kTWVzc2FnZShDbGlwcGVyTWVzc2FnZXMuSU5URVJPUF9SU19ORVdfTEFXLCBkb2N1bWVudCA/IFtkb2N1bWVudF0gOiB0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5ldyBhY3Rpdml0eVxyXG4gICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGxhd1xyXG4gICAqL1xyXG4gIFJTX25ld0FjdGl2aXR5KGRvY3VtZW50OiBhbnkpIHtcclxuICAgIGlmICghZG9jdW1lbnQpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA+IDAgfHwgIXRoaXMuJGNsaXBwZXIuc3VwcG9ydHNSUykgcmV0dXJuO1xyXG4gICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX05FV19BQ1RJVklUWSwgZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBEb2N1bWVudCB1c2FnZSByZXBvcnRcclxuICAgKiBAcGFyYW0gZG9jdW1lbnQ6IHRoZSBsYXdcclxuICAgKi9cclxuICAgIFJTX3VzYWdlUmVwb3J0KGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwIHx8ICF0aGlzLiRjbGlwcGVyLnN1cHBvcnRzUlMpIHJldHVybjtcclxuICAgICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX1VTQUdFX1JFUE9SVCwgZG9jdW1lbnQpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGlkPVwiY2xpcHBlci1icm93c2VyLWZpeGVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNsaXBwZXItYnJvd3Nlci1oZWFkZXJcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY2xpcHBlci5hcnNlZGl6aW9uaS5pdFwiIG1hdFRvb2x0aXA9XCJBcHJpIENsaXBwZXIgaW4gdW4gbnVvdm8gdGFiXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICA8aW1nIHNyYz1cIi4vLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy9jbGlwcGVyX2xvZ28ucG5nXCIgYWx0PVwiQ2xpcHBlclwiIHN0eWxlPVwibWF4LWhlaWdodDogNTBweDsgcGFkZGluZzogNXB4XCIgLz5cclxuICAgICAgICA8L2E+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBAaWYgKGRhdGEuc2VsZWN0aW9uTW9kZSA+IDApIHtcclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgQGlmIChjYW5TZWxlY3QoKSkge1xyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3QoKVwiPlxyXG4gICAgICAgICAgICBVc2Egc2VsZXppb25lXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdiBmeEZsZXg9XCIxNTBweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgICBAaWYgKCRjbGlwcGVyLmJhZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkRvY3VtZW50aSBkaSBsYXZvcm9cIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIidEb2N1bWVudGkgZGkgbGF2b3JvJ1wiIChjbGljayk9XCJtYW5hZ2VCYWcoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbbWF0QmFkZ2VdPVwiJGNsaXBwZXIuYmFnLmxlbmd0aFwiIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIj53b3JrX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXRUb29sdGlwPVwiQ2hpdWRpXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaGl1ZGlcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8bmF2IG1hdC10YWItbmF2LWJhciBtYXQtc3RyZXRjaC10YWJzIFt0YWJQYW5lbF09XCJ0YWJQYW5lbDFcIj5cclxuICAgIDxhIG1hdC10YWItbGluayAoY2xpY2spPVwiZGlhbG9nVGFiID0gMVwiIFthY3RpdmVdPVwiZGlhbG9nVGFiID09PSAxXCIgW2Rpc2FibGVkXT1cIiEkY2xpcHBlci5sb2dnZWRJblwiPlJpY2VyY2E8L2E+XHJcbiAgICA8YSBtYXQtdGFiLWxpbmsgKGNsaWNrKT1cInNob3dIb21lKClcIiBbYWN0aXZlXT1cImRpYWxvZ1RhYiA9PT0gMlwiIFtkaXNhYmxlZF09XCIhJGNsaXBwZXIubG9nZ2VkSW5cIj5cclxuICAgICAgPG1hdC1pY29uPnVwZGF0ZTwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuIGZ4SGlkZS54cyBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHhcIj4gVWx0aW1pIDE1IGdpb3JuaTwvc3Bhbj5cclxuICAgIDwvYT5cclxuICA8L25hdj5cclxuICA8bWF0LXRhYi1uYXYtcGFuZWwgI3RhYlBhbmVsMT48L21hdC10YWItbmF2LXBhbmVsPlxyXG4gIDxkaXYgW2hpZGRlbl09XCJkaWFsb2dUYWIgIT09IDFcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNXB4IDAgMTBweCAxNXB4XCI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlblwiIGZ4RmlsbD5cclxuICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleC54cz1cIjYyXCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9JzEwcHgnIGZ4RmlsbD5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+TnVtZXJvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMubnVtYmVyXCIgI251bWJlcj1cIm5nTW9kZWxcIiBuYW1lPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCIgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMubnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggYXJpYS1sYWJlbD1cIkF6emVyYVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLm51bWJlciA9IG51bGw7XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+QW5ubzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhclwiICN5ZWFyPVwibmdNb2RlbFwiIG5hbWU9XCJ5ZWFyXCIgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI0XCIgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCIgLz5cclxuICAgICAgICAgICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIlB1bGlzY2lcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyID0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGlmICh5ZWFyLmludmFsaWQpIHtcclxuICAgICAgICAgICAgICA8bWF0LWVycm9yPk5vbiB2YWxpZG8uPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5QYXJvbGUsIGZyYXNpIG8gY29uY2V0dGkuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3NlYXJjaElucHV0PVwibWF0SW5wdXRcIiB0eXBlPVwidGV4dFwiICN0ZXh0IFsobmdNb2RlbCldPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHRcIlxyXG4gICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjAwXCIgKGtleXVwLkVudGVyKT1cInNlYXJjaCgpXCIgYXV0b2ZvY3VzIC8+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJQdWxpc2NpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCA9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiQ29tcG9uaVwiIG1hdFRvb2x0aXA9XCJDb21wb25pXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0ZXh0LmZvY3VzKCk7IGNvbXBvc2VTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmJ1aWxkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiSW5mb3JtYXppb25pXCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21lIGVmZmV0dHVhcmUgbGEgcmljZXJjYSBpbiB0ZXN0byBsaWJlcm9cIiAoY2xpY2spPVwidGV4dC5mb2N1cygpOyBoZWxwU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5oZWxwX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXgueHM9XCIzNlwiPlxyXG4gICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeEZpbGw+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzZWFyY2goKVwiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQXZ2aWEgbGEgcmljZXJjYSdcIiBtYXRUb29sdGlwPVwiQXZ2aWEgcmljZXJjYVwiIFtkaXNhYmxlZF09XCIhJGNsaXBwZXIubG9nZ2VkSW5cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZHZhbmNlZFNlYXJjaCgpXCIgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSaWNlcmNhIGF2YW56YXRhJ1wiIG1hdFRvb2x0aXA9XCJSaWNlcmNhIGF2YW56YXRhXCIgW2Rpc2FibGVkXT1cIiEkY2xpcHBlci5sb2dnZWRJblwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBAaWYgKHNuYXBzaG90LnNlYXJjaEluZm8gJiYgc25hcHNob3Quc2VhcmNoSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICA8ZGl2IGZ4SGlkZS54cyBjbGFzcz1cInNlYXJjaC1pbmZvIHNtYWxsXCI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICA8Yj5SSUNFUkNBIEFUVElWQTwvYj4mbmJzcDsmbmJzcDsmbmJzcDtcclxuICAgICAgICAgIEBmb3IgKHNpIG9mIHNuYXBzaG90LnNlYXJjaEluZm87IHRyYWNrIHNpKSB7XHJcbiAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAge3tzaS5zZXAgPyAnJm5ic3A7Jm5ic3A7JyA6ICcnfX0ge3tzaS5maWVsZH19OiA8c3BhblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1wcmltYXJ5IGxvd2VyY2FzZVwiPjxpPnt7c2kudmFsdWV9fTwvaT48L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cInN0YXJ0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkF6emVyYSByaWNlcmNhXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MCAwIDZweCAyMHB4O1wiIGZ4TGF5b3V0PVwicm93IHdyYXAtcmV2ZXJzZVwiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuXCIgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiPlxyXG4gICAgICAgICAgQGlmIChzbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgIDxkaXYgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZXppb25hL2Rlc2VsZXppb25hIHR1dHRvJ1wiIG1hdFRvb2x0aXA9XCJTZWxlemlvbmEvZGVzZWxlemlvbmEgdHV0dG9cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QuaXRlbXMgfHwgc25hcHNob3QuaXRlbXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiPlxyXG4gICAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsID4gMCkge1xyXG4gICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIk9yZGluYVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01lbnUgb3JkaW5hJ1wiXHJcbiAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVTb3J0XCIgY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cIiFzbmFwc2hvdC50b3RhbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5PcmRpbmEgcGVyOjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gZnhIaWRlLmd0LW1kPnNvcnQ8L21hdC1pY29uPiB7e2N1cnJlbnRTb3J0fX1cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnVTb3J0PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDMpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGRlY3Jlc2NlbnRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgRGF0YSBkZWNyZXNjZW50ZVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDIpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGNyZXNjZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIERhdGEgY3Jlc2NlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDEpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciByaWxldmFuemEnXCI+XHJcbiAgICAgICAgICAgICAgICBSaWxldmFuemFcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzb3J0QnkoNSlcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidPcmRpbmEgcGVyIHBvcG9sYXJpdMOgJ1wiPlxyXG4gICAgICAgICAgICAgICAgUG9wb2xhcml0w6BcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8IS0tIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDQpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09yZGluYSBwZXIgZGF0YSBkaSBpbnNlcmltZW50byBkZXNjcmVzY2VudGUnXCI+XHJcbiAgICAgICAgICAgICAgICBEYXRhIGRpIGluc2VyaW1lbnRvIGRlY3Jlc2NlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+LS0+XHJcbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG1vZGVsbG8nXCJcclxuICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudU1vZGVsc1wiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5Nb3N0cmE6PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmeEhpZGUuZ3QtbWQ+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPiB7e2N1cnJlbnRNb2RlbH19XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIGljb24tbWVudS1kcm9wLWRvd25cIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnVNb2RlbHM9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgyKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01vc3RyYSBhZ2dpb3JuYW1lbnRvIG5vcm1hdGl2bydcIj5cclxuICAgICAgICAgICAgICAgIEdhenpldHRlIGUgYm9sbGV0dGluaVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hhbmdlTW9kZWwoOSlcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidOb3JtYXRpdmEgdmlnZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIE5vcm1hdGl2YSB2aWdlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInTW9zdHJhIHR1dHRpIGkgZG9jdW1lbnRpJ1wiPlxyXG4gICAgICAgICAgICAgICAgVHV0dG9cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBtYXRUb29sdGlwPVwiQXppb25pIGRhIGVzZWd1aXJlIHN1Z2xpIGVsZW1lbnRpIHNlbGV6aW9uYXRpXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01lbnUgb3B6aW9uaSBwZXIgZWxlbWVudGkgc2VsZXppb25hdGknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVTZWxlY3Rpb25zXCJcclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW21hdEJhZGdlXT1cInNlbGVjdGlvbi5hbGwubGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiPnBsYXlsaXN0X2FkZF9jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgPGNsaXBwZXItZG9jdW1lbnQtbWVudSBbcGFyZW50XT1cInRoaXNcIiBzZWxlY3Rpb25Tb3VyY2U9XCJzZWxlY3Rpb25cIiBbaXNTZWxlY3RhYmxlXT1cImNhblNlbGVjdCgpXCJcclxuICAgICAgICAgICAgW2lzUmVhZGFibGVdPVwiZmFsc2VcIiBbaXNMYXdJbkZvcmNlXT1cInRydWVcIj5cclxuICAgICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgQGlmIChmYWNldHNTZWFyY2ggJiYgZmFjZXRzU2VhcmNoLmhhc0ZhY2V0cyAmJiBmYWNldHNTaWRlbmF2ICYmICghZmFjZXRzU2lkZW5hdi5vcGVuZWQgfHwgZmFjZXRzQ2xvc2VkKSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdFRvb2x0aXA9XCJBZmZpbmEgcmljZXJjYVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJ0FmZmluYSByaWNlcmNhJ1wiIChjbGljayk9XCJmYWNldHNPcGVuKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5tZW51X29wZW48L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IFtoaWRkZW5dPVwiZGlhbG9nVGFiICE9PSAyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlIGZvcm0tY29sdW1uXCI+XHJcbiAgICAgIDxwPkVjY28gY29zYSDDqCBzdWNjZXNzbyBuZWdsaSB1bHRpbWkgMTUgZ2lvcm5pIGluIGJhc2UgYWxsYSB0dWEgY29uZmlndXJhemlvbmUuPC9wPlxyXG4gICAgICA8cD5QZXIgbW9kaWZpY2FyZSBsYSB0dWFcclxuICAgICAgICBjb25maWd1cmF6aW9uZSBkZXZpIGFjY2VkZXJlIGEgPGEgY2xhc3M9XCJsaW5rXCIgaHJlZj1cImh0dHBzOi8vY2xpcHBlci5hcnNlZGl6aW9uaS5pdFwiXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiQXByaSBDbGlwcGVyIGluIHVuIG51b3ZvIHRhYlwiIHRhcmdldD1cIl9ibGFua1wiPkNsaXBwZXI8L2E+LjwvcD5cclxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPScxMHB4JyBmeEZpbGw+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJFc3BhbmRpIHR1dHRvXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRXNwYW5kaSB0dXR0byBcXCBjb21wcmltaSB0dXR0bydcIlxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZXhwYW5kSG9tZSgpXCI+XHJcbiAgICAgICAgICAgIEVzcGFuZGkgdHV0dG9cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJDb21wcmltaSB0dXR0b1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvbXByaW1pIHR1dHRvJ1wiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRIb21lKHRydWUpXCI+XHJcbiAgICAgICAgICAgIENvbXByaW1pIHR1dHRvXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50IHN0eWxlPVwicGFkZGluZzowIDAgMCAxNXB4XCIgW25nU3R5bGVdPVwieydtaW4taGVpZ2h0LnB4JzogY29udGVudEhlaWdodH1cIj5cclxuICA8ZGl2IFtoaWRkZW5dPVwiZGlhbG9nVGFiICE9PSAxXCI+XHJcbiAgICA8bWF0LXNpZGVuYXYtY29udGFpbmVyIFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzogY29udGVudEhlaWdodH1cIj5cclxuICAgICAgPG1hdC1zaWRlbmF2ICNmYWNldHNTaWRlbmF2IHBvc2l0aW9uPVwiZW5kXCIgYXV0b0ZvY3VzPVwiZmFsc2VcIiBvcGVuZWQ9XCJmYWxzZVwiIG1vZGU9XCJ7e2ZhY2V0c01vZGV9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJzaWRlbmF2IHNpZGVuYXYtZmFjZXRzXCI+XHJcbiAgICAgICAgQGlmIChmYWNldHNTZWFyY2guYnVzeSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6NXB4XCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmFjZXRzU2VhcmNoLmJ1c3kpIHtcclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgY2xhc3M9XCJzaWRlbmF2LWxvYWRlclwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNjRweFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGaWxsIGNsYXNzPVwic2lkZW5hdi10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaWRlbmF2LXRpdGxlXCI+QWZmaW5hIHJpY2VyY2E8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiIChjbGljayk9XCJmYWNldHNDbG9zZSh0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1mYWNldHMgI2ZhY2V0c1NlYXJjaD48L2NsaXBwZXItc2VhcmNoLWZhY2V0cz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L21hdC1zaWRlbmF2PlxyXG4gICAgICA8bWF0LXNpZGVuYXYtY29udGVudD5cclxuICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzogY29udGVudEhlaWdodCB9XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGlkPVwic2VhcmNoX2NvbnRhaW5lclwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MzJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiIGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICBOb24gaGFpIGFuY29yYSBlZmZldHR1YXRvXHJcbiAgICAgICAgICAgICAgICAgICAgbGEgdHVhIHByaW1hIHJpY2VyY2Egb3BwdXJlIGxhIHJpY2VyY2EgZWZmZXR0dWF0YSBub24gaGEgcHJvZG90dG8gYWxjdW4gcmlzdWx0YXRvLjwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+SW5zZXJpc2NpIG5lbGwnYXBwb3NpdG8gY2FtcG8gY2nDsiBjaGUgaW50ZW5kaSBjZXJjYXJlIGUgZmFpIGNsaWNrIHN1IDxiPlRyb3ZhPC9iPiBvcHB1cmUgdXRpbGl6emFcclxuICAgICAgICAgICAgICAgICAgICBsYVxyXG4gICAgICAgICAgICAgICAgICAgIDxiPlJpY2VyY2EgYXZhbnphdGE8L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD4uXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNuYXBzaG90Lml0ZW1zOyB0cmFjayB0cmFja2FibGVJZCgkaW5kZXgsIGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyKT1cIml0ZW0uaXNPdmVyID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaXRlbS5pc092ZXIgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtcy1ncm91cC10aXRsZSBpdGVtLWFjY2VudFwiPnt7aXRlbS5ncm91cH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeEZpbGwgY2xhc3M9XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXRlbS1zZWxlY3RlZCc6IHNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0pIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNDhweFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoJHNjcmVlbi5pc1RvdWNoYWJsZSB8fCBpdGVtLmlzT3ZlciB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtLmRvY3VtZW50SWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggZnhMYXlvdXRBbGlnbj1cImNlbnRlclwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShpdGVtLCBpdGVtLmRvY3VtZW50SWQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1yZXN1bHQtaXRlbSBbcGFyZW50XT1cInRoaXNcIiBbaXRlbV09XCJpdGVtXCI+PC9jbGlwcGVyLXNlYXJjaC1yZXN1bHQtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaXNPdmVyIHx8IGl0ZW0uaXNNZW51T3BlbiB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJEYXRhXT1cIntpdGVtOiBpdGVtfVwiIChjbGljayk9XCJpdGVtLmlzTWVudU9wZW4gPSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGRpdiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZFwiIFtzdHlsZS5sZWZ0XT1cImNvbnRleHRNZW51UG9zaXRpb24ueFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnlcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29udGV4dE1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2NvbnRleHRNZW51PVwibWF0TWVudVwiIChjbG9zZWQpPVwidXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2xpcHBlci1kb2N1bWVudC1tZW51IFtwYXJlbnRdPVwidGhpc1wiIFtpdGVtXT1cIml0ZW1cIiBbaXNTZWxlY3RhYmxlXT1cImNhblNlbGVjdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZGFibGVdPVwiZmFsc2VcIiBbaXNMYXdJbkZvcmNlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0IC8gc25hcHNob3Quc2VhcmNoUGFyYW1zLmNvdW50XCIgW2xlbmd0aF09XCJzbmFwc2hvdC50b3RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5jb3VudFwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCIgKHBhZ2UpPVwiZmV0Y2hNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtc2lkZW5hdi1jb250ZW50PlxyXG4gICAgPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBbaGlkZGVuXT1cImRpYWxvZ1RhYiAhPT0gMlwiPlxyXG4gICAgPGNsaXBwZXItbGFzdC0xNS1kYXlzICNsYXN0MTVEYXlzIFtzaG93SGVhZGVyXT1cImZhbHNlXCI+PC9jbGlwcGVyLWxhc3QtMTUtZGF5cz5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
1219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvYnJvd3Nlci1kaWFsb2cvYnJvd3Nlci1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQWdCLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBa0IsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBRUwsVUFBVSxFQUVWLGVBQWUsRUFDZixXQUFXLEVBQ1osTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFdBQVcsRUFFWCxlQUFlLEVBQ2Ysa0JBQWtCLEdBR25CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDBCQUEwQixF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LDZCQUE2QjtrQkFsQ3pDLFNBQVM7MkJBQ0EsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLGFBR2pDO3dCQUNQLCtDQUErQztxQkFDbEQsY0FDVyxJQUFJLFdBQ1A7d0JBQ0wsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQiw0QkFBNEI7d0JBQzVCLGdCQUFnQjt3QkFDaEIsT0FBTzt3QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsNEJBQTRCO3dCQUM1QixPQUFPO3dCQUNQLGdDQUFnQzt3QkFDaEMsa0JBQWtCO3dCQUNsQiwwQkFBMEI7cUJBQzdCOzswQkE2Q0EsTUFBTTsyQkFBQyxlQUFlO3lDQXhDRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNBLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDQyxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1csV0FBVztzQkFBM0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZWRpYUNoYW5nZSwgTWVkaWFPYnNlcnZlciB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIsIE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2LCBNYXRTaWRlbmF2TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZUb2RheSwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHtcclxuICBCcm9hZGNhc3RTZXJ2aWNlLFxyXG4gIERhdGVGb3JtYXQsXHJcbiAgU2NyZWVuU2VydmljZSxcclxuICBTZWxlY3RhYmxlTW9kZWwsXHJcbiAgU3lzdGVtVXRpbHNcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gIFNlYXJjaFV0aWxzLFxyXG4gIENsaXBwZXJTZXJ2aWNlLFxyXG4gIENsaXBwZXJNZXNzYWdlcyxcclxuICBDbGlwcGVyRGVmaW5pdGlvbnMsXHJcbiAgQ2xpcHBlckRpYWxvZ0RhdGEsXHJcbiAgRG9jdW1lbnRTZWFyY2hTbmFwc2hvdCxcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NsaXBwZXIuY29tbW9uJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2Jhc2UvZG9jdW1lbnQtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudCB9IGZyb20gJy4uL3JlZmVyZW5jZXMvcmVmZXJlbmNlcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWRpYWxvZy9zZWFyY2gtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZmFjZXRzL3NlYXJjaC1mYWNldHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZyZWVUZXh0SGVscENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1mcmVlLXRleHQtaGVscC9zZWFyY2gtZnJlZS10ZXh0LWhlbHAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZyZWVUZXh0UXVlcnlCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoLWZyZWUtdGV4dC1xdWVyeS1idWlsZGVyL3NlYXJjaC1mcmVlLXRleHQtcXVlcnktYnVpbGRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyRG9jdW1lbnRzVXRpbHMgfSBmcm9tICcuLi9kb2N1bWVudC9kb2N1bWVudHMnO1xyXG5pbXBvcnQgeyBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xyXG5pbXBvcnQgeyBDbGlwcGVyTGFzdDE1RGF5c0NvbXBvbmVudCB9IGZyb20gJy4uL2xhc3QtMTUtZGF5cy9sYXN0LTE1LWRheXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaFJlc3VsdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtcmVzdWx0LWl0ZW0vc2VhcmNoLXJlc3VsdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2RvY3VtZW50LW1lbnUvZG9jdW1lbnQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBFeHRlbmRlZE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9leHRlbmRlZCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgICBOZ1N0eWxlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXgnO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRpYWxvZ1NlcnZpY2UgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2Jyb3dzZXItZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUlxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgRmxleE1vZHVsZSxcclxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLCAgICAgIFxyXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgICAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxyXG4gICAgICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICAgICAgRXh0ZW5kZWRNb2R1bGUsXHJcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXHJcbiAgICAgICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgICAgICBDbGlwcGVyRG9jdW1lbnRNZW51Q29tcG9uZW50LFxyXG4gICAgICAgIE1hdERpYWxvZ0NvbnRlbnQsXHJcbiAgICAgICAgTmdTdHlsZSxcclxuICAgICAgICBNYXRTaWRlbmF2TW9kdWxlLFxyXG4gICAgICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxyXG4gICAgICAgIENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQsXHJcbiAgICAgICAgTmdDbGFzcyxcclxuICAgICAgICBDbGlwcGVyU2VhcmNoUmVzdWx0SXRlbUNvbXBvbmVudCxcclxuICAgICAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICAgICAgQ2xpcHBlckxhc3QxNURheXNDb21wb25lbnQsXHJcbiAgICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2xpcHBlckJyb3dzZXJEaWFsb2dDb21wb25lbnRcclxuICBleHRlbmRzIENsaXBwZXJEb2N1bWVudEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTaWRlbmF2JykgZmFjZXRzU2lkZW5hdjogTWF0U2lkZW5hdjtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTZWFyY2gnKSBmYWNldHNTZWFyY2g6IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnRcclxuICBAVmlld0NoaWxkKCdsYXN0MTVEYXlzJykgbGFzdDE1RGF5czogQ2xpcHBlckxhc3QxNURheXNDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgncGFnaW5hdG9yJykgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51VHJpZ2dlcicpIGNvbnRleHRNZW51ITogTWF0TWVudVRyaWdnZXI7XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfX2QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZGlhbG9nVGFiOiBudW1iZXIgPSAxO1xyXG4gIGRhdGE6IENsaXBwZXJEaWFsb2dEYXRhID0ge307XHJcbiAgdGl0bGU6IHN0cmluZyA9ICdSaWNlcmNhIGluIENsaXBwZXInO1xyXG4gIHRyYWNrYWJsZUlkID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4geyBpbmRleCA+PSAwID8gaXRlbS5pZCA6IDAgfVxyXG4gIHNlbGVjdGlvbjogU2VsZWN0YWJsZU1vZGVsPGFueSwgc3RyaW5nPiA9IG5ldyBTZWxlY3RhYmxlTW9kZWwodHJ1ZSwgJ2RvY3VtZW50SWQnKTtcclxuICBzbmFwc2hvdDogRG9jdW1lbnRTZWFyY2hTbmFwc2hvdCA9IHtcclxuICAgIHNlYXJjaEluZm86IG51bGwsXHJcbiAgICBzZWFyY2hQYXJhbXM6IHtcclxuICAgICAgbW9kdWxlOiBDbGlwcGVyRGVmaW5pdGlvbnMuTU9EX1NFTUFOVElDX1NFQVJDSCxcclxuICAgICAgbW9kZWw6IG51bGwsXHJcbiAgICAgIGZpcnN0OiAwLFxyXG4gICAgICBjb3VudDogMjVcclxuICAgIH0sXHJcbiAgfTtcclxuICBmYWNldHNNb2RlOiBzdHJpbmcgPSAnc2lkZSc7XHJcbiAgZmFjZXRzQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudE1vZGVsOiBzdHJpbmcgPSAnVHV0dG8nO1xyXG4gIGN1cnJlbnRTb3J0OiBzdHJpbmcgPSAnUmlsZXZhbnphJztcclxuICBjb250ZW50SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gIGNvbnRleHRNZW51UG9zaXRpb24gPSB7IHg6ICcwcHgnLCB5OiAnMHB4JyB9O1xyXG4gIG1xOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW06IGFueSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljICRkaWFsb2c6IEFwcGxpY2F0aW9uRGlhbG9nU2VydmljZSwgICAgXHJcbiAgICBwdWJsaWMgJGNsaXBwZXI6IENsaXBwZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljICRzY3JlZW46IFNjcmVlblNlcnZpY2UsXHJcbiAgICBwcml2YXRlICRicm9hZGNhc3Q6IEJyb2FkY2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsaXBwZXJCcm93c2VyRGlhbG9nQ29tcG9uZW50PixcclxuICAgIHByaXZhdGUgbWVkaWE6IE1lZGlhT2JzZXJ2ZXIsXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgX2RhdGE6IENsaXBwZXJEaWFsb2dEYXRhXHJcbiAgKSB7XHJcbiAgICBzdXBlcigkZGlhbG9nLCAkY2xpcHBlcik7XHJcblxyXG4gICAgLy8gU3RvcmUgZGlhbG9nIGRhdGFcclxuICAgIHRoaXMuZGF0YSA9IF9kYXRhID8/IHt9O1xyXG5cclxuICAgIC8vIFVzZSBzZXJ2aWNlIHNuYXBzaG90XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gJGNsaXBwZXIuc25hcHNob3Q7XHJcbiAgICBpZiAoIXRoaXMuc25hcHNob3QpXHJcbiAgICAgIHRoaXMuc25hcHNob3QgPSB7XHJcbiAgICAgICAgc2VhcmNoSW5mbzogbnVsbCxcclxuICAgICAgICBzZWFyY2hQYXJhbXM6IG51bGwsXHJcbiAgICAgIH07XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgICBtb2R1bGU6IENsaXBwZXJEZWZpbml0aW9ucy5NT0RfU0VNQU5USUNfU0VBUkNILFxyXG4gICAgICAgIG1vZGVsOiBudWxsLFxyXG4gICAgICAgIGZpcnN0OiAwLFxyXG4gICAgICAgIGNvdW50OiAyNSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIFN0b3JlIHNuYXBzaG90XHJcbiAgICAgICRjbGlwcGVyLnNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZXQgaW5pdGlhbCBtb2RlbFxyXG4gICAgdGhpcy5jaGFuZ2VNb2RlbChfZGF0YT8uaW5pdGlhbE1vZGVsLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy4kY2xpcHBlci52aXNpYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy4kYnJvYWRjYXN0LmdldE1lc3NhZ2UoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX2QkKSlcclxuICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgPT09IENsaXBwZXJNZXNzYWdlcy5ET0NVTUVOVF9TRUxFQ1RFRF9JTk5FUikge1xyXG4gICAgICAgICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5ET0NVTUVOVF9TRUxFQ1RFRCwgbWVzc2FnZS5kYXRhKTtcclxuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIFJlYWN0IHRvIG1lZGlhIHF1ZXJ5IGNoYW5nZXNcclxuICAgIHRoaXMubWVkaWFcclxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9fZCQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChjaGFuZ2VzOiBNZWRpYUNoYW5nZVtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tcSA9IGNoYW5nZXNbMF0ubXFBbGlhcztcclxuICAgICAgICB0aGlzLnVwZGF0ZUZhY2V0c1Zpc2liaWxpdHkodGhpcy5tcSk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gd2luZG93IHNpemUgY2hhbmdlXHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX19kJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIHNpZGVuYXYgc3RhdGUgY2hhbmdlXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NpZGVuYXYpXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb25maWd1cmUgZmFjZXQgc2VhY2ggY29tcG9uZXRcclxuICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoKSB7XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gdGhpcy5mYWNldHNTZWFyY2guZnJvbURhdGU7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudG9EYXRlID0gdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRJbnRlcnZhbCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFNlY3RvcilcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgPSB0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3I7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC50eXBlIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRUeXBlKVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnR5cGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50eXBlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2guYXV0aG9yIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRBdXRob3IpXHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYXV0aG9yID0gdGhpcy5mYWNldHNTZWFyY2guYXV0aG9yO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cykge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc3RvcmVGcm9tU25hcHNob3QodGhpcy5zbmFwc2hvdC5mYWNldHMpO1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cy5oYXNGYWNldHMpIHRoaXMuZmFjZXRzT3BlbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCAyNTApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl9fZCQubmV4dCgpO1xyXG4gICAgdGhpcy5fX2QkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLiRjbGlwcGVyLnZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQ29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbi54ID0gZXZlbnQuY2xpZW50WCArICdweCc7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51UG9zaXRpb24ueSA9IGV2ZW50LmNsaWVudFkgKyAncHgnO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5tZW51RGF0YSA9IHsgaXRlbTogaXRlbSB9O1xyXG4gICAgdGhpcy5jb250ZXh0TWVudS5vcGVuTWVudSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNpZGVuYXYgdmlzaWJpbGl0eVxyXG4gICAqIEBwYXJhbSBtcSA6IHRoZSBjdXJyZW50IG1lZGlhIHF1ZXJ5XHJcbiAgICovXHJcbiAgdXBkYXRlRmFjZXRzVmlzaWJpbGl0eShtcTogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgaWYgKCFtcSkgbXEgPSB0aGlzLiRzY3JlZW4ubXE7XHJcbiAgICBpZiAobXEgPT09ICd4cycpIHtcclxuICAgICAgdGhpcy5mYWNldHNNb2RlID0gJ292ZXInO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYub3BlbmVkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmFjZXRzTW9kZSA9ICdzaWRlJztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guaGFzRmFjZXRzICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2ICYmXHJcbiAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYudG9nZ2xlKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBmYWNldHNTaWRlbmF2IHNpZGViYXJcclxuICAgKi9cclxuICBmYWNldHNPcGVuKCkge1xyXG4gICAgdGhpcy5mYWNldHNDbG9zZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBmYWNldHMgc2lkZWJhclxyXG4gICAqIEBwYXJhbSBjbG9zZWRNYW51YWxseSA6IHR1cmUgaWYgZmFjZXRzIGhhcyBiZWVuIGNsb3NlZCBtYW51YWxseSBieSBjbGlja2luZyB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZmFjZXRzQ2xvc2UoY2xvc2VkTWFudWFsbHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubXEgIT09ICd4cycpIHRoaXMuZmFjZXRzQ2xvc2VkID0gY2xvc2VkTWFudWFsbHk7XHJcbiAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmYWNldHNcclxuICAgKiBAcGFyYW0gc2VhcmNoUGFyYW1zIDogdGhlIGN1cnJlbnQgc2VhcmNoIHBhcmFtcyB0byB1c2UgdG8gZ2F0aGVyIGZhY2V0c1xyXG4gICAqL1xyXG4gIGdldEZhY2V0cyhzZWFyY2hQYXJhbXM6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLiRjbGlwcGVyLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuZmFjZXRzU2VhcmNoKSByZXR1cm47XHJcbiAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuJGNsaXBwZXIucXVlcnlGYWNldHMoc2VhcmNoUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC51cGRhdGUoci52YWx1ZS5mYWNldHMsIHIudmFsdWUuaW50ZXJ2YWwpO1xyXG4gICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgIXRoaXMuZmFjZXRzQ2xvc2VkICYmIHRoaXMubXEgIT09ICd4cycpXHJcbiAgICAgICAgICB0aGlzLmZhY2V0c09wZW4oKTtcclxuICAgICAgICBlbHNlIHRoaXMuZmFjZXRzQ2xvc2UoKTtcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc25hcHNob3QuZmFjZXRzID0gdGhpcy5mYWNldHNTZWFyY2guc2F2ZVNuYXBzaG90KCk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBzZWxlY3RlZCBpZHNcclxuICAgKi9cclxuICBnZXRTZWxldGVjdElkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxMDApIHtcclxuICAgICAgdGhpcy4kZGlhbG9nLmVycm9yKCdMYSBzZWxlemlvbmUgbm9uIHB1w7IgY29udGVuZXJlIHBpw7kgZGkgMTAwIGVsZW1lbnRpLicpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBpZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgICAgaWRzLnB1c2gobi5kb2N1bWVudElkKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWRzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBhcmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuc25hcHNob3QuaXRlbXMubGVuZ3RoXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFzdGVyIHNlbGVjdGlvbiB0b2dnbGVcclxuICAgKiBAcGFybWEgYXJnczogZXZlbnQgaW5mb1xyXG4gICAqL1xyXG4gIG1hc3RlclNlbGVjdGlvblRvZ2dsZShhcmdzOiBhbnkpIHtcclxuICAgIGlmIChhcmdzLmNoZWNrZWQpXHJcbiAgICAgIHRoaXMuc25hcHNob3QuaXRlbXMuZm9yRWFjaCgocm93OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdywgcm93LmRvY3VtZW50SWQpXHJcbiAgICAgICk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc25hcHNob3QuaXRlbXMuZm9yRWFjaCgocm93OiBhbnkpID0+XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93LCByb3cuZG9jdW1lbnRJZClcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBkb2N1bWVudHMgY2FuIGJlIHNlbGVjdGVkIGFuZCByZXR1cm5lZCBhcyBtZXNzYWdlXHJcbiAgICovXHJcbiAgY2FuU2VsZWN0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFsbG93ID1cclxuICAgICAgdGhpcy5zZWxlY3Rpb24gJiZcclxuICAgICAgKCh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMSAmJlxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID09PSAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMiAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAxKSB8fFxyXG4gICAgICAgICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA9PT0gMyAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5sZW5ndGggPiAwKSk7XHJcbiAgICBpZiAoYWxsb3cgJiYgdGhpcy5kYXRhLnNlbGVjdGFibGVNb2RlbHM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudC5zZWxlY3RlZC5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuc2VsZWN0YWJsZU1vZGVscy5pbmRleE9mKG4ubW9kZWwpID09PSAtMSkge1xyXG4gICAgICAgICAgYWxsb3cgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbG93O1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgYSBtZXNzYWdlIHdpdGggY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsb3NlIGRpYWxvZ1xyXG4gICAqL1xyXG4gIHNlbGVjdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLiRicm9hZGNhc3Quc2VuZE1lc3NhZ2UoXHJcbiAgICAgICAgQ2xpcHBlck1lc3NhZ2VzLkRPQ1VNRU5UX1NFTEVDVEVELFxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZGlhbG9nXHJcbiAgICogQHBhcmFtIG5ld1JvdXRlOiB0aGUgbmV3IHJvdXRlIHRvIG5hdmlnYXRlIHRvXHJcbiAgICovXHJcbiAgY2xvc2UobmV3Um91dGU6IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG5ld1JvdXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VhcmNoX2NvbnRhaW5lcicpLnNjcm9sbFRvKDAsIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIG1lbnUgYnV0dG9ucyB2aXNpYmlsaXR5IHdoZW4gdGhlIG1lbnUgaXMgY2xvc2VkXHJcbiAgICovXHJcbiAgdXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5zbmFwc2hvdC5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgbi5pc01lbnVPcGVuID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBzb3J0XHJcbiAgICovXHJcbiAgdXBkYXRlU29ydE9wdGlvbnMoKSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9EQVRFX0FTQzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0ID0gJ0RhdGEgY3JlLic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9QT1BVTEFSSVRZOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUG9wb2xhcml0w6AnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5TUlRfUkVMRVZBTkNFOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnUmlsZXZhbnphJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX09SSUdJTkFMOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBpbnMuIGRlY3IuJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX1RBWE9OT01ZOlxyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnQXJnb21lbnRvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJEZWZpbml0aW9ucy5TUlRfREFURV9ERVNDO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNvcnQgPSAnRGF0YSBkZWNyLic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQWRqdXN0IHZpZXdcclxuICAgKi9cclxuICBhZGp1c3RWaWV3KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdmlld1xyXG4gICAqL1xyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICAvLyBVcGRhdGUgcm91dGVyIGhlaWdodFxyXG4gICAgbGV0IGEgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICBsZXQgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGlwcGVyLWJyb3dzZXItZml4ZWQnKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghYSB8fCAhYiB8fCBhID09PSAwKSB0aGlzLmFkanVzdFZpZXcoKTtcclxuICAgICAgbGV0IGhiID0gYi5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmIChoYiA9PT0gMCkgdGhpcy5hZGp1c3RWaWV3KCk7XHJcbiAgICAgIHRoaXMuY29udGVudEhlaWdodCA9IGEgLSBoYjtcclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3VycmVudCBzZWFyY2ggaW5mb1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlU2VhcmNoSW5mbygpIHtcclxuICAgIGxldCBzaSA9IFtdO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvcilcclxuICAgICkge1xyXG4gICAgICBsZXQgcyA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TRUNUT1JTLFxyXG4gICAgICAgICdpZCcsXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2guc2VjdG9yXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3JcclxuICAgICAgKTtcclxuICAgICAgaWYgKHMpIHtcclxuICAgICAgICBzaS5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkOiAnc2V0dG9yZScsXHJcbiAgICAgICAgICB2YWx1ZTogcy5uYW1lLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzID0gU3lzdGVtVXRpbHMuYXJyYXlGaW5kQnlLZXkoXHJcbiAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuTU9ERUxTLFxyXG4gICAgICAgICAgJ2lkJyxcclxuICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvclxyXG4gICAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvclxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHMpIHtcclxuICAgICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NlemlvbmUnLFxyXG4gICAgICAgICAgICB2YWx1ZTogcy5uYW1lLFxyXG4gICAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYXV0aG9yIHx8XHJcbiAgICAgICh0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3IpXHJcbiAgICApIHtcclxuICAgICAgbGV0IGEgPSBTeXN0ZW1VdGlscy5hcnJheUZpbmRCeUtleShcclxuICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU0VDVE9SX0FVVEhPUlMsXHJcbiAgICAgICAgJ2F1dGhvcklkJyxcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3JcclxuICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2guYXV0aG9yXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmF1dGhvclxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYSkge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICdhdXRvcmUnLFxyXG4gICAgICAgICAgdmFsdWU6IGEuYXV0aG9yRGVzY3JpcHRpb24sXHJcbiAgICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b3BpYylcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhcmdvbWVudG8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b3BpYyxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRheG9ub215KVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2FyZ29tZW50bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRheG9ub215Tm9kZSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm51bWJlcilcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdudW1lcm8nLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5udW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuc25hcHNob3QuaW50ZXJ2YWwgJiZcclxuICAgICAgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlIHx8XHJcbiAgICAgICh0aGlzLmZhY2V0c1NlYXJjaCAmJlxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgIT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKSlcclxuICAgICkge1xyXG4gICAgICBsZXQgZDEgPVxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlO1xyXG4gICAgICBjb25zdCBkMiA9XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGU7XHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAhZDIgPyAnaW4gZGF0YScgOiAnZGEgZGF0YScsXHJcbiAgICAgICAgdmFsdWU6IFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZDEpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc25hcHNob3QuaW50ZXJ2YWwgJiYgXHJcbiAgICAgICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgIT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKSlcclxuICAgICkge1xyXG4gICAgICBsZXQgZCA9XHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGU7XHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnYSBkYXRhJyxcclxuICAgICAgICB2YWx1ZTogU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShkKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc25hcHNob3QuaW50ZXJ2YWwpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnaW50ZXJ2YWxsbycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3QuaW50ZXJ2YWwsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2UpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5hcnJheUdldFZhbHVlKFxyXG4gICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLlNPVVJDRVMsXHJcbiAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VcclxuICAgICAgICApLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlTnVtYmVyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ251bS4gZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VOdW1iZXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlRnJvbURhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guZnJvbURhdGUgJiZcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9PT1cclxuICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fQUdHSU9STkFNRU5UT19OT1JNQVRJVk8pXHJcbiAgICApIHtcclxuICAgICAgbGV0IGQxID1cclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZVxyXG4gICAgICAgICAgOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VGcm9tRGF0ZTtcclxuICAgICAgY29uc3QgZDIgPVxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnRvRGF0ZVxyXG4gICAgICAgICAgPyB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGVcclxuICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc291cmNlVG9EYXRlO1xyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogIWQyID8gJ2luIGRhdGEgZm9udGUnIDogJ2RhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQxKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3VyY2VUb0RhdGUgfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlICYmXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0FHR0lPUk5BTUVOVE9fTk9STUFUSVZPKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBkID1cclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGVcclxuICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2gudG9EYXRlXHJcbiAgICAgICAgICA6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvdXJjZVRvRGF0ZTtcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICdhIGRhdGEgZm9udGUnLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGQpLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0ZXN0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHQsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudHlwZSB8fFxyXG4gICAgICAodGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gudHlwZSlcclxuICAgICkge1xyXG4gICAgICBsZXQgdCA9IFN5c3RlbVV0aWxzLmFycmF5RmluZEJ5S2V5KFxyXG4gICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TRUNUT1JfVFlQRVMsXHJcbiAgICAgICAgJ2RvY3VtZW50VHlwZUlkJyxcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaCAmJiB0aGlzLmZhY2V0c1NlYXJjaC50eXBlXHJcbiAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLnR5cGVcclxuICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudHlwZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodCkge1xyXG4gICAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgICAgZmllbGQ6ICd0aXBvJyxcclxuICAgICAgICAgIHZhbHVlOiB0LmRvY3VtZW50VHlwZURlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2hvd1VucmVhZERvY3VtZW50c09ubHkpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnc3RhdG8nLFxyXG4gICAgICAgIHZhbHVlOiAnbm9uIGxldHRpJyxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5yZWFzb24gfHxcclxuICAgICAgKHRoaXMuZmFjZXRzU2VhcmNoICYmIHRoaXMuZmFjZXRzU2VhcmNoLnJlYXNvbilcclxuICAgIClcclxuICAgICAgc2kucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6ICd0aXBvIG1vZC4nLFxyXG4gICAgICAgIHZhbHVlOiBTeXN0ZW1VdGlscy5hcnJheUdldFZhbHVlKFxyXG4gICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkNIQU5HRV9SRUFTT05TLFxyXG4gICAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiYgdGhpcy5mYWNldHNTZWFyY2gucmVhc29uXHJcbiAgICAgICAgICAgID8gdGhpcy5mYWNldHNTZWFyY2gucmVhc29uXHJcbiAgICAgICAgICAgIDogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMucmVhc29uXHJcbiAgICAgICAgKSxcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWROdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZE51bWJlcixcclxuICAgICAgICBzZXA6IHNpLmxlbmd0aCA+IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWRZZWFyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2Fubm8gbW9kaWZpY2F0bycsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNoYW5nZWRZZWFyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZFRpdGxlKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpdG9sbyBtb2RpZmljYXRvJyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY2hhbmdlZFRpdGxlLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kaWZpZXJOdW1iZXIpXHJcbiAgICAgIHNpLnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiAnbnVtLiBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGlmaWVyTnVtYmVyLFxyXG4gICAgICAgIHNlcDogc2kubGVuZ3RoID4gMCxcclxuICAgICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kaWZpZXJZZWFyKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ2Fubm8gbW9kaWZpY2FudGUnLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RpZmllclllYXIsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RpZmllclRpdGxlKVxyXG4gICAgICBzaS5wdXNoKHtcclxuICAgICAgICBmaWVsZDogJ3RpdG9sbyBtb2RpZmljYW50ZScsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGlmaWVyVGl0bGUsXHJcbiAgICAgICAgc2VwOiBzaS5sZW5ndGggPiAwLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaEluZm8gPSBzaTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBDaGFuZ2Ugc2VhcmNoIG1vZGVsXHJcbiAqIEBwYXJhbSBtb2RlbCA6IHRoZSBuZXcgZG9jdW1lbnQgbW9kZWwgXHJcbiAqIEBwYXJhbSBmZXRjaCA6IHRydWUgaWYgZGF0YSBtdXN0IGJlIGZldGNoZWQuIERlZmF1bHQgaXMgdHJ1ZVxyXG4gKi9cclxuICBjaGFuZ2VNb2RlbChtb2RlbDogbnVtYmVyID0gbnVsbCwgZmV0Y2g6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9IG1vZGVsO1xyXG4gICAgc3dpdGNoIChtb2RlbCkge1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9BR0dJT1JOQU1FTlRPX05PUk1BVElWTzogdGhpcy5jdXJyZW50TW9kZWwgPSBcIkdhenpldHRlIGUgYm9sbGV0dGluaVwiOyBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fTk9STUFUSVZBX1ZJR0VOVEU6IHRoaXMuY3VycmVudE1vZGVsID0gXCJOb3JtYXRpdmEgdmlnZW50ZVwiOyBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RlbCA9IFwiVHV0dG9cIjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChmZXRjaClcclxuICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGEgc29ydFxyXG4gICAqIEBwYXJhbSBtb2RlIDogdGhlIHNvcnQgbW9kZVxyXG4gICAqL1xyXG4gIHNvcnRCeShtb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlID0gbW9kZTtcclxuICAgIHRoaXMudXBkYXRlU29ydE9wdGlvbnMoKTtcclxuICAgIHRoaXMuZmV0Y2goZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBhIHNlYXJjaCB1c2luZyBjdXJyZW50IHBhcmFtc1xyXG4gICAqL1xyXG4gIGZldGNoKG5ld1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLiRkaWFsb2cuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY291bnQgPSAyNTtcclxuICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZmlyc3QgPSAwO1xyXG4gICAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dClcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9IENsaXBwZXJEZWZpbml0aW9ucy5TUlRfUkVMRVZBTkNFO1xyXG4gICAgICBlbHNlIGlmICghdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUpXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUgPSBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX0RBVEVfREVTQztcclxuICAgICAgdGhpcy51cGRhdGVTb3J0T3B0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyO1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5mcm9tRGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEsIDIpO1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAxMSwgMzEsIDIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0ID0gU2VhcmNoVXRpbHMubm9ybWFsaXplVGV4dFF1ZXJ5KHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4kY2xpcHBlci5xdWVyeSh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcylcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHRoaXMuJGRpYWxvZy5lcnJvcihyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QudG90YWwgPSByLnZhbHVlPy50b3RhbCA/PyAwO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gci52YWx1ZT8uaXRlbXMgPz8gW107XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QuaW50ZXJ2YWwgPSByLnZhbHVlPy5pbnRlcnZhbDtcclxuICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBzdGFydE9mVG9kYXkoKTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBCeVllYXIgPVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNvcnRNb2RlID09PVxyXG4gICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5TUlRfREFURV9BU0MgfHxcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9PT1cclxuICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX0RBVEVfREVTQztcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBCeVJlbGV2YW5jZSA9XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc29ydE1vZGUgPT09XHJcbiAgICAgICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLlNSVF9SRUxFVkFOQ0U7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwQnlQb3B1bGFyaXR5ID1cclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zb3J0TW9kZSA9PT1cclxuICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuU1JUX1BPUFVMQVJJVFk7XHJcbiAgICAgICAgICAgIGxldCBncm91cCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90Lml0ZW1zLmZvckVhY2goKG46IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0FERU5aQSB8fFxyXG4gICAgICAgICAgICAgICAgbi5tb2RlbCA9PT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX1NFR05BTEFaSU9ORVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChuLm1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLkRNX1NDQURFTlpBOlxyXG4gICAgICAgICAgICAgICAgICAgIG4ub3JpZ2luRGVzY3JpcHRpb24gPSAnU2NhZGVuemEnO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TRUdOQUxBWklPTkU6XHJcbiAgICAgICAgICAgICAgICAgICAgbi5vcmlnaW5EZXNjcmlwdGlvbiA9ICdTZWduYWxhemlvbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG4uZXhwaXJpbmdJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBwYXJ0cyA9IG4uZXhwaXJpbmdJbmZvLnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIG4uZGVzY3JpcHRpb24gPSBwYXJ0c1syXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBzdWJEYXlzKG4uZGF0ZSwgMTUpO1xyXG4gICAgICAgICAgICAgICAgICBuLmlzRXhwaXJpbmcgPSB0b2RheSA8PSBuLmRhdGUgJiYgdG9kYXkgPj0gZDtcclxuICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBuLmRhdGUgPCB0b2RheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKHN0YXJ0T2ZUb2RheSgpLCA3KSlcclxuICAgICAgICAgICAgICAgICAgbi5pc05ldyA9IG4uZGF0ZSA+IGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5hbmNob3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JUeXBlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT09IDIwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSAhPT0gYW5jaG9yVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSA+PSAzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goeyB0ZXh0OiBhLnR5cGVEZXNjcmlwdGlvbiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclR5cGUgPSBhLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY29yZSA9IGEuc2NvcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gNykgc2NvcmUgLT0gNztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29yZSA+IDUpIHNjb3JlIC09IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAzKSBzY29yZSAtPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGEuZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHVyaTogYS51cmksXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJ5UmVsZXZhbnQ6IHNjb3JlID4gMC42LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzID0gYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLnZhbGlkaXR5U3RhdGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9ICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSc7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG4udmFsaWRVbnRpbERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmluZ0RhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4udmFsaWRVbnRpbERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmdEYXRlIDwgdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSBkYWwgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZXhwaXJpbmdEYXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcuJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi52YWxpZGl0eURlc2NyaXB0aW9uID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lsIGRvY3VtZW50byBub24gc2Fyw6AgcGnDuSB2aWdlbnRlIGRhbCAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShleHBpcmluZ0RhdGUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gbi5kYXRlIDwgdG9kYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChncm91cEJ5WWVhcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHllYXIgPSBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKG4uZGF0ZSwgRGF0ZUZvcm1hdC5Mb25nTW9udGhBbmRZZWFyKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwICE9PSB5ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4uZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgICAgICBncm91cCA9IHllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChncm91cEJ5UmVsZXZhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICAgICAgICBuLmdyb3VwID1cclxuICAgICAgICAgICAgICAgICAgICAnRWxlbmNvIHBlciByaWxldmFuemE6IGdsaSBlbGVtZW50aSBwacO5IGltcG9ydGFudGkgc29ubyBpbiB0ZXN0YSc7XHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBCeVBvcHVsYXJpdHkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChncm91cCAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4uZ3JvdXAgPVxyXG4gICAgICAgICAgICAgICAgICAgICdFbGVuY28gcGVyIHBvcG9sYXJpdMOgOiBnbGkgZWxlbWVudGkgcGnDuSBpbXBvcnRhbnRpIHNvbm8gaW4gdGVzdGEnO1xyXG4gICAgICAgICAgICAgICAgICBncm91cCA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKG4udGF4b25vbXkpIHtcclxuICAgICAgICAgICAgICAgIG4udGF4b25vbXlOb2RlcyA9IG4udGF4b25vbXkuc3BsaXQoJ1xcclxcbicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlbCA9PT1cclxuICAgICAgICAgICAgICAgICAgQ2xpcHBlckRlZmluaXRpb25zLkRNX0dVSURBIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fR1VJREFfTk9STUFUSVZBIHx8XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NIRURBX0FERU1QSU1FTlRJXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLnRheG9ub215Tm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG4udGF4b25vbXlOb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IG5vZGUuaW5kZXhPZignPicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwICE9PSAtMSlcclxuICAgICAgICAgICAgICAgICAgICAgIG4udGF4b25vbXlOb2Rlc1tpXSA9IG5vZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhwICsgMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcPi9naSwgJyA+ICcpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNob3cgdG9hc3QgaWYgbmV3IHNlYXJjaFxyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2gpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNUb29NYW55UmVzdWx0cyA9IHRoaXMuc25hcHNob3QudG90YWwgPj0gMTAwMDtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoICYmIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0ID0gdGhpcy4kZGlhbG9nLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdIbyB0cm92YXRvIHBpw7kgZGkgMTAwMCBlbGVtZW50aScsXHJcbiAgICAgICAgICAgICAgICAgICAgMzAwMCxcclxuICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgJ1JpZmluaXNjaSdcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdC5pbnN0YW5jZS5hY3Rpb24uc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy4kZGlhbG9nLnRvYXN0KFxyXG4gICAgICAgICAgICAgICAgICAgICdIbyB0cm92YXRvICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3QudG90YWwgK1xyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnNuYXBzaG90LnRvdGFsID09PSAxID8gJyBlbGVtZW50bycgOiAnIGVsZW1lbnRpJylcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChuZXdTZWFyY2ggJiYgIXRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZmFjZXRzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldEZhY2V0cyh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgc25hcHNob3RcclxuICAgICAgICAgICAgdGhpcy4kY2xpcHBlci5zbmFwc2hvdCA9IHRoaXMuc25hcHNob3Q7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdmlld1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuJGRpYWxvZy5jbGVhckJ1c3koKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5ldyBwYWdlIHJlc3VsdFxyXG4gICAqIEBwYXJhbSBlIDogdGhlIE1hdFBhZ2luYXRvciBQYWdlRXZlbnQgZGF0YVxyXG4gICAqL1xyXG4gIGZldGNoTW9yZShlOiBhbnkpIHtcclxuICAgIGxldCBmaXJzdCA9IGUucGFnZUluZGV4ICogdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuY291bnQ7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5mZXRjaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgc2VhcmNoXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgbW9kdWxlOiBDbGlwcGVyRGVmaW5pdGlvbnMuTU9EX1NFTUFOVElDX1NFQVJDSCxcclxuICAgICAgbW9kZWw6IENsaXBwZXJEZWZpbml0aW9ucy5ETV9OT1JNQVRJVkFfVklHRU5URSxcclxuICAgICAgZmlyc3Q6IDAsXHJcbiAgICAgIGNvdW50OiAyNSxcclxuICAgIH07XHJcbiAgICB0aGlzLmN1cnJlbnRNb2RlbCA9ICdOb3JtYXRpdmEgdmlnZW50ZSc7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMuc25hcHNob3QudG90YWwgPSAwO1xyXG4gICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSBudWxsO1xyXG4gICAgdGhpcy5mYWNldHNTZWFyY2gucmVzZXQoKTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgdGhpcy51cGRhdGVTZWFyY2hJbmZvKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVuIGFuIGl0ZW1cclxuICAgKiBAcGFyYW0gZG9jdW1lbnRJZCA6IHRoZSBkb2N1bWVudCBpZFxyXG4gICAqIEBwYXJhbSBuZXdXaW5kb3c6IHRydWUgaWYgdGhlIGRvY3VtZW50IG11c3QgYmUgb3BlbiBpbnRvIGEgbmV3IHdpbmRvd1xyXG4gICAqL1xyXG4gIG9wZW4oZG9jdW1lbnRJZDogc3RyaW5nLCBuZXdXaW5kb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCFuZXdXaW5kb3cpIHRoaXMub3BlbkRvY3VtZW50KGRvY3VtZW50SWQpO1xyXG4gICAgZWxzZSB3aW5kb3cub3BlbignL2RvY3VtZW50by8nICsgZG9jdW1lbnRJZCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBhIGRvY3VtZW50XHJcbiAgICogQHBhcmFtIGRvY3VtZW50SWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBwcml2YXRlIG9wZW5Eb2N1bWVudChkb2N1bWVudElkOiBzdHJpbmcpIHtcclxuICAgIGlmICghZG9jdW1lbnRJZCkgcmV0dXJuO1xyXG4gICAgQ2xpcHBlckRvY3VtZW50c1V0aWxzLm9wZW5Eb2N1bWVudChcclxuICAgICAgdGhpcy4kZGlhbG9nLFxyXG4gICAgICB0aGlzLiRjbGlwcGVyLFxyXG4gICAgICBkb2N1bWVudElkLFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0LFxyXG4gICAgICB0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBvc2UgYSBmcmVlIHRleHQgc2VhcmNoIHF1ZXJ5XHJcbiAgICovXHJcbiAgY29tcG9zZVNlYXJjaCgpIHtcclxuICAgIGxldCBkID0gdGhpcy4kZGlhbG9nLm9wZW4oQ2xpcHBlclNlYXJjaEZyZWVUZXh0UXVlcnlCdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ2Nvc3RydWlzY2kgcmljZXJjYScsXHJcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICB9KTtcclxuICAgIGQuY29tcG9uZW50SW5zdGFuY2UuZG9uZVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50ZXh0ID0gci5xdWVyeTtcclxuXHJcbiAgICAgICAgLy8gRmluaXNoZWRcclxuICAgICAgICBkLmNsb3NlKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGl0ZW0gc3RhdGUgY3NzIGNsYXNzXHJcbiAgICogQHBhcmFtIGl0ZW0gOiB0aGUgaXRlbSB0byBldmFsdWF0ZVxyXG4gICAqL1xyXG4gIGdldEl0ZW1TdGF0ZUNzc0NsYXNzKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0uaXNFeHBpcmVkKSByZXR1cm4gJ2l0ZW0tZXhwaXJlZC1pbmQnO1xyXG4gICAgaWYgKGl0ZW0ucG9wdWxhcml0eSA9PT0gMykgcmV0dXJuICdpdGVtLXBvcHVsYXItaW5kJztcclxuICAgIGVsc2UgaWYgKGl0ZW0ucG9wdWxhcml0eSA+IDMpIHJldHVybiAnaXRlbS12ZXJ5LXBvcHVsYXItaW5kJztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBpdGVtIHN0YXRlIHRvb2x0aXAgdGV4dFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gZXZhbHVhdGVcclxuICAgKi9cclxuICBnZXRJdGVtU3RhdGVUb29sdGlwKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0uaXNFeHBpcmVkKSByZXR1cm4gJ05vbiBwacO5IHZpZ2VudGUnO1xyXG4gICAgaWYgKGl0ZW0ucG9wdWxhcml0eSA9PT0gMykgcmV0dXJuICdEb2N1bWVudG8gY29uIG51bWVybyBkaSBjaXRhemlvbmkgYWx0byc7XHJcbiAgICBlbHNlIGlmIChpdGVtLnBvcHVsYXJpdHkgPiAzKVxyXG4gICAgICByZXR1cm4gJ0RvY3VtZW50byBjb24gbnVtZXJvIGRpIGNpdGF6aW9uaSBtb2x0byBhbHRvJztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBpdGVtIGxpbmsgb3IgYWxsIHNlbGVjdGVkIG9uZXMgYnkgZW1haWxcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBvcHRpb25hbCBpdGVtXHJcbiAgICovXHJcbiAgc2VuZFRvKGl0ZW06IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2VuZEl0ZW1zVG8oaXRlbSA/IFtpdGVtXSA6IHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQuc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnJvd3NlIGRvY3VtZW50IHJlZmVyZW5jZXNcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudCBpdGVtXHJcbiAgICogQHBhcmFtIG1vZGUgOiB0aGUgbW9kZVxyXG4gICAqL1xyXG4gIHJlZmVyZW5jZXMoaXRlbTogYW55LCBtb2RlOiBudW1iZXIgPSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fUkVGRVJFTkNFU19JTikge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm47XHJcbiAgICBsZXQgZCA9IHRoaXMuJGRpYWxvZy5vcGVuKENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ3JpZmVyaW1lbnRpIGxlZ2F0aSBhbCBkb2N1bWVudG8nLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICBjbG9zZU9uTmF2aWdhdGlvbjogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHsgaWQ6IGl0ZW0uZG9jdW1lbnRJZCwgbW9kZTogbW9kZSB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAncmVmZXJlbmNlcy1jb250YWluZXInLFxyXG4gICAgICBtaW5XaWR0aDogJzM3NXB4JyxcclxuICAgICAgbWF4V2lkdGg6ICcxMDAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICAgIGhlaWdodDogJzk5JScsXHJcbiAgICB9KTtcclxuICAgIGQuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAociAmJiByLmlkKSB0aGlzLm9wZW4oci5pZCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheSBhIGRvY3VtZW50IHJlcG9ydFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGRvY3VtZW50XHJcbiAgICovXHJcbiAgcmVwb3J0KGl0ZW06IGFueSkge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm47IGlmICghaXRlbSkgcmV0dXJuO1xyXG4gICAgaWYgKGl0ZW0ubW9kZWwgIT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX05PUk1BVElWQV9WSUdFTlRFICYmIGl0ZW0ubW9kZWwgIT0gQ2xpcHBlckRlZmluaXRpb25zLkRNX1NDQURFTlpBKSB7XHJcbiAgICAgIHRoaXMuJGRpYWxvZy5pbmZvKFwiUXVlc3RhIGZ1bnppb25hbGl0w6Agbm9uIMOoIGRpc3BvbmliaWxlIHBlciBxdWVzdG8gdGlwbyBkaSBkb2N1bWVudG8uXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IHRoaXMub3BlblJlcG9ydChpdGVtLmRvY3VtZW50SWQsIGl0ZW0udGl0bGUxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBQZXJmb3JtIHNlYXJjaFxyXG4gKi9cclxuICBzZWFyY2goKSB7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2VjdG9yID09PSB0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IpXHJcbiAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvciA9IG51bGw7XHJcblxyXG4gICAgLy8gUmVzZXQgcGFnaW5hdG9yXHJcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgLy8gUmVzZXQgZmFjZXRzIHNlYXJjaFxyXG4gICAgdGhpcy5mYWNldHNTZWFyY2gucmVzZXQoKTtcclxuXHJcbiAgICAvLyBEbyBzZWFyY2hcclxuICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFkdmFuY2VkIHNlYXJjaFxyXG4gICAqL1xyXG4gIGFkdmFuY2VkU2VhcmNoKCkge1xyXG4gICAgbGV0IGQgPSB0aGlzLiRkaWFsb2cub3BlbihDbGlwcGVyU2VhcmNoRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ3JpY2VyY2EgYXZhbnphdGEnLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgcGFyYW1zOiB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyxcclxuICAgICAgICBlbmFibGVSZWFkOiBmYWxzZSxcclxuICAgICAgICBlbmFibGVTZWN0b3I6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVHlwZTogdHJ1ZSxcclxuICAgICAgICBlbmFibGVBdXRob3I6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVG9waWM6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlVGV4dDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVEb2N1bWVudDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVTb3VyY2U6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzcwMHB4JyxcclxuICAgICAgd2lkdGg6ICc5OSUnLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRvbmVcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHNlYXJjaCBwYXJhbXNcclxuICAgICAgICByLm1vZGVsID0gdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWw7XHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMgPSByO1xyXG4gICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0ID0gMDtcclxuICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5jb3VudCA9IDI1O1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5zZWN0b3IgPT09IHRoaXMuZmFjZXRzU2VhcmNoLnNlY3RvcilcclxuICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnNlY3RvciA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHBhZ2luYXRvclxyXG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgZmFjZXRzIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIC8vIERvIHNlYXJjaFxyXG4gICAgICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIEZpbmlzaGVkXHJcbiAgICAgICAgZC5jbG9zZSgpO1xyXG5cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogU2hvdyBmcmVlIHRleHQgaGVscFxyXG4gKi9cclxuICBoZWxwU2VhcmNoKCkge1xyXG4gICAgdGhpcy4kZGlhbG9nLm9wZW4oQ2xpcHBlclNlYXJjaEZyZWVUZXh0SGVscENvbXBvbmVudCwge1xyXG4gICAgICBhcmlhTGFiZWw6ICdpbmZvcm1hemlvbmkgcmljZXJjYScsXHJcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnODAwcHgnLFxyXG4gICAgICB3aWR0aDogJzk5JScsXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYW5hZ2UgY2xpcHBlciBiYWdcclxuICAgKi9cclxuICBtYW5hZ2VCYWcoKSB7XHJcbiAgICBsZXQgaXRlbXM6IGFueSA9IFtdO1xyXG4gICAgdGhpcy4kY2xpcHBlci5iYWcuZm9yRWFjaCgobjogYW55KSA9PiB7XHJcbiAgICAgIGxldCB0aXRsZSA9IG4uVGl0bGUxID8gbi5UaXRsZTEgOiBuLlRpdGxlMjtcclxuICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgdGVtcGxhdGU6IHRpdGxlLFxyXG4gICAgICAgIGJhZzogbixcclxuICAgICAgICBzZWFyY2hCYWc6IHsgbmFtZTogdGl0bGUgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBkID0gdGhpcy4kZGlhbG9nLnNlbGVjdCh7XHJcbiAgICAgIHRpdGxlOiAnR2VzdGlzY2kgZG9jdW1lbnRpIGRpIGxhdm9ybycsXHJcbiAgICAgIG11bHRpOiBmYWxzZSxcclxuICAgICAgbXVzdFNlbGVjdDogZmFsc2UsXHJcbiAgICAgIG9rQ2FwdGlvbjogJ1NFTEVaSU9OQScsXHJcbiAgICAgIGl0ZW1zOiBpdGVtcyxcclxuICAgICAgY2FuRGVsZXRlOiB0cnVlLFxyXG4gICAgICBjYW5WaWV3OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLnZpZXdcclxuICAgICAgLnN1YnNjcmliZSgocjogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW0gPSByLmJhZztcclxuICAgICAgICB0aGlzLm9wZW4oaXRlbS5Eb2N1bWVudElkKTtcclxuICAgICAgfSk7XHJcbiAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRlbGV0ZVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICB2YXIgaXRlbSA9IHIuc2VsZWN0ZWRJdGVtc1swXS5iYWc7XHJcbiAgICAgICAgdGhpcy4kY2xpcHBlci5yZW1vdmVGcm9tQmFnKGl0ZW0uRG9jdW1lbnRJZCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuJGRpYWxvZy50b2FzdCgnT3BlcmF6aW9uZSBjb21wbGV0YXRhIGNvbiBzdWNjZXNzby4nKTtcclxuICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgci5pdGVtcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICBpZiAoci5pdGVtc1twXS5iYWcuRG9jdW1lbnRJZCA9PT0gaXRlbS5Eb2N1bWVudElkKSB7XHJcbiAgICAgICAgICAgICAgci5pdGVtcy5zcGxpY2UocCwgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKHIuaXRlbXMubGVuZ3RoID09PSAwKSBkLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgaG9tZSB0YWJcclxuICAgKi9cclxuICBzaG93SG9tZSgpIHtcclxuICAgIHRoaXMuZGlhbG9nVGFiID0gMjtcclxuICAgIGlmICh0aGlzLiRjbGlwcGVyLmxvZ2dlZEluICYmICF0aGlzLmxhc3QxNURheXMuZGF5c0xvYWRlZCkgdGhpcy5sYXN0MTVEYXlzLmZldGNoKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgb3IgY29sbGFwc2UgaG9tZSBkYXlzIHZpZXdcclxuICAgKiBAcGFyYW0gY29sbGFwc2VcclxuICAgKi9cclxuICBleHBhbmRIb21lKGNvbGxhcHNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIHRoaXMubGFzdDE1RGF5cy5leHBhbmQoY29sbGFwc2UpXHJcbiAgfVxyXG4gIFxyXG4gIC8vXHJcbiAgLy8gUmVnaXN0cm8gZSBzY2FkZW56YXJpb1xyXG4gIC8vXHJcblxyXG4gIC8qKlxyXG4gKiBDaGVja3MgaWYgYWxsIGRvY3VtZW50cyBhcmUgc3VwcG9ydGVkIGJ5IFJTXHJcbiAqIEBwYXJhbSBkb2N1bWVudHMgOiB0aGUgbGlzdCBvZiBkb2N1bWVuc1xyXG4gKiBAcmV0dXJuczogdHJ1ZSBpZiBhbGwgZG9jdW1lbnRzIHN1cHBvcnRzIFJTXHJcbiAqL1xyXG4gIFJTX2VuYWJsZWQoZG9jdW1lbnRzOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghZG9jdW1lbnRzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICBsZXQgYWxsb3cgPSBmYWxzZTtcclxuICAgIGRvY3VtZW50cy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgYWxsb3cgPSBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fTk9STUFUSVZBX1ZJR0VOVEUgfHxcclxuICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fQUdHSU9STkFNRU5UT19OT1JNQVRJVk8gfHxcclxuICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NBREVOWkE7XHJcbiAgICAgIGlmICghYWxsb3cpIHJldHVybjtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFsbG93O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmV3IGxhd1xyXG4gICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGxhd1xyXG4gICAqL1xyXG4gIFJTX25ld0xhdyhkb2N1bWVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwIHx8ICF0aGlzLiRjbGlwcGVyLnN1cHBvcnRzUlMpIHJldHVybjtcclxuICAgIHRoaXMuJGJyb2FkY2FzdC5zZW5kTWVzc2FnZShDbGlwcGVyTWVzc2FnZXMuSU5URVJPUF9SU19ORVdfTEFXLCBkb2N1bWVudCA/IFtkb2N1bWVudF0gOiB0aGlzLnNlbGVjdGlvbi5jdXJyZW50LnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5ldyBhY3Rpdml0eVxyXG4gICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGxhd1xyXG4gICAqL1xyXG4gIFJTX25ld0FjdGl2aXR5KGRvY3VtZW50OiBhbnkpIHtcclxuICAgIGlmICghZG9jdW1lbnQpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmRhdGEuc2VsZWN0aW9uTW9kZSA+IDAgfHwgIXRoaXMuJGNsaXBwZXIuc3VwcG9ydHNSUykgcmV0dXJuO1xyXG4gICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX05FV19BQ1RJVklUWSwgZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBEb2N1bWVudCB1c2FnZSByZXBvcnRcclxuICAgKiBAcGFyYW0gZG9jdW1lbnQ6IHRoZSBsYXdcclxuICAgKi9cclxuICAgIFJTX3VzYWdlUmVwb3J0KGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGlvbk1vZGUgPiAwIHx8ICF0aGlzLiRjbGlwcGVyLnN1cHBvcnRzUlMpIHJldHVybjtcclxuICAgICAgdGhpcy4kYnJvYWRjYXN0LnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX1VTQUdFX1JFUE9SVCwgZG9jdW1lbnQpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGlkPVwiY2xpcHBlci1icm93c2VyLWZpeGVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNsaXBwZXItYnJvd3Nlci1oZWFkZXJcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY2xpcHBlci5hcnNlZGl6aW9uaS5pdFwiIG1hdFRvb2x0aXA9XCJBcHJpIENsaXBwZXIgaW4gdW4gbnVvdm8gdGFiXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICA8aW1nIHNyYz1cIi4vLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy9jbGlwcGVyX2xvZ28ucG5nXCIgYWx0PVwiQ2xpcHBlclwiIHN0eWxlPVwibWF4LWhlaWdodDogNTBweDsgcGFkZGluZzogNXB4XCIgLz5cclxuICAgICAgICA8L2E+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBAaWYgKGRhdGEuc2VsZWN0aW9uTW9kZSA+IDApIHtcclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgQGlmIChjYW5TZWxlY3QoKSkge1xyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3QoKVwiPlxyXG4gICAgICAgICAgICBVc2Egc2VsZXppb25lXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdiBmeEZsZXg9XCIxNTBweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgICBAaWYgKCRjbGlwcGVyLmJhZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkRvY3VtZW50aSBkaSBsYXZvcm9cIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIidEb2N1bWVudGkgZGkgbGF2b3JvJ1wiIChjbGljayk9XCJtYW5hZ2VCYWcoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbbWF0QmFkZ2VdPVwiJGNsaXBwZXIuYmFnLmxlbmd0aFwiIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIj53b3JrX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXRUb29sdGlwPVwiQ2hpdWRpXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaGl1ZGlcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8bmF2IG1hdC10YWItbmF2LWJhciBtYXQtc3RyZXRjaC10YWJzIFt0YWJQYW5lbF09XCJ0YWJQYW5lbDFcIj5cclxuICAgIDxhIG1hdC10YWItbGluayAoY2xpY2spPVwiZGlhbG9nVGFiID0gMVwiIFthY3RpdmVdPVwiZGlhbG9nVGFiID09PSAxXCIgW2Rpc2FibGVkXT1cIiEkY2xpcHBlci5sb2dnZWRJblwiPlJpY2VyY2E8L2E+XHJcbiAgICA8YSBtYXQtdGFiLWxpbmsgKGNsaWNrKT1cInNob3dIb21lKClcIiBbYWN0aXZlXT1cImRpYWxvZ1RhYiA9PT0gMlwiIFtkaXNhYmxlZF09XCIhJGNsaXBwZXIubG9nZ2VkSW5cIj5cclxuICAgICAgPG1hdC1pY29uPnVwZGF0ZTwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuIGZ4SGlkZS54cyBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHhcIj4gVWx0aW1pIDE1IGdpb3JuaTwvc3Bhbj5cclxuICAgIDwvYT5cclxuICA8L25hdj5cclxuICA8bWF0LXRhYi1uYXYtcGFuZWwgI3RhYlBhbmVsMT48L21hdC10YWItbmF2LXBhbmVsPlxyXG4gIDxkaXYgW2hpZGRlbl09XCJkaWFsb2dUYWIgIT09IDFcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNXB4IDAgMTBweCAxNXB4XCI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlblwiIGZ4RmlsbD5cclxuICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleC54cz1cIjYyXCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9JzEwcHgnIGZ4RmlsbD5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+TnVtZXJvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMubnVtYmVyXCIgI251bWJlcj1cIm5nTW9kZWxcIiBuYW1lPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCIgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMubnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggYXJpYS1sYWJlbD1cIkF6emVyYVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLm51bWJlciA9IG51bGw7XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEzMHB4XCIgZnhIaWRlLnhzIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+QW5ubzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhclwiICN5ZWFyPVwibmdNb2RlbFwiIG5hbWU9XCJ5ZWFyXCIgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI0XCIgKGtleXVwLkVudGVyKT1cImZldGNoKHRydWUpXCIgLz5cclxuICAgICAgICAgICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIlB1bGlzY2lcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy55ZWFyID0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGlmICh5ZWFyLmludmFsaWQpIHtcclxuICAgICAgICAgICAgICA8bWF0LWVycm9yPk5vbiB2YWxpZG8uPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5QYXJvbGUsIGZyYXNpIG8gY29uY2V0dGkuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI3NlYXJjaElucHV0PVwibWF0SW5wdXRcIiB0eXBlPVwidGV4dFwiICN0ZXh0IFsobmdNb2RlbCldPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLnRleHRcIlxyXG4gICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjAwXCIgKGtleXVwLkVudGVyKT1cInNlYXJjaCgpXCIgYXV0b2ZvY3VzIC8+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJQdWxpc2NpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCA9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiQ29tcG9uaVwiIG1hdFRvb2x0aXA9XCJDb21wb25pXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0ZXh0LmZvY3VzKCk7IGNvbXBvc2VTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmJ1aWxkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGZ4SGlkZS54cyB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiSW5mb3JtYXppb25pXCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21lIGVmZmV0dHVhcmUgbGEgcmljZXJjYSBpbiB0ZXN0byBsaWJlcm9cIiAoY2xpY2spPVwidGV4dC5mb2N1cygpOyBoZWxwU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5oZWxwX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXgueHM9XCIzNlwiPlxyXG4gICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeEZpbGw+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzZWFyY2goKVwiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQXZ2aWEgbGEgcmljZXJjYSdcIiBtYXRUb29sdGlwPVwiQXZ2aWEgcmljZXJjYVwiIFtkaXNhYmxlZF09XCIhJGNsaXBwZXIubG9nZ2VkSW5cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZHZhbmNlZFNlYXJjaCgpXCIgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSaWNlcmNhIGF2YW56YXRhJ1wiIG1hdFRvb2x0aXA9XCJSaWNlcmNhIGF2YW56YXRhXCIgW2Rpc2FibGVkXT1cIiEkY2xpcHBlci5sb2dnZWRJblwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICBAaWYgKHNuYXBzaG90LnNlYXJjaEluZm8gJiYgc25hcHNob3Quc2VhcmNoSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICA8ZGl2IGZ4SGlkZS54cyBjbGFzcz1cInNlYXJjaC1pbmZvIHNtYWxsXCI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICA8Yj5SSUNFUkNBIEFUVElWQTwvYj4mbmJzcDsmbmJzcDsmbmJzcDtcclxuICAgICAgICAgIEBmb3IgKHNpIG9mIHNuYXBzaG90LnNlYXJjaEluZm87IHRyYWNrIHNpKSB7XHJcbiAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAge3tzaS5zZXAgPyAnJm5ic3A7Jm5ic3A7JyA6ICcnfX0ge3tzaS5maWVsZH19OiA8c3BhblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1wcmltYXJ5IGxvd2VyY2FzZVwiPjxpPnt7c2kudmFsdWV9fTwvaT48L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cInN0YXJ0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkF6emVyYSByaWNlcmNhXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MCAwIDZweCAyMHB4O1wiIGZ4TGF5b3V0PVwicm93IHdyYXAtcmV2ZXJzZVwiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuXCIgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiPlxyXG4gICAgICAgICAgQGlmIChzbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgIDxkaXYgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZXppb25hL2Rlc2VsZXppb25hIHR1dHRvJ1wiIG1hdFRvb2x0aXA9XCJTZWxlemlvbmEvZGVzZWxlemlvbmEgdHV0dG9cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QuaXRlbXMgfHwgc25hcHNob3QuaXRlbXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiKlwiPlxyXG4gICAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsID4gMCkge1xyXG4gICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIk9yZGluYVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01lbnUgb3JkaW5hJ1wiXHJcbiAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVTb3J0XCIgY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cIiFzbmFwc2hvdC50b3RhbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5PcmRpbmEgcGVyOjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gZnhIaWRlLmd0LW1kPnNvcnQ8L21hdC1pY29uPiB7e2N1cnJlbnRTb3J0fX1cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnVTb3J0PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDMpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGRlY3Jlc2NlbnRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgRGF0YSBkZWNyZXNjZW50ZVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDIpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciBkYXRhIGNyZXNjZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIERhdGEgY3Jlc2NlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC5zZWFyY2hQYXJhbXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDEpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInT3JkaW5hIHBlciByaWxldmFuemEnXCI+XHJcbiAgICAgICAgICAgICAgICBSaWxldmFuemFcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzb3J0QnkoNSlcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidPcmRpbmEgcGVyIHBvcG9sYXJpdMOgJ1wiPlxyXG4gICAgICAgICAgICAgICAgUG9wb2xhcml0w6BcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8IS0tIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic29ydEJ5KDQpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09yZGluYSBwZXIgZGF0YSBkaSBpbnNlcmltZW50byBkZXNjcmVzY2VudGUnXCI+XHJcbiAgICAgICAgICAgICAgICBEYXRhIGRpIGluc2VyaW1lbnRvIGRlY3Jlc2NlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+LS0+XHJcbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG1vZGVsbG8nXCJcclxuICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudU1vZGVsc1wiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGZ4SGlkZS5sdC1sZz5Nb3N0cmE6PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmeEhpZGUuZ3QtbWQ+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPiB7e2N1cnJlbnRNb2RlbH19XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIGljb24tbWVudS1kcm9wLWRvd25cIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bWF0LW1lbnUgI21lbnVNb2RlbHM9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgyKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01vc3RyYSBhZ2dpb3JuYW1lbnRvIG5vcm1hdGl2bydcIj5cclxuICAgICAgICAgICAgICAgIEdhenpldHRlIGUgYm9sbGV0dGluaVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hhbmdlTW9kZWwoOSlcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidOb3JtYXRpdmEgdmlnZW50ZSdcIj5cclxuICAgICAgICAgICAgICAgIE5vcm1hdGl2YSB2aWdlbnRlXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VNb2RlbCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInTW9zdHJhIHR1dHRpIGkgZG9jdW1lbnRpJ1wiPlxyXG4gICAgICAgICAgICAgICAgVHV0dG9cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiBtYXRUb29sdGlwPVwiQXppb25pIGRhIGVzZWd1aXJlIHN1Z2xpIGVsZW1lbnRpIHNlbGV6aW9uYXRpXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ01lbnUgb3B6aW9uaSBwZXIgZWxlbWVudGkgc2VsZXppb25hdGknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVTZWxlY3Rpb25zXCJcclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW21hdEJhZGdlXT1cInNlbGVjdGlvbi5hbGwubGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiPnBsYXlsaXN0X2FkZF9jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgPGNsaXBwZXItZG9jdW1lbnQtbWVudSBbcGFyZW50XT1cInRoaXNcIiBzZWxlY3Rpb25Tb3VyY2U9XCJzZWxlY3Rpb25cIiBbaXNTZWxlY3RhYmxlXT1cImNhblNlbGVjdCgpXCJcclxuICAgICAgICAgICAgW2lzUmVhZGFibGVdPVwiZmFsc2VcIiBbaXNMYXdJbkZvcmNlXT1cInRydWVcIj5cclxuICAgICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgQGlmIChmYWNldHNTZWFyY2ggJiYgZmFjZXRzU2VhcmNoLmhhc0ZhY2V0cyAmJiBmYWNldHNTaWRlbmF2ICYmICghZmFjZXRzU2lkZW5hdi5vcGVuZWQgfHwgZmFjZXRzQ2xvc2VkKSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdFRvb2x0aXA9XCJBZmZpbmEgcmljZXJjYVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiJ0FmZmluYSByaWNlcmNhJ1wiIChjbGljayk9XCJmYWNldHNPcGVuKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5tZW51X29wZW48L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IFtoaWRkZW5dPVwiZGlhbG9nVGFiICE9PSAyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlIGZvcm0tY29sdW1uXCI+XHJcbiAgICAgIDxwPkVjY28gY29zYSDDqCBzdWNjZXNzbyBuZWdsaSB1bHRpbWkgMTUgZ2lvcm5pIGluIGJhc2UgYWxsYSB0dWEgY29uZmlndXJhemlvbmUuPC9wPlxyXG4gICAgICA8cD5QZXIgbW9kaWZpY2FyZSBsYSB0dWFcclxuICAgICAgICBjb25maWd1cmF6aW9uZSBkZXZpIGFjY2VkZXJlIGEgPGEgY2xhc3M9XCJsaW5rXCIgaHJlZj1cImh0dHBzOi8vY2xpcHBlci5hcnNlZGl6aW9uaS5pdFwiXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiQXByaSBDbGlwcGVyIGluIHVuIG51b3ZvIHRhYlwiIHRhcmdldD1cIl9ibGFua1wiPkNsaXBwZXI8L2E+LjwvcD5cclxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPScxMHB4JyBmeEZpbGw+XHJcbiAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJFc3BhbmRpIHR1dHRvXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRXNwYW5kaSB0dXR0byBcXCBjb21wcmltaSB0dXR0bydcIlxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZXhwYW5kSG9tZSgpXCI+XHJcbiAgICAgICAgICAgIEVzcGFuZGkgdHV0dG9cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFRvb2x0aXA9XCJDb21wcmltaSB0dXR0b1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvbXByaW1pIHR1dHRvJ1wiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRIb21lKHRydWUpXCI+XHJcbiAgICAgICAgICAgIENvbXByaW1pIHR1dHRvXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50IHN0eWxlPVwicGFkZGluZzowIDAgMCAxNXB4XCIgW25nU3R5bGVdPVwieydtaW4taGVpZ2h0LnB4JzogY29udGVudEhlaWdodH1cIj5cclxuICA8ZGl2IFtoaWRkZW5dPVwiZGlhbG9nVGFiICE9PSAxXCI+XHJcbiAgICA8bWF0LXNpZGVuYXYtY29udGFpbmVyIFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzogY29udGVudEhlaWdodH1cIj5cclxuICAgICAgPG1hdC1zaWRlbmF2ICNmYWNldHNTaWRlbmF2IHBvc2l0aW9uPVwiZW5kXCIgYXV0b0ZvY3VzPVwiZmFsc2VcIiBvcGVuZWQ9XCJmYWxzZVwiIG1vZGU9XCJ7e2ZhY2V0c01vZGV9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJzaWRlbmF2IHNpZGVuYXYtZmFjZXRzXCI+XHJcbiAgICAgICAgQGlmIChmYWNldHNTZWFyY2guYnVzeSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6NXB4XCI+XHJcbiAgICAgICAgICAgIEBpZiAoZmFjZXRzU2VhcmNoLmJ1c3kpIHtcclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgY2xhc3M9XCJzaWRlbmF2LWxvYWRlclwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNjRweFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGaWxsIGNsYXNzPVwic2lkZW5hdi10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaWRlbmF2LXRpdGxlXCI+QWZmaW5hIHJpY2VyY2E8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiIChjbGljayk9XCJmYWNldHNDbG9zZSh0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCI+XHJcbiAgICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1mYWNldHMgI2ZhY2V0c1NlYXJjaD48L2NsaXBwZXItc2VhcmNoLWZhY2V0cz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L21hdC1zaWRlbmF2PlxyXG4gICAgICA8bWF0LXNpZGVuYXYtY29udGVudD5cclxuICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzogY29udGVudEhlaWdodCB9XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGlkPVwic2VhcmNoX2NvbnRhaW5lclwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MzJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiIGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICBOb24gaGFpIGFuY29yYSBlZmZldHR1YXRvXHJcbiAgICAgICAgICAgICAgICAgICAgbGEgdHVhIHByaW1hIHJpY2VyY2Egb3BwdXJlIGxhIHJpY2VyY2EgZWZmZXR0dWF0YSBub24gaGEgcHJvZG90dG8gYWxjdW4gcmlzdWx0YXRvLjwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+SW5zZXJpc2NpIG5lbGwnYXBwb3NpdG8gY2FtcG8gY2nDsiBjaGUgaW50ZW5kaSBjZXJjYXJlIGUgZmFpIGNsaWNrIHN1IDxiPlRyb3ZhPC9iPiBvcHB1cmUgdXRpbGl6emFcclxuICAgICAgICAgICAgICAgICAgICBsYVxyXG4gICAgICAgICAgICAgICAgICAgIDxiPlJpY2VyY2EgYXZhbnphdGE8L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD4uXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNuYXBzaG90Lml0ZW1zOyB0cmFjayB0cmFja2FibGVJZCgkaW5kZXgsIGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyKT1cIml0ZW0uaXNPdmVyID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaXRlbS5pc092ZXIgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtcy1ncm91cC10aXRsZSBpdGVtLWFjY2VudFwiPnt7aXRlbS5ncm91cH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeEZpbGwgY2xhc3M9XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXRlbS1zZWxlY3RlZCc6IHNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0pIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNDhweFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoJHNjcmVlbi5pc1RvdWNoYWJsZSB8fCBpdGVtLmlzT3ZlciB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtLmRvY3VtZW50SWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggZnhMYXlvdXRBbGlnbj1cImNlbnRlclwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShpdGVtLCBpdGVtLmRvY3VtZW50SWQpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJwYWRkaW5nOjZweCAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwcGVyLXNlYXJjaC1yZXN1bHQtaXRlbSBbcGFyZW50XT1cInRoaXNcIiBbaXRlbV09XCJpdGVtXCI+PC9jbGlwcGVyLXNlYXJjaC1yZXN1bHQtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaXNPdmVyIHx8IGl0ZW0uaXNNZW51T3BlbiB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJEYXRhXT1cIntpdGVtOiBpdGVtfVwiIChjbGljayk9XCJpdGVtLmlzTWVudU9wZW4gPSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGRpdiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZFwiIFtzdHlsZS5sZWZ0XT1cImNvbnRleHRNZW51UG9zaXRpb24ueFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnlcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29udGV4dE1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2NvbnRleHRNZW51PVwibWF0TWVudVwiIChjbG9zZWQpPVwidXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2xpcHBlci1kb2N1bWVudC1tZW51IFtwYXJlbnRdPVwidGhpc1wiIFtpdGVtXT1cIml0ZW1cIiBbaXNTZWxlY3RhYmxlXT1cImNhblNlbGVjdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZGFibGVdPVwiZmFsc2VcIiBbaXNMYXdJbkZvcmNlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcHBlci1kb2N1bWVudC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoc25hcHNob3QudG90YWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwic25hcHNob3Quc2VhcmNoUGFyYW1zLmZpcnN0IC8gc25hcHNob3Quc2VhcmNoUGFyYW1zLmNvdW50XCIgW2xlbmd0aF09XCJzbmFwc2hvdC50b3RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5jb3VudFwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCIgKHBhZ2UpPVwiZmV0Y2hNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtc2lkZW5hdi1jb250ZW50PlxyXG4gICAgPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBbaGlkZGVuXT1cImRpYWxvZ1RhYiAhPT0gMlwiPlxyXG4gICAgPGNsaXBwZXItbGFzdC0xNS1kYXlzICNsYXN0MTVEYXlzIFtzaG93SGVhZGVyXT1cImZhbHNlXCI+PC9jbGlwcGVyLWxhc3QtMTUtZGF5cz5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19