@sumaris-net/ngx-components 18.23.62 → 18.23.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/src/app/core/home/home.mjs +3 -3
- package/esm2022/src/app/core/menu/menu.model.mjs +2 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +3 -2
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/core/menu/menu.model.d.ts +2 -0
- package/src/assets/i18n/en-US.json +4 -1
- package/src/assets/i18n/en.json +4 -1
- package/src/assets/i18n/fr.json +4 -1
- package/src/assets/manifest.json +1 -1
|
@@ -439,11 +439,11 @@ export class HomePage extends RxState {
|
|
|
439
439
|
this.cd.markForCheck();
|
|
440
440
|
}
|
|
441
441
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HomePage, deps: [{ token: i1.AccountService }, { token: i2.ModalController }, { token: i3.TranslateService }, { token: i2.ToastController }, { token: i4.ConfigService }, { token: i5.PlatformService }, { token: i0.ChangeDetectorRef }, { token: i6.NetworkService }, { token: i7.LocalSettingsService }, { token: ENVIRONMENT }, { token: APP_LOCALES }, { token: APP_HOME_BUTTONS, optional: true }, { token: APP_HOME_TOOLBAR_BUTTONS, optional: true }, { token: APP_HOME_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
442
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: HomePage, selector: "app-page-home", viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button [color]=\"item.color\" (click)=\"onToolbarButtonClick($event, item)\"\n [title]=\"!showTooltip ? (item.title | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.title | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\">\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button\n [color]=\"item.color || 'secondary'\"\n fill=\"solid\"\n (click)=\"onToolbarButtonClick($event, item)\"\n [title]=\"!showTooltip ? (item.title | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.title | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n >\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"!showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"!showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n @if (item.path) {\n <ion-button\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n <ion-badge *rxIf=\"item.$badge; let badge\"\n slot=\"end\"\n [color]=\"(item.$badgeColor | push) || 'accent'\">\n {{badge}}\n </ion-badge>\n </ion-button>\n } @else {\n <!-- divider -->\n <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n <ion-label translate>{{ item.title }} </ion-label>\n </div>\n }\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\"> </p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n [matTooltip]=\"showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n >\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ page.time | dateFromNow }}\n </small>\n \n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img\n class=\"logo\"\n src=\"{{ item.logo }}\"\n alt=\"{{ item.label }}\"\n [title]=\"!showTooltip ? item.label : ''\"\n [matTooltip]=\"showTooltip ? item.label : ''\"\n />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}ion-toolbar ion-button.mat-badge{--overflow: visible}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome .button-divider{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i9.RxIf, selector: "[rxIf]", inputs: ["rxIf", "rxIfStrategy", "rxIfElse", "rxIfThen", "rxIfSuspense", "rxIfComplete", "rxIfError", "rxIfContextTrigger", "rxIfNextTrigger", "rxIfSuspenseTrigger", "rxIfErrorTrigger", "rxIfCompleteTrigger", "rxIfParent", "rxIfPatchZone", "rxIfRenderCallback"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i15.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "component", type: i16.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "id", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "directive", type: i17.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i18.AppInstallUpgradeCard, selector: "app-install-upgrade-card", inputs: ["isLogin", "showUpgradeWarning", "showOfflineWarning", "showInstallButton", "debug"] }, { kind: "component", type: i19.UserEventNotificationIcon, selector: "app-user-event-notification-icon", inputs: ["titleI18n", "disabled", "filter", "autoHide", "headerActions", "footerActions", "style", "color", "unreadColor", "fill", "mobile", "listStyle", "debug"], outputs: ["showList"] }, { kind: "component", type: i20.FeedsComponent, selector: "app-feed", inputs: ["debug", "mobile", "showHeader", "showReadMoreButton", "headerColor", "cardColor", "shape", "class", "itemId", "filterItem", "feeds", "urls", "maxAgeInMonths", "maxContentLength"], outputs: ["editItem", "deleteItem"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i21.RxPush, name: "push" }, { kind: "pipe", type: i22.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i23.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i24.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i24.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i25.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i26.MatColorPipe, name: "matColor" }], animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
442
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: HomePage, selector: "app-page-home", viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button [color]=\"item.color\" (click)=\"onToolbarButtonClick($event, item)\"\n [class]=\"item.cssClass\"\n [title]=\"!showTooltip ? (item.tooltip | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.tooltip | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\">\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n <ion-label *rxIf=\"item.$title; let title\">\n <span [innerHTML]=\"title | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button\n fill=\"solid\"\n [color]=\"item.color || 'secondary'\"\n (click)=\"onToolbarButtonClick($event, item)\"\n [class]=\"item.cssClass\"\n [title]=\"!showTooltip ? (item.tooltip | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.tooltip | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n >\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n <ion-label *rxIf=\"item.$title; let title\">\n <span [innerHTML]=\"title | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"!showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"!showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n @if (item.path) {\n <ion-button\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n <ion-badge *rxIf=\"item.$badge; let badge\"\n slot=\"end\"\n [color]=\"(item.$badgeColor | push) || 'accent'\">\n {{badge}}\n </ion-badge>\n </ion-button>\n } @else {\n <!-- divider -->\n <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n <ion-label translate>{{ item.title }} </ion-label>\n </div>\n }\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\"> </p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n [matTooltip]=\"showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n >\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ page.time | dateFromNow }}\n </small>\n \n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img\n class=\"logo\"\n src=\"{{ item.logo }}\"\n alt=\"{{ item.label }}\"\n [title]=\"!showTooltip ? item.label : ''\"\n [matTooltip]=\"showTooltip ? item.label : ''\"\n />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}ion-toolbar ion-button.mat-badge{--overflow: visible}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome .button-divider{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i9.RxIf, selector: "[rxIf]", inputs: ["rxIf", "rxIfStrategy", "rxIfElse", "rxIfThen", "rxIfSuspense", "rxIfComplete", "rxIfError", "rxIfContextTrigger", "rxIfNextTrigger", "rxIfSuspenseTrigger", "rxIfErrorTrigger", "rxIfCompleteTrigger", "rxIfParent", "rxIfPatchZone", "rxIfRenderCallback"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i15.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "component", type: i16.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "id", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "directive", type: i17.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i18.AppInstallUpgradeCard, selector: "app-install-upgrade-card", inputs: ["isLogin", "showUpgradeWarning", "showOfflineWarning", "showInstallButton", "debug"] }, { kind: "component", type: i19.UserEventNotificationIcon, selector: "app-user-event-notification-icon", inputs: ["titleI18n", "disabled", "filter", "autoHide", "headerActions", "footerActions", "style", "color", "unreadColor", "fill", "mobile", "listStyle", "debug"], outputs: ["showList"] }, { kind: "component", type: i20.FeedsComponent, selector: "app-feed", inputs: ["debug", "mobile", "showHeader", "showReadMoreButton", "headerColor", "cardColor", "shape", "class", "itemId", "filterItem", "feeds", "urls", "maxAgeInMonths", "maxContentLength"], outputs: ["editItem", "deleteItem"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i21.RxPush, name: "push" }, { kind: "pipe", type: i22.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i23.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i24.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i24.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i25.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i26.MatColorPipe, name: "matColor" }], animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
443
443
|
}
|
|
444
444
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HomePage, decorators: [{
|
|
445
445
|
type: Component,
|
|
446
|
-
args: [{ selector: 'app-page-home', changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button [color]=\"item.color\" (click)=\"onToolbarButtonClick($event, item)\"\n [title]=\"!showTooltip ? (item.title | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.title | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\">\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button\n [color]=\"item.color || 'secondary'\"\n fill=\"solid\"\n (click)=\"onToolbarButtonClick($event, item)\"\n [title]=\"!showTooltip ? (item.title | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.title | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n >\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"!showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"!showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n @if (item.path) {\n <ion-button\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n <ion-badge *rxIf=\"item.$badge; let badge\"\n slot=\"end\"\n [color]=\"(item.$badgeColor | push) || 'accent'\">\n {{badge}}\n </ion-badge>\n </ion-button>\n } @else {\n <!-- divider -->\n <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n <ion-label translate>{{ item.title }} </ion-label>\n </div>\n }\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\"> </p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n [matTooltip]=\"showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n >\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ page.time | dateFromNow }}\n </small>\n \n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img\n class=\"logo\"\n src=\"{{ item.logo }}\"\n alt=\"{{ item.label }}\"\n [title]=\"!showTooltip ? item.label : ''\"\n [matTooltip]=\"showTooltip ? item.label : ''\"\n />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}ion-toolbar ion-button.mat-badge{--overflow: visible}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome .button-divider{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"] }]
|
|
446
|
+
args: [{ selector: 'app-page-home', changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button [color]=\"item.color\" (click)=\"onToolbarButtonClick($event, item)\"\n [class]=\"item.cssClass\"\n [title]=\"!showTooltip ? (item.tooltip | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.tooltip | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\">\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n <ion-label *rxIf=\"item.$title; let title\">\n <span [innerHTML]=\"title | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- Injected toolbar buttons -->\n @for (item of $filteredToolbarButtons | async; track item.title) {\n <ion-button\n fill=\"solid\"\n [color]=\"item.color || 'secondary'\"\n (click)=\"onToolbarButtonClick($event, item)\"\n [class]=\"item.cssClass\"\n [title]=\"!showTooltip ? (item.tooltip | translate) : ''\"\n [matTooltip]=\"showTooltip ? (item.tooltip | translate) : ''\"\n [matBadge]=\"item.$badge | push\"\n [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n [matBadgeHidden]=\"!(item.$badge | push)\"\n matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n >\n <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n <ion-label *rxIf=\"item.$title; let title\">\n <span [innerHTML]=\"title | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"!showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"!showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n @if (item.path) {\n <ion-button\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n <ion-badge *rxIf=\"item.$badge; let badge\"\n slot=\"end\"\n [color]=\"(item.$badgeColor | push) || 'accent'\">\n {{badge}}\n </ion-badge>\n </ion-button>\n } @else {\n <!-- divider -->\n <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n <ion-label translate>{{ item.title }} </ion-label>\n </div>\n }\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\"> </p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text\n class=\"ion-float-end\"\n [title]=\"!showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n [matTooltip]=\"showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n >\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n {{ page.time | dateFromNow }}\n </small>\n \n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img\n class=\"logo\"\n src=\"{{ item.logo }}\"\n alt=\"{{ item.label }}\"\n [title]=\"!showTooltip ? item.label : ''\"\n [matTooltip]=\"showTooltip ? item.label : ''\"\n />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}ion-toolbar ion-button.mat-badge{--overflow: visible}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome .button-divider{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"] }]
|
|
447
447
|
}], ctorParameters: () => [{ type: i1.AccountService }, { type: i2.ModalController }, { type: i3.TranslateService }, { type: i2.ToastController }, { type: i4.ConfigService }, { type: i5.PlatformService }, { type: i0.ChangeDetectorRef }, { type: i6.NetworkService }, { type: i7.LocalSettingsService }, { type: i27.Environment, decorators: [{
|
|
448
448
|
type: Inject,
|
|
449
449
|
args: [ENVIRONMENT]
|
|
@@ -469,4 +469,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
469
469
|
type: ViewChild,
|
|
470
470
|
args: [IonContent, { static: true }]
|
|
471
471
|
}] } });
|
|
472
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ob21lL2hvbWUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaG9tZS9ob21lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQUUsTUFBTSxFQUNqQixNQUFNLEVBQ04sY0FBYyxFQUdkLFFBQVEsRUFDUixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBb0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBVyxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUczRSxPQUFPLEVBQUUsV0FBVyxFQUErQixNQUFNLGtDQUFrQyxDQUFDO0FBSzVGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQWEsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BFLE9BQU8sRUFBb0IsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3BILE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRyxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0s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dUJBQXVCLENBQUMsTUFBTSxjQUNuQyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsQ0FBQzs7MEJBc0hsRSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ25DLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsd0JBQXdCOzswQkFDM0MsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlO3lDQWxCSSxPQUFPO3NCQUEvQyxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCwgaW5qZWN0LFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25Db250ZW50LCBNb2RhbENvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFJlZ2lzdGVyTW9kYWwgfSBmcm9tICcuLi9yZWdpc3Rlci9yZWdpc3Rlci5tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY2NvdW50LCBhY2NvdW50VG9TdHJpbmcgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9hY2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2RlcGFydG1lbnQubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPQ0FMRVMsIExvY2FsZUNvbmZpZywgTG9jYWxTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFwcEF1dGhNb2RhbCB9IGZyb20gJy4uL2F1dGgvYXV0aC5tb2RhbCc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBJTWVudUl0ZW0sIE1lbnVJdGVtLCBNZW51SXRlbXMgfSBmcm9tICcuLi9tZW51L21lbnUubW9kZWwnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBmYWRlSW5BbmltYXRpb24sIHNsaWRlSW5BbmltYXRpb24sIHNsaWRlVXBEb3duQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBIaXN0b3J5UGFnZVJlZmVyZW5jZSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2hpc3RvcnkubW9kZWwnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgSW1hZ2VzVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9pbWFnZXMudXRpbHMnO1xuaW1wb3J0IHsgVXJpVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS91cmkudXRpbHMnO1xuaW1wb3J0IHsgUGVlciB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3BlZXIubW9kZWwnO1xuaW1wb3J0IHsgQXBwTWFya2Rvd25Nb2RhbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXJrZG93bi9tYXJrZG93bi5tb2RhbCc7XG5pbXBvcnQgeyBTT0NJQUxfQ09ORklHX09QVElPTlMgfSBmcm9tICcuLi8uLi9zb2NpYWwvY29uZmlnL3NvY2lhbC5jb25maWcnO1xuaW1wb3J0IHsgRmVlZHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zb2NpYWwvZmVlZC9mZWVkLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEFQUF9TSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuLyoqXG4gKiBAcGFyYW0gZmlsZXNcbiAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0KClgIGluc3RlYWRcbiAqKi9cbmV4cG9ydCBjb25zdCBnZXRSYW5kb21JbWFnZSA9IEltYWdlc1V0aWxzLmdldFJhbmRvbUltYWdlO1xuZXhwb3J0IGNvbnN0IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdCA9IEltYWdlc1V0aWxzLmdldFJhbmRvbUltYWdlV2l0aENyZWRpdDtcblxuZXhwb3J0IGNvbnN0IEFQUF9IT01FX0JVVFRPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48SU1lbnVJdGVtW10+KCdob21lQnV0dG9uJyk7XG5cbmV4cG9ydCBjb25zdCBBUFBfSE9NRV9UT09MQkFSX0JVVFRPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48SU1lbnVJdGVtW10+KCdob21lVG9vbGJhckJ1dHRvbnMnKTtcblxuZXhwb3J0IGNvbnN0IEFQUF9IT01FX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJSG9tZVBhZ2VDb25maWc+KCdob21lQ29uZmlnJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhvbWVQYWdlQ29uZmlnIHtcbiAgc2hvd05vdGlmaWNhdGlvbkljb24/OiBib29sZWFuIHwgJ21vYmlsZScgfCAnZGVza3RvcCc7XG4gIGF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbj86IGJvb2xlYW4gfCAnbW9iaWxlJyB8ICdkZXNrdG9wJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb21lUGFnZVN0YXRlIHtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgc2hvd1NwaW5uZXI6IGJvb2xlYW47XG4gIHNob3dQYXJ0bmVyQmFubmVyOiBib29sZWFuO1xuICBzaG93TGVnYWxJbmZvcm1hdGlvbjogYm9vbGVhbjtcbiAgc2hvd0luc3RhbGxMaW5rczogYm9vbGVhbjtcbiAgcGFnZUhpc3Rvcnk6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW107XG4gIGRhcmtNb2RlOiBib29sZWFuO1xuICBoYXNGZWVkOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcGFnZS1ob21lJyxcbiAgdGVtcGxhdGVVcmw6ICdob21lLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ob21lLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIHNsaWRlVXBEb3duQW5pbWF0aW9uLCBzbGlkZUluQW5pbWF0aW9uXSxcbn0pXG5leHBvcnQgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBSeFN0YXRlPEhvbWVQYWdlU3RhdGU+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2NvbmZpZzogQ29uZmlndXJhdGlvbjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVidWc6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93QWNjb3VudEJ1dHRvbjogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWNjb3VudE5hbWUgPSAnJztcbiAgcHJvdGVjdGVkIGlzTG9naW46IGJvb2xlYW47XG4gIHByb3RlY3RlZCBsb2dvOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYXBwTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgaXNXZWI6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjYW5SZWdpc3RlcjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnRlbnRTdHlsZTogYW55O1xuICBwcm90ZWN0ZWQgY29udGVudENyZWRpdHM6IHN0cmluZztcbiAgcHJvdGVjdGVkIGxlZ2FsSW5mb3JtYXRpb246IElNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9mZmxpbmU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzaG93Tm90aWZpY2F0aW9uSWNvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHNob3dGZWVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBmZWVkVXJsczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBmZWVkTWF4QWdlSW5Nb250aHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGZlZWRNYXhDb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gIHByb3RlY3RlZCBoYXNTY3JvbGxiYXIgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYnV0dG9uczogTWVudUl0ZW1bXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvb2xiYXJCdXR0b25zOiBNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgbG9hZGluZyQgPSB0aGlzLnNlbGVjdCgnbG9hZGluZycpO1xuICBwcm90ZWN0ZWQgJHBhcnRuZXJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEZXBhcnRtZW50W10+KG51bGwpO1xuICBwcm90ZWN0ZWQgJGZpbHRlcmVkQnV0dG9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkICRmaWx0ZXJlZFRvb2xiYXJCdXR0b25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGFya01vZGUkID0gdGhpcy5zZWxlY3QoJ2RhcmtNb2RlJyk7XG4gIHByb3RlY3RlZCBwYWdlSGlzdG9yeSQgPSB0aGlzLnNlbGVjdCgncGFnZUhpc3RvcnknKTtcbiAgcHJvdGVjdGVkIGhhc0ZlZWQkID0gdGhpcy5zZWxlY3QoJ2hhc0ZlZWQnKTtcblxuICBzZXQgcGFnZUhpc3RvcnkodmFsdWU6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW10pIHtcbiAgICB0aGlzLnNldCgncGFnZUhpc3RvcnknLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgcGFnZUhpc3RvcnkoKTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwYWdlSGlzdG9yeScpO1xuICB9XG5cbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnbG9hZGluZycsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnbG9hZGluZycpO1xuICB9XG5cbiAgc2V0IHNob3dTcGlubmVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ3Nob3dTcGlubmVyJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dTcGlubmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd1NwaW5uZXInKTtcbiAgfVxuXG4gIHNldCBzaG93UGFydG5lckJhbm5lcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdzaG93UGFydG5lckJhbm5lcicsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93UGFydG5lckJhbm5lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dQYXJ0bmVyQmFubmVyJyk7XG4gIH1cblxuICBzZXQgc2hvd0xlZ2FsSW5mb3JtYXRpb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd0xlZ2FsSW5mb3JtYXRpb24nLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd0xlZ2FsSW5mb3JtYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzaG93TGVnYWxJbmZvcm1hdGlvbicpO1xuICB9XG5cbiAgc2V0IHNob3dJbnN0YWxsTGlua3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd0luc3RhbGxMaW5rcycsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93SW5zdGFsbExpbmtzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd0luc3RhbGxMaW5rcycpO1xuICB9XG5cbiAgc2V0IGRhcmtNb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ2RhcmtNb2RlJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IGRhcmtNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnZGFya01vZGUnKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZTtcbiAgfVxuXG4gIGdldCBwYXJ0bmVyQmFubmVyU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNob3dMZWdhbEluZm9ybWF0aW9uID8gOCA6IDEyO1xuICB9XG5cbiAgQFZpZXdDaGlsZChJb25Db250ZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250ZW50OiBJb25Db250ZW50O1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KEFQUF9TSE9XX1RPT0xUSVAsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHB1YmxpYyBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBASW5qZWN0KEFQUF9MT0NBTEVTKSBwcm90ZWN0ZWQgbG9jYWxlczogTG9jYWxlQ29uZmlnW10sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfSE9NRV9CVVRUT05TKSBidXR0b25zOiBJTWVudUl0ZW1bXSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9IT01FX1RPT0xCQVJfQlVUVE9OUykgdG9vbGJhckJ1dHRvbnM6IElNZW51SXRlbVtdLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0hPTUVfQ09ORklHKSBwcm90ZWN0ZWQgY29uZmlnOiBJSG9tZVBhZ2VDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNldCg8UGFydGlhbDxIb21lUGFnZVN0YXRlPj57XG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgc2hvd1BhcnRuZXJCYW5uZXI6IGZhbHNlLFxuICAgICAgc2hvd1NwaW5uZXI6ICF0aGlzLnBsYXRmb3JtLnN0YXJ0ZWQsXG4gICAgICBkYXJrTW9kZTogdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5idXR0b25zID0gKGJ1dHRvbnMgfHwgW10pPy5tYXAoKGl0ZW0pID0+IE1lbnVJdGVtLmZyb21PYmplY3QoaXRlbSkpO1xuICAgIHRoaXMudG9vbGJhckJ1dHRvbnMgPSAodG9vbGJhckJ1dHRvbnMgfHwgW10pPy5tYXAoKGl0ZW0pID0+IE1lbnVJdGVtLmZyb21PYmplY3QoaXRlbSkpO1xuICAgIGNvbnNvbGUubG9nKCd0b29sYmFyQnV0dG9ucycsIHRoaXMudG9vbGJhckJ1dHRvbnMpO1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJyk7XG4gICAgdGhpcy5wbGF0Zm9ybS5yZWFkeSgpLnRoZW4oKCkgPT4gdGhpcy5zdGFydCgpKTtcbiAgICB0aGlzLnNob3dBY2NvdW50QnV0dG9uID0gZW52aXJvbm1lbnQuYWNjb3VudD8uc2hvd0FjY291bnRCdXR0b24gPz8gdHJ1ZTtcblxuICAgIHRoaXMuY29ubmVjdCgnZGFya01vZGUnLCB0aGlzLnNldHRpbmdzLmRhcmtNb2RlJCk7XG5cbiAgICAvLyBERVZcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApKSAvLyDDiXZpdGUgbGVzIGFwcGVscyB0cm9wIGZyw6lxdWVudHNcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja1Njcm9sbGJhcigpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhc3luYyBsb2dpbigpIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IEFwcEF1dGhNb2RhbCxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kYWwucHJlc2VudCgpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoKSB7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBSZWdpc3Rlck1vZGFsLFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kYWwucHJlc2VudCgpO1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KGV2ZW50OiBhbnkpIHtcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLmxvZ291dCgpO1xuXG4gICAgLy8gSWYgd2FzIG9mZmxpbmUsIHRyeSB0byByZWNvbm5lY3QgKGJlY2F1c2UgY2FuIGJlIGEgZm9yY2VkIG9mZmxpbmUgbW9kZSlcbiAgICBpZiAodGhpcy5vZmZsaW5lKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyeU9ubGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUxhbmd1YWdlKGxvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXR0aW5ncy5hcHBseSh7IGxvY2FsZSB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRQYWdlUGF0aChpbmRleDogbnVtYmVyLCBwYWdlOiBIaXN0b3J5UGFnZVJlZmVyZW5jZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhZ2U/LnBhdGg7XG4gIH1cblxuICB0cnlPbmxpbmUoKSB7XG4gICAgdGhpcy53YWl0aW5nTmV0d29yayA9IHRydWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRoaXMubmV0d29ya1xuICAgICAgLnRyeU9ubGluZSh7XG4gICAgICAgIHNob3dMb2FkaW5nVG9hc3Q6IGZhbHNlLFxuICAgICAgICBzaG93T25saW5lVG9hc3Q6IHRydWUsXG4gICAgICAgIHNob3dPZmZsaW5lVG9hc3Q6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy53YWl0aW5nTmV0d29yayA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kICAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCk7XG5cbiAgICB0aGlzLmlzTG9naW4gPSB0aGlzLmFjY291bnRTZXJ2aWNlLmlzTG9naW4oKTtcbiAgICBpZiAodGhpcy5pc0xvZ2luKSB7XG4gICAgICB0aGlzLm9uTG9naW4odGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm9mZmxpbmUgPSB0aGlzLm5ldHdvcmsub2ZmbGluZTtcblxuICAgIC8vIExpc3RlbiBsb2dpbi9sb2dvdXQgZXZlbnRzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9naW4uc3Vic2NyaWJlKChhY2NvdW50KSA9PiB0aGlzLm9uTG9naW4oYWNjb3VudCkpKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dvdXQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Mb2dvdXQoKSkpO1xuXG4gICAgLy8gTGlzdGVuIHBvZCBjb25maWdcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHRoaXMub25Db25maWdMb2FkZWQoY29uZmlnKSkpO1xuXG4gICAgLy8gTGlzdGVuIHNldHRpbmdzIGNoYW5nZXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBBZGQgYSBkZWxheSwgdG8gYXZvaWQgdG8gYXBwbHkgY2hhbmdlcyB0byBvZnRlblxuICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgIC8vIFN0YXJ0IHdpdGggY3VycmVudCBzZXR0aW5nc1xuICAgICAgICAgIHN0YXJ0V2l0aChhd2FpdCB0aGlzLnNldHRpbmdzLnJlYWR5KCkpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB0aGlzLm9uU2V0dGluZ3NDaGFuZ2VkKHJlcykpXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBuZXR3b3JrIGNoYW5nZXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5uZXR3b3JrLm9uTmV0d29ya1N0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy9kZWJvdW5jZVRpbWUoNDUwKSxcbiAgICAgICAgICAvL3RhcCgoKSA9PiB0aGlzLndhaXRpbmdOZXR3b3JrID0gZmFsc2UpLFxuICAgICAgICAgIG1hcCgoY29ubmVjdGlvblR5cGUpID0+IGNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChvZmZsaW5lKSA9PiB7XG4gICAgICAgICAgdGhpcy5vZmZsaW5lID0gb2ZmbGluZTtcbiAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ29uZmlnTG9hZGVkKGNvbmZpZzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tob21lXSBBcHBseWluZyBjb25maWd1cmF0aW9uJywgY29uZmlnKTtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG5cbiAgICB0aGlzLmFwcE5hbWUgPSBjb25maWcubGFiZWwgfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXBwTmFtZSB8fCAnU1VNQVJpUyc7XG4gICAgdGhpcy5sb2dvID0gY29uZmlnLmxhcmdlTG9nbyB8fCBjb25maWcuc21hbGxMb2dvIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5pc1dlYiA9IHRoaXMucGxhdGZvcm0uaXNXZWIoKTtcbiAgICB0aGlzLmNhblJlZ2lzdGVyID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuUkVHSVNUUkFUSU9OX0VOQUJMRSk7XG5cbiAgICBjb25zdCBzaG93Tm90aWZpY2F0aW9uSWNvbkJ5Q29uZmlnID1cbiAgICAgIHRoaXMuY29uZmlnPy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9PT0gdHJ1ZSB8fFxuICAgICAgKHRoaXMuY29uZmlnPy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9PT0gJ21vYmlsZScgJiYgdGhpcy5tb2JpbGUpIHx8XG4gICAgICAodGhpcy5jb25maWc/LnNob3dOb3RpZmljYXRpb25JY29uID09PSAnZGVza3RvcCcgJiYgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb25JY29uID0gc2hvd05vdGlmaWNhdGlvbkljb25CeUNvbmZpZyAmJiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oU09DSUFMX0NPTkZJR19PUFRJT05TLkVOQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpO1xuICAgIHRoaXMuYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID1cbiAgICAgIHRoaXMuY29uZmlnPy5hdXRvSGlkZU5vdGlmaWNhdGlvbkljb24gPT09IHRydWUgfHxcbiAgICAgICh0aGlzLmNvbmZpZz8uYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID09PSAnbW9iaWxlJyAmJiB0aGlzLm1vYmlsZSkgfHxcbiAgICAgICh0aGlzLmNvbmZpZz8uYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID09PSAnZGVza3RvcCcgJiYgIXRoaXMubW9iaWxlKSB8fFxuICAgICAgZmFsc2U7XG5cbiAgICAvLyBGZWVkXG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5jdXJyZW50TG9jYWxlO1xuICAgIHRoaXMuc2hvd0ZlZWQgPSBjb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oQ09SRV9DT05GSUdfT1BUSU9OUy5IT01FX0ZFRURfRU5BQkxFKSB8fCAhIXRoaXMuZW52aXJvbm1lbnQ/LmZlZWQ/Lmpzb25GZWVkO1xuICAgIHRoaXMuZmVlZFVybHMgPSBjb25maWcuZ2V0UHJvcGVydHlBc1N0cmluZ3MoQ09SRV9DT05GSUdfT1BUSU9OUy5IT01FX0ZFRURfVVJMUykgPz8gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8uanNvbkZlZWQ/Lltsb2NhbGVdO1xuICAgIHRoaXMuZmVlZE1heEFnZUluTW9udGhzID1cbiAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0eUFzSW50KENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX01BWF9BR0VfSU5fTU9OVEhTKSA/PyB0aGlzLmVudmlyb25tZW50Py5mZWVkPy5tYXhBZ2VJbk1vbnRocyA/PyAtMTtcbiAgICB0aGlzLmZlZWRNYXhDb250ZW50TGVuZ3RoID1cbiAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0eUFzSW50KENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX01BWF9DT05URU5UX0xFTkdUSCkgPz8gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8ubWF4Q29udGVudExlbmd0aCA/PyAtMTtcblxuICAgIC8vIExlZ2FsIGluZm9ybWF0aW9uXG4gICAgdGhpcy5sZWdhbEluZm9ybWF0aW9uID0gW1xuICAgICAge1xuICAgICAgICB0aXRsZTogJ0hPTUUuUFJJVkFDWV9QT0xJQ1knLFxuICAgICAgICBwYXRoOiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5QUklWQUNZX1BPTElDWV9VUkwpID8/ICh0aGlzLmVudmlyb25tZW50LnByaXZhY3lQb2xpY3lVcmwgYXMgc3RyaW5nKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiAnSE9NRS5URVJNU19PRl9VU0UnLFxuICAgICAgICBwYXRoOiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5URVJNU19PRl9VU0VfVVJMKSA/PyAodGhpcy5lbnZpcm9ubWVudC50ZXJtc09mVXNlVXJsIGFzIHN0cmluZyksXG4gICAgICB9LFxuICAgIF0uZmlsdGVyKChpdGVtKSA9PiBpc05vdE5pbE9yQmxhbmsoaXRlbS5wYXRoKSk7XG4gICAgdGhpcy5zaG93TGVnYWxJbmZvcm1hdGlvbiA9IGlzTm90RW1wdHlBcnJheSh0aGlzLmxlZ2FsSW5mb3JtYXRpb24pO1xuXG4gICAgY29uc3QgcGFydG5lcnMgPSAodGhpcy5fY29uZmlnLnBhcnRuZXJzIHx8IFtdKS5maWx0ZXIoKHApID0+IHAgJiYgcC5sb2dvKTtcbiAgICB0aGlzLiRwYXJ0bmVycy5uZXh0KHBhcnRuZXJzKTtcbiAgICB0aGlzLnNob3dQYXJ0bmVyQmFubmVyID0gcGFydG5lcnMubGVuZ3RoID4gMDtcbiAgICAvLyBUT0RPIGxvYWQgaW5zdGFsbCBsaW5rc1xuXG4gICAgLy8gSWYgbm90IGFscmVhZHkgc2V0LCBjb21wdXRlIHRoZSBiYWNrZ3JvdW5kIGltYWdlXG4gICAgaWYgKCF0aGlzLmNvbnRlbnRTdHlsZSkge1xuICAgICAgY29uc3QgYmFja2dyb3VuZEltYWdlcyA9IChjb25maWcuYmFja2dyb3VuZEltYWdlcyB8fCBbXSlcbiAgICAgICAgLy8gRmlsdGVyIG9uIG5vdCBuaWwsIGJlY2F1c2UgY2FuIG9jY3VyIGlmIGRldGVjdGVkIGhhcyBub3QgZXhpc3RzIChzZWUgY29uZmlnLXNlcnZpY2UuanMpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGltZykgPT5cbiAgICAgICAgICAgIGlzTm90TmlsKGltZykgJiZcbiAgICAgICAgICAgIC8vIElmIG9mZmxpbmUsIGZpbHRlciBvbiBsb2NhbCBkYXRhVVJMIGltYWdlXG4gICAgICAgICAgICAoIXRoaXMub2ZmbGluZSB8fCAhaW1nLnN0YXJ0c1dpdGgoJ2h0dHAnKSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gQmFja2dyb3VuZCBpbWFnZSBmb3VuZDogc2VsZWN0IG9uZSByYW5kb21seVxuICAgICAgaWYgKGJhY2tncm91bmRJbWFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UsIGNyZWRpdHMgfSA9IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdChiYWNrZ3JvdW5kSW1hZ2VzKTtcbiAgICAgICAgdGhpcy5jb250ZW50U3R5bGUgPSBpbWFnZSA/IHsgJ2JhY2tncm91bmQtaW1hZ2UnOiBgdXJsKCR7aW1hZ2V9KWAgfSA6IHt9O1xuICAgICAgICB0aGlzLmNvbnRlbnRDcmVkaXRzID0gY3JlZGl0cyB8fCAnJztcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGJhY2tncm91bmQgY29sb3JcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29sb3IgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5DT0xPUl9QUklNQVJZKSB8fCAndmFyKC0taW9uLWNvbG9yLXByaW1hcnkpJztcbiAgICAgICAgdGhpcy5jb250ZW50U3R5bGUgPSAocHJpbWFyeUNvbG9yICYmIHsgJ2JhY2tncm91bmQtY29sb3InOiBwcmltYXJ5Q29sb3IgfSkgfHwge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja1Njcm9sbGJhcigpO1xuICAgIHRoaXMucmVmcmVzaEJ1dHRvbnMoKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gSWYgZmlyc3QgbG9hZCwgaGlkZSB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNldHRpbmdzQ2hhbmdlZChzZXR0aW5nczogTG9jYWxTZXR0aW5ncykge1xuICAgIGlmIChzZXR0aW5ncy5wYWdlSGlzdG9yeSAhPT0gdGhpcy5wYWdlSGlzdG9yeSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2hvbWVdIFBhZ2UgaGlzdG9yeSBsb2FkZWQnKTtcbiAgICAgIHRoaXMucGFnZUhpc3RvcnkgPSBzZXR0aW5ncy5wYWdlSGlzdG9yeSB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2dpbihhY2NvdW50OiBBY2NvdW50KSB7XG4gICAgaWYgKCFhY2NvdW50KSByZXR1cm47IC8vIFNraXBcbiAgICAvL2NvbnNvbGUuZGVidWcoJ1tob21lXSBMb2dnZWQgYWNjb3VudDogJywgYWNjb3VudCk7XG4gICAgdGhpcy5pc0xvZ2luID0gdHJ1ZTtcbiAgICB0aGlzLmFjY291bnROYW1lID0gYWNjb3VudFRvU3RyaW5nKGFjY291bnQpO1xuICAgIHRoaXMucmVmcmVzaEJ1dHRvbnMoYWNjb3VudCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkxvZ291dCgpIHtcbiAgICB0aGlzLmlzTG9naW4gPSBmYWxzZTtcbiAgICB0aGlzLmFjY291bnROYW1lID0gJyc7XG4gICAgdGhpcy5wYWdlSGlzdG9yeSA9IFtdO1xuICAgIHRoaXMucmVmcmVzaEJ1dHRvbnMoKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hCdXR0b25zKGFjY291bnQ/OiBBY2NvdW50KSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcpIHJldHVybjsgLy8gU2tpcCAod2FpdGluZyBjb25maWcgdG8gYmUgbG9hZGVkKVxuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbaG9tZV0gUmVmcmVzaGluZyBidXR0b25zLi4uJyk7XG5cbiAgICB0aGlzLiRmaWx0ZXJlZEJ1dHRvbnMubmV4dCh0aGlzLmZpbHRlckJ1dHRvbnModGhpcy5idXR0b25zLCBhY2NvdW50KSk7XG4gICAgdGhpcy4kZmlsdGVyZWRUb29sYmFyQnV0dG9ucy5uZXh0KHRoaXMuZmlsdGVyQnV0dG9ucyh0aGlzLnRvb2xiYXJCdXR0b25zLCBhY2NvdW50KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVyQnV0dG9ucyhpdGVtczogTWVudUl0ZW1bXSwgYWNjb3VudD86IEFjY291bnQpOiBNZW51SXRlbVtdIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZykgcmV0dXJuOyAvLyBTa2lwICh3YWl0aW5nIGNvbmZpZyB0byBiZSBsb2FkZWQpXG5cbiAgICBhY2NvdW50ID0gYWNjb3VudCB8fCB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQ7XG4gICAgcmV0dXJuIChpdGVtcyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIE1lbnVJdGVtcy5jaGVja0lmVmlzaWJsZShpdGVtLCBhY2NvdW50LCB0aGlzLl9jb25maWcsIHtcbiAgICAgICAgICBpc0xvZ2luOiB0aGlzLmlzTG9naW4sXG4gICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgICAgbG9nUHJlZml4OiAnW2hvbWVdJyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgLy8gUmVwbGFjZSB0aXRsZSB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoaXRlbS50aXRsZVByb3BlcnR5KSAmJiB0aGlzLl9jb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2NvbmZpZy5wcm9wZXJ0aWVzPy5baXRlbS50aXRsZVByb3BlcnR5XSA/PyBpdGVtLnRpdGxlO1xuICAgICAgICAgIGlmIChpdGVtLnRpdGxlICE9PSB0aXRsZSkge1xuICAgICAgICAgICAgLy8gQ2xvbmUgYmVmb3JlIGNoYW5naW5nLCB0byBiZSBhYmxlIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHRpdGxlIChlLmcuIGlmIGNvbmZpZyBwcm9wZXJ0eSBjaGFuZ2VkKVxuICAgICAgICAgICAgaXRlbS5jbG9uZSgpO1xuICAgICAgICAgICAgaXRlbS50aXRsZSA9IHRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgb3Blbk1hcmtkb3duTW9kYWwoZXZlbnQ/OiBFdmVudCwgaXRlbTogSU1lbnVJdGVtID0gbnVsbCkge1xuICAgIGlmIChpc05pbE9yQmxhbmsoaXRlbT8ucGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgcmVsYXRpdmUgcGF0aFxuICAgIGxldCB1cmwgPSBpdGVtLnBhdGg7XG4gICAgaWYgKHRoaXMubmV0d29yay5wZWVyICYmICh1cmwuc3RhcnRzV2l0aCgnLi8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnLycpKSkge1xuICAgICAgdXJsID0gUGVlci5wYXRoKHRoaXMubmV0d29yay5wZWVyLCB1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhGaWxlbmFtZSA9IFVyaVV0aWxzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgY29uc3QgaXNNYXJrZG93bkZpbGUgPSBwYXRoRmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpO1xuXG4gICAgLy8gT3BlbiBhcyBtYXJrZG93blxuICAgIGlmIChpc01hcmtkb3duRmlsZSkge1xuICAgICAgYXdhaXQgQXBwTWFya2Rvd25Nb2RhbC5zaG93KHRoaXMubW9kYWxDdHJsLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGl0ZW0udGl0bGUsIGl0ZW0udGl0bGVBcmdzKSxcbiAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgY2FuUHJpbnQ6ICF0aGlzLm1vYmlsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPcGVuIGFzIGV4dGVybmFsIGxpbmtcbiAgICAgIGF3YWl0IHRoaXMucGxhdGZvcm0ub3Blbih1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB0b2dnbGVEYXJrTW9kZSgpIHtcbiAgICBjb25zdCBlbmFibGUgPSAhdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlO1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBkYXJrTW9kZTogZW5hYmxlLCBhdXRvRGFya01vZGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZVBhZ2VIaXN0b3J5KHBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVtb3ZlUGFnZUhpc3RvcnkocGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWwgPSBhd2FpdCB0aGlzLmNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIHRoaXMuaGFzU2Nyb2xsYmFyID0gc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKCdbaG9tZV0gQ2hlY2sgc2Nyb2xsYmFyJywgdGhpcy5oYXNTY3JvbGxiYXIpO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0RmVlZChmZWVkOiBGZWVkc0NvbXBvbmVudCkge1xuICAgIGlmICghZmVlZCkgcmV0dXJuO1xuICAgIHRoaXMuY29ubmVjdCgnaGFzRmVlZCcsIGZlZWQuaGFzRmVlZHMkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvb2xiYXJCdXR0b25DbGljayhldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaXRlbS5hY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIiB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGU+XG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uIFthdXRvSGlkZV09XCJhdXRvSGlkZU5vdGlmaWNhdGlvbkljb25cIj48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgIH1cblxuICAgIDwhLS0gSW5qZWN0ZWQgdG9vbGJhciBidXR0b25zIC0tPlxuICAgIEBmb3IgKGl0ZW0gb2YgJGZpbHRlcmVkVG9vbGJhckJ1dHRvbnMgfCBhc3luYzsgdHJhY2sgaXRlbS50aXRsZSkge1xuICAgICAgPGlvbi1idXR0b24gW2NvbG9yXT1cIml0ZW0uY29sb3JcIiAoY2xpY2spPVwib25Ub29sYmFyQnV0dG9uQ2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKGl0ZW0udGl0bGUgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoaXRlbS50aXRsZSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiaXRlbS4kYmFkZ2UgfCBwdXNoXCJcbiAgICAgICAgICAgICAgICAgIFttYXRCYWRnZUNvbG9yXT1cIihpdGVtLiRiYWRnZUNvbG9yIHwgcHVzaCkgfCBtYXRDb2xvclwiXG4gICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIShpdGVtLiRiYWRnZSB8IHB1c2gpXCJcbiAgICAgICAgICAgICAgICAgIG1hdEJhZGdlT3ZlcmxhcD1cInRydWVcIiBtYXRCYWRnZVNpemU9XCJzbWFsbFwiIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiPlxuICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJpdGVtLmljb25cIiBzbG90PVwiaWNvbi1vbmx5XCIgW25hbWVdPVwiaXRlbS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiaXRlbS5tYXRJY29uXCIgc2xvdD1cImljb24tb25seVwiPnt7IGl0ZW0ubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuXG4gICAgPCEtLSBkYXJrIG1vZGUgKGlmIGFsbG93IGJ5IHRoZSBlbnZpcm9ubWVudCB0b2tlbikgLS0+XG4gICAgQGlmIChzZXR0aW5ncy5hbGxvd0RhcmtNb2RlKSB7XG4gICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRGFya01vZGUoKVwiPlxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIFtuYW1lXT1cIihkYXJrTW9kZSQgfCBwdXNoKSA/ICdzdW5ueScgOiAnbW9vbidcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gQ2hhbmdlIGxvY2FsZSBidXR0b24gLS0+XG4gICAgPGlvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImxvY2FsZU1lbnVcIj5cbiAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwibGFuZ3VhZ2VcIj48L2lvbi1pY29uPlxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgPC9pb24tYnV0dG9ucz5cbjwvYXBwLXRvb2xiYXI+XG5cbjwhLS0gQ2hhbmdlIGxvY2FsZSBtZW51IC0tPlxuPG1hdC1tZW51ICNsb2NhbGVNZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgQGZvciAoaXRlbSBvZiBsb2NhbGVzOyB0cmFjayBpdGVtLmtleSkge1xuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjaGFuZ2VMYW5ndWFnZShpdGVtLmtleSlcIj5cbiAgICAgICAgPCEtLTxtYXQtaWNvbj57eyBjdXJyZW50TG9jYWxlID09PSBpdGVtLmtleSA/ICdjaGVja21hcmsnIDogdW5kZWZpbmVkIH19PC9tYXQtaWNvbj4tLT5cbiAgICAgICAgPGlvbi1sYWJlbD57eyBpdGVtLnZhbHVlIH19PC9pb24tbGFiZWw+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48aW9uLWNvbnRlbnQgW25nU3R5bGVdPVwiY29udGVudFN0eWxlXCIgW2NsYXNzLmhhcy1zY3JvbGxiYXJdPVwiaGFzU2Nyb2xsYmFyXCIgbm8tcGFkZGluZy14cz5cbiAgPCEtLSBsb2FkaW5nIHNwaW5uZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXBhZ2VcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhKGxvYWRpbmckIHwgcHVzaClcIj5cbiAgICBAaWYgKHNob3dTcGlubmVyKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPlxuICAgICAgICA8cCBbaW5uZXJIVE1MXT1cIidDT01NT04uTE9BRElOR19ET1RTJyB8IHRyYW5zbGF0ZVwiPjwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNrLWN1YmUxIHNrLWN1YmVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNrLWN1YmUyIHNrLWN1YmVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNrLWN1YmU0IHNrLWN1YmVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNrLWN1YmUzIHNrLWN1YmVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPCEtLSBEZXNrdG9wOiB0cmFuc2x1Y2VudCB0b3AgdG9vbGJhciAtLT5cbiAgQGlmICghbW9iaWxlKSB7XG4gICAgPGRpdiBjbGFzcz1cImhpZGRlbi14cyBoaWRkZW4tc21cIj5cbiAgICAgIDxpb24tdG9vbGJhciBjb2xvcj1cInRyYWFuc3BhcmVudFwiIHRyYW5zbHVjZW50PlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgPGlvbi1tZW51LXRvZ2dsZT5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiBmaWxsPVwiY2xlYXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwibWVudVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tbWVudS10b2dnbGU+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICBAaWYgKHNob3dOb3RpZmljYXRpb25JY29uKSB7XG4gICAgICAgICAgICA8YXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWljb25cbiAgICAgICAgICAgICAgW3N0eWxlXT1cIidpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgdW5yZWFkQ29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgICAgIFthdXRvSGlkZV09XCJhdXRvSGlkZU5vdGlmaWNhdGlvbkljb25cIlxuICAgICAgICAgICAgPjwvYXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWljb24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBJbmplY3RlZCB0b29sYmFyIGJ1dHRvbnMgLS0+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiAkZmlsdGVyZWRUb29sYmFyQnV0dG9ucyB8IGFzeW5jOyB0cmFjayBpdGVtLnRpdGxlKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBbY29sb3JdPVwiaXRlbS5jb2xvciB8fCAnc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRvb2xiYXJCdXR0b25DbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IChpdGVtLnRpdGxlIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoaXRlbS50aXRsZSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIFttYXRCYWRnZV09XCJpdGVtLiRiYWRnZSB8IHB1c2hcIlxuICAgICAgICAgICAgICBbbWF0QmFkZ2VDb2xvcl09XCIoaXRlbS4kYmFkZ2VDb2xvciB8IHB1c2gpIHwgbWF0Q29sb3JcIlxuICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIShpdGVtLiRiYWRnZSB8IHB1c2gpXCJcbiAgICAgICAgICAgICAgbWF0QmFkZ2VPdmVybGFwPVwidHJ1ZVwiIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCIgbWF0QmFkZ2VQb3NpdGlvbj1cImFib3ZlIGFmdGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiaXRlbS5pY29uXCIgc2xvdD1cImljb24tb25seVwiIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIml0ZW0ubWF0SWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIj57eyBpdGVtLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gZGFyayBtb2RlIChpZiBhbGxvdyBieSB0aGUgZW52aXJvbm1lbnQgdG9rZW4pIC0tPlxuICAgICAgICAgIEBpZiAoc2V0dGluZ3MuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGFya01vZGUoKVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0hPTUUuQlROX0RBUktfTU9ERScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnSE9NRS5CVE5fREFSS19NT0RFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgW25hbWVdPVwiKGRhcmtNb2RlJCB8IHB1c2gpID8gJ21vb24nIDogJ3N1bm55J1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gY2hhbmdlIGxvY2FsZSBidXR0b24gLS0+XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibG9jYWxlTWVudVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdTRVRUSU5HUy5MT0NBTEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdTRVRUSU5HUy5MT0NBTEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJsYW5ndWFnZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gSW5zdGFsbCAoYW5kIHVwZ3JhZGUpIGNhcmQgLS0+XG4gIDxhcHAtaW5zdGFsbC11cGdyYWRlLWNhcmQgW2lzTG9naW5dPVwiaXNMb2dpblwiIFtzaG93SW5zdGFsbEJ1dHRvbl09XCJ0cnVlXCI+PC9hcHAtaW5zdGFsbC11cGdyYWRlLWNhcmQ+XG5cbiAgQGlmICghKGxvYWRpbmckIHwgcHVzaCkpIHtcbiAgICBAbGV0IGhhc0ZlZWQgPSBoYXNGZWVkJCB8IGFzeW5jO1xuICAgIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjBcIiBbc2l6ZVhsXT1cImhhc0ZlZWQgPyAzIDogMFwiPjwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPCEtLSBXZWxjb21lIGNhcmQgLS0+XG4gICAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwibWFpbiB3ZWxjb21lIGlvbi1wYWRkaW5nIGlvbi10ZXh0LWNlbnRlciBpb24tYWxpZ24tc2VsZi1jZW50ZXJcIiBAZmFkZUluQW5pbWF0aW9uPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1dlYlwiIFtpbm5lckhUTUxdPVwiJ0hPTUUuV0VMQ09NRV9XRUInIHwgdHJhbnNsYXRlOiB7IGFwcE5hbWU6IGFwcE5hbWUgfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1dlYlwiIFtpbm5lckhUTUxdPVwiJ0hPTUUuV0VMQ09NRV9BUFAnIHwgdHJhbnNsYXRlOiB7IGFwcE5hbWU6IGFwcE5hbWUgfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlIFtpbm5lckhUTUxdPVwiZGVzY3JpcHRpb25cIj48L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwibG9nb1wiIFthdHRyLnNyY109XCJsb2dvXCIgYWx0PVwiTG9nb1wiIC8+XG4gICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgIDwhLS0gcmVnaXN0ZXIgaGVscCB0ZXh0IC0tPlxuICAgICAgICAgICAgICA8aW9uLXRleHQgKm5nSWY9XCIhaXNMb2dpbiAmJiBjYW5SZWdpc3RlclwiPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5IT01FLlJFR0lTVEVSX0hFTFA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZy10b3BcIj5cbiAgICAgICAgICAgICAgICA8IS0tIElmIE5PVCBsb2dpbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9naW47IGVsc2UgbG9naW5CdXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cImNhblJlZ2lzdGVyXCIgZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cInJlZ2lzdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkhPTUUuQlROX1JFR0lTVEVSPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cImxpZ2h0XCIgW3JvdXRlckxpbmtdPVwiWycvJ11cIiAoY2xpY2spPVwibG9naW4oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+QVVUSC5CVE5fTE9HSU48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIElmIHVzZXIgbG9naW4gLS0+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsb2dpbkJ1dHRvbnM+XG4gICAgICAgICAgICAgICAgICA8IS0tIEZlYXR1cmUgYnV0dG9ucyAtLT5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnJ4SWY9XCIkZmlsdGVyZWRCdXR0b25zOyBsZXQgYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0ucGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kPVwiYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInRlcnRpYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0uY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJEaXJlY3Rpb249XCJyb290XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0XCIgKm5nSWY9XCJpdGVtLmljb25cIiBbbmFtZV09XCJpdGVtLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnRcIiAqbmdJZj1cIml0ZW0ubWF0SWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubWF0SWNvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPnt7ICdIT01FLkJUTl9EQVRBX0VOVFJZJyB8IHRyYW5zbGF0ZTogeyBuYW1lOiAoaXRlbS50aXRsZSB8IHRyYW5zbGF0ZSkgfSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWJhZGdlICpyeElmPVwiaXRlbS4kYmFkZ2U7IGxldCBiYWRnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdD1cImVuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIihpdGVtLiRiYWRnZUNvbG9yIHwgcHVzaCkgfHwgJ2FjY2VudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2JhZGdlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tYmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpdmlkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWl0ZW0uYWN0aW9uXCIgW2NsYXNzXT1cIml0ZW0uY3NzQ2xhc3NcIiBjbGFzcz1cImJ1dHRvbi1kaXZpZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPnt7IGl0ZW0udGl0bGUgfX0mbmJzcDs8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLTxwICpuZ0lmPVwiYnV0dG9ucy5sZW5ndGhcIiBjbGFzcz1cInZpc2libGUtbW9iaWxlXCI+Jm5ic3A7PC9wPi0tPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwic2hvd0FjY291bnRCdXR0b25cIiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwic2Vjb25kYXJ5XCIgW3JvdXRlckxpbmtdPVwiWycvYWNjb3VudCddXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlvbi1mbG9hdC1zdGFydFwiIG5hbWU9XCJwZXJzb24tY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IHRyYW5zbGF0ZT5IT01FLkJUTl9NWV9BQ0NPVU5UPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPHAgaGlkZGVuLXhzIGhpZGRlbi1zbSBoaWRkZW4tbW9iaWxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHRcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIidIT01FLk5PVF9USElTX0FDQ09VTlRfUVVFU1RJT04nIHwgdHJhbnNsYXRlOiB7IGRpc3BsYXlOYW1lOiBhY2NvdW50TmFtZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwibG9nb3V0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5IT01FLkJUTl9ESVNDT05ORUNUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIwXCIgW3NpemVYbF09XCJoYXNGZWVkID8gMSA6IDBcIj48L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIFtjbGFzcy5mZWVkXT1cImhhc0ZlZWRcIiBbc2l6ZV09XCJoYXNGZWVkID8gMTIgOiAwXCIgW3NpemVYbF09XCJoYXNGZWVkID8gNCA6IDBcIj5cbiAgICAgICAgICBAaWYgKHNob3dGZWVkKSB7XG4gICAgICAgICAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgICA8YXBwLWZlZWRcbiAgICAgICAgICAgICAgICAjZmVlZFxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIFt1cmxzXT1cImZlZWRVcmxzXCJcbiAgICAgICAgICAgICAgICBbbWF4QWdlSW5Nb250aHNdPVwiZmVlZE1heEFnZUluTW9udGhzXCJcbiAgICAgICAgICAgICAgICBbbWF4Q29udGVudExlbmd0aF09XCJmZWVkTWF4Q29udGVudExlbmd0aFwiXG4gICAgICAgICAgICAgICAgKG5nSW5pdCk9XCJpbml0RmVlZChmZWVkKVwiXG4gICAgICAgICAgICAgICAgQGZhZGVJbkFuaW1hdGlvblxuICAgICAgICAgICAgICA+PC9hcHAtZmVlZD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8YXBwLWZlZWRcbiAgICAgICAgICAgICAgICAjZmVlZFxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIFtkZWJ1Z109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3VybHNdPVwiZmVlZFVybHNcIlxuICAgICAgICAgICAgICAgIFttYXhBZ2VJbk1vbnRoc109XCJmZWVkTWF4QWdlSW5Nb250aHNcIlxuICAgICAgICAgICAgICAgIFttYXhDb250ZW50TGVuZ3RoXT1cImZlZWRNYXhDb250ZW50TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAobmdJbml0KT1cImluaXRGZWVkKGZlZWQpXCJcbiAgICAgICAgICAgICAgICBAc2xpZGVJbkFuaW1hdGlvblxuICAgICAgICAgICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgICAgICAgICAgPjwvYXBwLWZlZWQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9pb24tZ3JpZD5cblxuICAgIDwhLS0gUGFnZSBoaXN0b3J5IC0tPlxuICAgIEBsZXQgcGFnZUhpc3RvcnkgPSBpc0xvZ2luICYmIChwYWdlSGlzdG9yeSQgfCBwdXNoKTtcbiAgICBAaWYgKHBhZ2VIaXN0b3J5IHwgaXNOb3RFbXB0eUFycmF5KSB7XG4gICAgICA8aW9uLWdyaWQgY2xhc3M9XCJoaXN0b3J5LWNvbnRhaW5lciBpb24tYWxpZ24tc2VsZi1jZW50ZXJcIj5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgQGZvciAocGFnZSBvZiBwYWdlSGlzdG9yeTsgdHJhY2sgcGFnZS5wYXRoKSB7XG4gICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLXhsPVwiXCIgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtc3RhcnQgaW9uLXRleHQtc3RhcnRcIiBAZmFkZUluQW5pbWF0aW9uPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSB0b3AgYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhZ2VIaXN0b3J5KHBhZ2UucGF0aClcIlxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0IGlvbi1uby1tYXJnaW4gY2xvc2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwicGFnZS5zdWJ0aXRsZSB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHRcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAocGFnZS50aW1lIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH0pIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKHBhZ2UudGltZSB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9KSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwidGltZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO3t7IHBhZ2UudGltZSB8IGRhdGVGcm9tTm93IH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtc3VidGl0bGU+XG5cbiAgICAgICAgICAgICAgICAgIDwhLS0gbWFpbiBwYWdlIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXRpdGxlIGNsYXNzPVwiaW9uLW5vLW1hcmdpbiBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xeFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwicGFnZS5wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJEaXJlY3Rpb249XCJyb290XCJcbiAgICAgICAgICAgICAgICAgICAgICBsaW5lcz1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBwYWdlIGljb24tLT5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJwYWdlLmljb25cIiBzbG90PVwic3RhcnRcIiBbbmFtZV09XCJwYWdlLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInBhZ2UubWF0SWNvblwiIHNsb3Q9XCJzdGFydFwiPnt7IHBhZ2UubWF0SWNvbiB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwicHJpbWFyeVwiIFtpbm5lckhUTUxdPVwicGFnZS50aXRsZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gY2hpbGRyZW4gcGFnZXMgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChwYWdlLmNoaWxkcmVuIHwgaXNOb3RFbXB0eUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGlvbi1wYWRkaW5nLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAoY2hpbGRQYWdlIG9mIHBhZ2UuY2hpbGRyZW47IHRyYWNrIGNoaWxkUGFnZS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhcHBhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImNoaWxkUGFnZS5wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyRGlyZWN0aW9uPVwicm9vdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gcGFnZSBpY29uLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cImNoaWxkUGFnZS5pY29uXCIgc2xvdD1cInN0YXJ0XCIgY29sb3I9XCJkYXJrXCIgW25hbWVdPVwiY2hpbGRQYWdlLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjaGlsZFBhZ2UubWF0SWNvblwiIHNsb3Q9XCJzdGFydFwiIGNvbG9yPVwiZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaWxkUGFnZS5tYXRJY29uIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhcmtcIiBbaW5uZXJIVE1MXT1cImNoaWxkUGFnZS50aXRsZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICB9XG5cbiAgICA8IS0tIEJvdHRvbSBiYW5uZXIgLS0+XG4gICAgQGlmIChzaG93UGFydG5lckJhbm5lciB8fCBzaG93TGVnYWxJbmZvcm1hdGlvbikge1xuICAgICAgPGlvbi1ncmlkXG4gICAgICAgIGNsYXNzPVwiYm90dG9tLWJhbm5lciBpb24tdGV4dC1jZW50ZXJcIlxuICAgICAgICBbY2xhc3MuZmxvYXRpbmddPVwiIW1vYmlsZSAmJiAocGFnZUhpc3RvcnkgfCBpc0VtcHR5QXJyYXkpXCJcbiAgICAgICAgQGZhZGVJbkFuaW1hdGlvblxuICAgICAgPlxuICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICA8IS0tIHBhcnRuZXJzIGxvZ29zIC0tPlxuICAgICAgICAgIEBpZiAoc2hvd1BhcnRuZXJCYW5uZXIpIHtcbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIFtzaXplTGddPVwicGFydG5lckJhbm5lclNpemVcIiBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICBAaWYgKHNob3dMZWdhbEluZm9ybWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwibGVnYWwtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGlvbi1saXN0LWhlYWRlcj57eyAnSE9NRS5QQVJUTkVSUycgfCB0cmFuc2xhdGUgfX08L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwhLS0gcGFydG5lcnMgLS0+XG4gICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgJHBhcnRuZXJzIHwgYXN5bmM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBpdGVtLnNpdGVVcmwgfX1cIj5cbiAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsb2dvXCJcbiAgICAgICAgICAgICAgICAgICAgc3JjPVwie3sgaXRlbS5sb2dvIH19XCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwie3sgaXRlbS5sYWJlbCB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyBpdGVtLmxhYmVsIDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IGl0ZW0ubGFiZWwgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gbGVnYWwgaW5mb3JtYXRpb24gLS0+XG4gICAgICAgICAgQGlmIChzaG93TGVnYWxJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1zbT1cIjZcIiBzaXplLWxnPVwiNFwiIFtjbGFzcy5sZWZ0LWJvcmRlcl09XCJzaG93UGFydG5lckJhbm5lclwiPlxuICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJsZWdhbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1saXN0LWhlYWRlciBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIj57eyAnSE9NRS5MRUdBTF9JTkZPUk1BVElPTicgfCB0cmFuc2xhdGUgfX08L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGxlZ2FsSW5mb3JtYXRpb247IHRyYWNrIGl0ZW0ucGF0aCkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtIChjbGljayk9XCJvcGVuTWFya2Rvd25Nb2RhbCgkZXZlbnQsIGl0ZW0pXCIgbGluZXM9XCJub25lXCIgW2J1dHRvbl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIHwgdHJhbnNsYXRlOiBpdGVtLnRpdGxlQXJncyB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIEBpZiAoc2hvd0luc3RhbGxMaW5rcykge1xuICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLWxnPVwiM1wiIG9mZnNldC1sZz1cIjlcIiBbY2xhc3MubGVmdC1ib3JkZXJdPVwic2hvd1BhcnRuZXJCYW5uZXJcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJsZWdhbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxpc3QtaGVhZGVyPnt7ICdIT01FLklOU1RBTExfQVBQJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPIC0tPlxuICAgICAgICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWdyaWQ+XG4gICAgfVxuICB9XG5cbiAgPCEtLSBpbWFnZSBjcmVkaXRzIC0tPlxuICBAaWYgKGNvbnRlbnRDcmVkaXRzIHwgaXNOb3ROaWxPckJsYW5rKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY3JlZGl0c1wiIFtjbGFzcy5mbG9hdGluZ109XCIhbW9iaWxlXCI+XG4gICAgICA8aW9uLXRleHQ+e3sgY29udGVudENyZWRpdHMgfX08L2lvbi10ZXh0PlxuICAgIDwvZGl2PlxuICB9XG48L2lvbi1jb250ZW50PlxuIl19
|
|
472
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ob21lL2hvbWUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaG9tZS9ob21lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQUUsTUFBTSxFQUNqQixNQUFNLEVBQ04sY0FBYyxFQUdkLFFBQVEsRUFDUixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBb0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBVyxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUczRSxPQUFPLEVBQUUsV0FBVyxFQUErQixNQUFNLGtDQUFrQyxDQUFDO0FBSzVGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQWEsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BFLE9BQU8sRUFBb0IsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3BILE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRyxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0s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dUJBQXVCLENBQUMsTUFBTSxjQUNuQyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsQ0FBQzs7MEJBc0hsRSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ25DLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsd0JBQXdCOzswQkFDM0MsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlO3lDQWxCSSxPQUFPO3NCQUEvQyxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCwgaW5qZWN0LFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25Db250ZW50LCBNb2RhbENvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFJlZ2lzdGVyTW9kYWwgfSBmcm9tICcuLi9yZWdpc3Rlci9yZWdpc3Rlci5tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY2NvdW50LCBhY2NvdW50VG9TdHJpbmcgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9hY2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2RlcGFydG1lbnQubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPQ0FMRVMsIExvY2FsZUNvbmZpZywgTG9jYWxTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFwcEF1dGhNb2RhbCB9IGZyb20gJy4uL2F1dGgvYXV0aC5tb2RhbCc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBJTWVudUl0ZW0sIE1lbnVJdGVtLCBNZW51SXRlbXMgfSBmcm9tICcuLi9tZW51L21lbnUubW9kZWwnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBmYWRlSW5BbmltYXRpb24sIHNsaWRlSW5BbmltYXRpb24sIHNsaWRlVXBEb3duQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBIaXN0b3J5UGFnZVJlZmVyZW5jZSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2hpc3RvcnkubW9kZWwnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgSW1hZ2VzVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9pbWFnZXMudXRpbHMnO1xuaW1wb3J0IHsgVXJpVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS91cmkudXRpbHMnO1xuaW1wb3J0IHsgUGVlciB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3BlZXIubW9kZWwnO1xuaW1wb3J0IHsgQXBwTWFya2Rvd25Nb2RhbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXJrZG93bi9tYXJrZG93bi5tb2RhbCc7XG5pbXBvcnQgeyBTT0NJQUxfQ09ORklHX09QVElPTlMgfSBmcm9tICcuLi8uLi9zb2NpYWwvY29uZmlnL3NvY2lhbC5jb25maWcnO1xuaW1wb3J0IHsgRmVlZHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zb2NpYWwvZmVlZC9mZWVkLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEFQUF9TSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuLyoqXG4gKiBAcGFyYW0gZmlsZXNcbiAqIEBkZXByZWNhdGVkIHVzZSBgZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0KClgIGluc3RlYWRcbiAqKi9cbmV4cG9ydCBjb25zdCBnZXRSYW5kb21JbWFnZSA9IEltYWdlc1V0aWxzLmdldFJhbmRvbUltYWdlO1xuZXhwb3J0IGNvbnN0IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdCA9IEltYWdlc1V0aWxzLmdldFJhbmRvbUltYWdlV2l0aENyZWRpdDtcblxuZXhwb3J0IGNvbnN0IEFQUF9IT01FX0JVVFRPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48SU1lbnVJdGVtW10+KCdob21lQnV0dG9uJyk7XG5cbmV4cG9ydCBjb25zdCBBUFBfSE9NRV9UT09MQkFSX0JVVFRPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48SU1lbnVJdGVtW10+KCdob21lVG9vbGJhckJ1dHRvbnMnKTtcblxuZXhwb3J0IGNvbnN0IEFQUF9IT01FX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJSG9tZVBhZ2VDb25maWc+KCdob21lQ29uZmlnJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhvbWVQYWdlQ29uZmlnIHtcbiAgc2hvd05vdGlmaWNhdGlvbkljb24/OiBib29sZWFuIHwgJ21vYmlsZScgfCAnZGVza3RvcCc7XG4gIGF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbj86IGJvb2xlYW4gfCAnbW9iaWxlJyB8ICdkZXNrdG9wJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb21lUGFnZVN0YXRlIHtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgc2hvd1NwaW5uZXI6IGJvb2xlYW47XG4gIHNob3dQYXJ0bmVyQmFubmVyOiBib29sZWFuO1xuICBzaG93TGVnYWxJbmZvcm1hdGlvbjogYm9vbGVhbjtcbiAgc2hvd0luc3RhbGxMaW5rczogYm9vbGVhbjtcbiAgcGFnZUhpc3Rvcnk6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW107XG4gIGRhcmtNb2RlOiBib29sZWFuO1xuICBoYXNGZWVkOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcGFnZS1ob21lJyxcbiAgdGVtcGxhdGVVcmw6ICdob21lLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ob21lLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIHNsaWRlVXBEb3duQW5pbWF0aW9uLCBzbGlkZUluQW5pbWF0aW9uXSxcbn0pXG5leHBvcnQgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBSeFN0YXRlPEhvbWVQYWdlU3RhdGU+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2NvbmZpZzogQ29uZmlndXJhdGlvbjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVidWc6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93QWNjb3VudEJ1dHRvbjogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWNjb3VudE5hbWUgPSAnJztcbiAgcHJvdGVjdGVkIGlzTG9naW46IGJvb2xlYW47XG4gIHByb3RlY3RlZCBsb2dvOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYXBwTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgaXNXZWI6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjYW5SZWdpc3RlcjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnRlbnRTdHlsZTogYW55O1xuICBwcm90ZWN0ZWQgY29udGVudENyZWRpdHM6IHN0cmluZztcbiAgcHJvdGVjdGVkIGxlZ2FsSW5mb3JtYXRpb246IElNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9mZmxpbmU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzaG93Tm90aWZpY2F0aW9uSWNvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHNob3dGZWVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBmZWVkVXJsczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBmZWVkTWF4QWdlSW5Nb250aHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGZlZWRNYXhDb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gIHByb3RlY3RlZCBoYXNTY3JvbGxiYXIgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYnV0dG9uczogTWVudUl0ZW1bXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvb2xiYXJCdXR0b25zOiBNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgbG9hZGluZyQgPSB0aGlzLnNlbGVjdCgnbG9hZGluZycpO1xuICBwcm90ZWN0ZWQgJHBhcnRuZXJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEZXBhcnRtZW50W10+KG51bGwpO1xuICBwcm90ZWN0ZWQgJGZpbHRlcmVkQnV0dG9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkICRmaWx0ZXJlZFRvb2xiYXJCdXR0b25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGFya01vZGUkID0gdGhpcy5zZWxlY3QoJ2RhcmtNb2RlJyk7XG4gIHByb3RlY3RlZCBwYWdlSGlzdG9yeSQgPSB0aGlzLnNlbGVjdCgncGFnZUhpc3RvcnknKTtcbiAgcHJvdGVjdGVkIGhhc0ZlZWQkID0gdGhpcy5zZWxlY3QoJ2hhc0ZlZWQnKTtcblxuICBzZXQgcGFnZUhpc3RvcnkodmFsdWU6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW10pIHtcbiAgICB0aGlzLnNldCgncGFnZUhpc3RvcnknLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgcGFnZUhpc3RvcnkoKTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwYWdlSGlzdG9yeScpO1xuICB9XG5cbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnbG9hZGluZycsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnbG9hZGluZycpO1xuICB9XG5cbiAgc2V0IHNob3dTcGlubmVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ3Nob3dTcGlubmVyJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dTcGlubmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd1NwaW5uZXInKTtcbiAgfVxuXG4gIHNldCBzaG93UGFydG5lckJhbm5lcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdzaG93UGFydG5lckJhbm5lcicsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93UGFydG5lckJhbm5lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dQYXJ0bmVyQmFubmVyJyk7XG4gIH1cblxuICBzZXQgc2hvd0xlZ2FsSW5mb3JtYXRpb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd0xlZ2FsSW5mb3JtYXRpb24nLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd0xlZ2FsSW5mb3JtYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzaG93TGVnYWxJbmZvcm1hdGlvbicpO1xuICB9XG5cbiAgc2V0IHNob3dJbnN0YWxsTGlua3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd0luc3RhbGxMaW5rcycsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93SW5zdGFsbExpbmtzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd0luc3RhbGxMaW5rcycpO1xuICB9XG5cbiAgc2V0IGRhcmtNb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ2RhcmtNb2RlJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IGRhcmtNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnZGFya01vZGUnKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZTtcbiAgfVxuXG4gIGdldCBwYXJ0bmVyQmFubmVyU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNob3dMZWdhbEluZm9ybWF0aW9uID8gOCA6IDEyO1xuICB9XG5cbiAgQFZpZXdDaGlsZChJb25Db250ZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250ZW50OiBJb25Db250ZW50O1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KEFQUF9TSE9XX1RPT0xUSVAsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHB1YmxpYyBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBASW5qZWN0KEFQUF9MT0NBTEVTKSBwcm90ZWN0ZWQgbG9jYWxlczogTG9jYWxlQ29uZmlnW10sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfSE9NRV9CVVRUT05TKSBidXR0b25zOiBJTWVudUl0ZW1bXSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9IT01FX1RPT0xCQVJfQlVUVE9OUykgdG9vbGJhckJ1dHRvbnM6IElNZW51SXRlbVtdLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0hPTUVfQ09ORklHKSBwcm90ZWN0ZWQgY29uZmlnOiBJSG9tZVBhZ2VDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNldCg8UGFydGlhbDxIb21lUGFnZVN0YXRlPj57XG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgc2hvd1BhcnRuZXJCYW5uZXI6IGZhbHNlLFxuICAgICAgc2hvd1NwaW5uZXI6ICF0aGlzLnBsYXRmb3JtLnN0YXJ0ZWQsXG4gICAgICBkYXJrTW9kZTogdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5idXR0b25zID0gKGJ1dHRvbnMgfHwgW10pPy5tYXAoKGl0ZW0pID0+IE1lbnVJdGVtLmZyb21PYmplY3QoaXRlbSkpO1xuICAgIHRoaXMudG9vbGJhckJ1dHRvbnMgPSAodG9vbGJhckJ1dHRvbnMgfHwgW10pPy5tYXAoKGl0ZW0pID0+IE1lbnVJdGVtLmZyb21PYmplY3QoaXRlbSkpO1xuICAgIGNvbnNvbGUubG9nKCd0b29sYmFyQnV0dG9ucycsIHRoaXMudG9vbGJhckJ1dHRvbnMpO1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJyk7XG4gICAgdGhpcy5wbGF0Zm9ybS5yZWFkeSgpLnRoZW4oKCkgPT4gdGhpcy5zdGFydCgpKTtcbiAgICB0aGlzLnNob3dBY2NvdW50QnV0dG9uID0gZW52aXJvbm1lbnQuYWNjb3VudD8uc2hvd0FjY291bnRCdXR0b24gPz8gdHJ1ZTtcblxuICAgIHRoaXMuY29ubmVjdCgnZGFya01vZGUnLCB0aGlzLnNldHRpbmdzLmRhcmtNb2RlJCk7XG5cbiAgICAvLyBERVZcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApKSAvLyDDiXZpdGUgbGVzIGFwcGVscyB0cm9wIGZyw6lxdWVudHNcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja1Njcm9sbGJhcigpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhc3luYyBsb2dpbigpIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IEFwcEF1dGhNb2RhbCxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kYWwucHJlc2VudCgpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoKSB7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBSZWdpc3Rlck1vZGFsLFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kYWwucHJlc2VudCgpO1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KGV2ZW50OiBhbnkpIHtcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLmxvZ291dCgpO1xuXG4gICAgLy8gSWYgd2FzIG9mZmxpbmUsIHRyeSB0byByZWNvbm5lY3QgKGJlY2F1c2UgY2FuIGJlIGEgZm9yY2VkIG9mZmxpbmUgbW9kZSlcbiAgICBpZiAodGhpcy5vZmZsaW5lKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyeU9ubGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUxhbmd1YWdlKGxvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXR0aW5ncy5hcHBseSh7IGxvY2FsZSB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRQYWdlUGF0aChpbmRleDogbnVtYmVyLCBwYWdlOiBIaXN0b3J5UGFnZVJlZmVyZW5jZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhZ2U/LnBhdGg7XG4gIH1cblxuICB0cnlPbmxpbmUoKSB7XG4gICAgdGhpcy53YWl0aW5nTmV0d29yayA9IHRydWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRoaXMubmV0d29ya1xuICAgICAgLnRyeU9ubGluZSh7XG4gICAgICAgIHNob3dMb2FkaW5nVG9hc3Q6IGZhbHNlLFxuICAgICAgICBzaG93T25saW5lVG9hc3Q6IHRydWUsXG4gICAgICAgIHNob3dPZmZsaW5lVG9hc3Q6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy53YWl0aW5nTmV0d29yayA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kICAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCk7XG5cbiAgICB0aGlzLmlzTG9naW4gPSB0aGlzLmFjY291bnRTZXJ2aWNlLmlzTG9naW4oKTtcbiAgICBpZiAodGhpcy5pc0xvZ2luKSB7XG4gICAgICB0aGlzLm9uTG9naW4odGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm9mZmxpbmUgPSB0aGlzLm5ldHdvcmsub2ZmbGluZTtcblxuICAgIC8vIExpc3RlbiBsb2dpbi9sb2dvdXQgZXZlbnRzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9naW4uc3Vic2NyaWJlKChhY2NvdW50KSA9PiB0aGlzLm9uTG9naW4oYWNjb3VudCkpKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dvdXQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Mb2dvdXQoKSkpO1xuXG4gICAgLy8gTGlzdGVuIHBvZCBjb25maWdcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHRoaXMub25Db25maWdMb2FkZWQoY29uZmlnKSkpO1xuXG4gICAgLy8gTGlzdGVuIHNldHRpbmdzIGNoYW5nZXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBBZGQgYSBkZWxheSwgdG8gYXZvaWQgdG8gYXBwbHkgY2hhbmdlcyB0byBvZnRlblxuICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgIC8vIFN0YXJ0IHdpdGggY3VycmVudCBzZXR0aW5nc1xuICAgICAgICAgIHN0YXJ0V2l0aChhd2FpdCB0aGlzLnNldHRpbmdzLnJlYWR5KCkpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB0aGlzLm9uU2V0dGluZ3NDaGFuZ2VkKHJlcykpXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBuZXR3b3JrIGNoYW5nZXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5uZXR3b3JrLm9uTmV0d29ya1N0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy9kZWJvdW5jZVRpbWUoNDUwKSxcbiAgICAgICAgICAvL3RhcCgoKSA9PiB0aGlzLndhaXRpbmdOZXR3b3JrID0gZmFsc2UpLFxuICAgICAgICAgIG1hcCgoY29ubmVjdGlvblR5cGUpID0+IGNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChvZmZsaW5lKSA9PiB7XG4gICAgICAgICAgdGhpcy5vZmZsaW5lID0gb2ZmbGluZTtcbiAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ29uZmlnTG9hZGVkKGNvbmZpZzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tob21lXSBBcHBseWluZyBjb25maWd1cmF0aW9uJywgY29uZmlnKTtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG5cbiAgICB0aGlzLmFwcE5hbWUgPSBjb25maWcubGFiZWwgfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXBwTmFtZSB8fCAnU1VNQVJpUyc7XG4gICAgdGhpcy5sb2dvID0gY29uZmlnLmxhcmdlTG9nbyB8fCBjb25maWcuc21hbGxMb2dvIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5pc1dlYiA9IHRoaXMucGxhdGZvcm0uaXNXZWIoKTtcbiAgICB0aGlzLmNhblJlZ2lzdGVyID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuUkVHSVNUUkFUSU9OX0VOQUJMRSk7XG5cbiAgICBjb25zdCBzaG93Tm90aWZpY2F0aW9uSWNvbkJ5Q29uZmlnID1cbiAgICAgIHRoaXMuY29uZmlnPy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9PT0gdHJ1ZSB8fFxuICAgICAgKHRoaXMuY29uZmlnPy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9PT0gJ21vYmlsZScgJiYgdGhpcy5tb2JpbGUpIHx8XG4gICAgICAodGhpcy5jb25maWc/LnNob3dOb3RpZmljYXRpb25JY29uID09PSAnZGVza3RvcCcgJiYgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb25JY29uID0gc2hvd05vdGlmaWNhdGlvbkljb25CeUNvbmZpZyAmJiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oU09DSUFMX0NPTkZJR19PUFRJT05TLkVOQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpO1xuICAgIHRoaXMuYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID1cbiAgICAgIHRoaXMuY29uZmlnPy5hdXRvSGlkZU5vdGlmaWNhdGlvbkljb24gPT09IHRydWUgfHxcbiAgICAgICh0aGlzLmNvbmZpZz8uYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID09PSAnbW9iaWxlJyAmJiB0aGlzLm1vYmlsZSkgfHxcbiAgICAgICh0aGlzLmNvbmZpZz8uYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID09PSAnZGVza3RvcCcgJiYgIXRoaXMubW9iaWxlKSB8fFxuICAgICAgZmFsc2U7XG5cbiAgICAvLyBGZWVkXG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5jdXJyZW50TG9jYWxlO1xuICAgIHRoaXMuc2hvd0ZlZWQgPSBjb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oQ09SRV9DT05GSUdfT1BUSU9OUy5IT01FX0ZFRURfRU5BQkxFKSB8fCAhIXRoaXMuZW52aXJvbm1lbnQ/LmZlZWQ/Lmpzb25GZWVkO1xuICAgIHRoaXMuZmVlZFVybHMgPSBjb25maWcuZ2V0UHJvcGVydHlBc1N0cmluZ3MoQ09SRV9DT05GSUdfT1BUSU9OUy5IT01FX0ZFRURfVVJMUykgPz8gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8uanNvbkZlZWQ/Lltsb2NhbGVdO1xuICAgIHRoaXMuZmVlZE1heEFnZUluTW9udGhzID1cbiAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0eUFzSW50KENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX01BWF9BR0VfSU5fTU9OVEhTKSA/PyB0aGlzLmVudmlyb25tZW50Py5mZWVkPy5tYXhBZ2VJbk1vbnRocyA/PyAtMTtcbiAgICB0aGlzLmZlZWRNYXhDb250ZW50TGVuZ3RoID1cbiAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0eUFzSW50KENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX01BWF9DT05URU5UX0xFTkdUSCkgPz8gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8ubWF4Q29udGVudExlbmd0aCA/PyAtMTtcblxuICAgIC8vIExlZ2FsIGluZm9ybWF0aW9uXG4gICAgdGhpcy5sZWdhbEluZm9ybWF0aW9uID0gW1xuICAgICAge1xuICAgICAgICB0aXRsZTogJ0hPTUUuUFJJVkFDWV9QT0xJQ1knLFxuICAgICAgICBwYXRoOiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5QUklWQUNZX1BPTElDWV9VUkwpID8/ICh0aGlzLmVudmlyb25tZW50LnByaXZhY3lQb2xpY3lVcmwgYXMgc3RyaW5nKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiAnSE9NRS5URVJNU19PRl9VU0UnLFxuICAgICAgICBwYXRoOiB0aGlzLl9jb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5URVJNU19PRl9VU0VfVVJMKSA/PyAodGhpcy5lbnZpcm9ubWVudC50ZXJtc09mVXNlVXJsIGFzIHN0cmluZyksXG4gICAgICB9LFxuICAgIF0uZmlsdGVyKChpdGVtKSA9PiBpc05vdE5pbE9yQmxhbmsoaXRlbS5wYXRoKSk7XG4gICAgdGhpcy5zaG93TGVnYWxJbmZvcm1hdGlvbiA9IGlzTm90RW1wdHlBcnJheSh0aGlzLmxlZ2FsSW5mb3JtYXRpb24pO1xuXG4gICAgY29uc3QgcGFydG5lcnMgPSAodGhpcy5fY29uZmlnLnBhcnRuZXJzIHx8IFtdKS5maWx0ZXIoKHApID0+IHAgJiYgcC5sb2dvKTtcbiAgICB0aGlzLiRwYXJ0bmVycy5uZXh0KHBhcnRuZXJzKTtcbiAgICB0aGlzLnNob3dQYXJ0bmVyQmFubmVyID0gcGFydG5lcnMubGVuZ3RoID4gMDtcbiAgICAvLyBUT0RPIGxvYWQgaW5zdGFsbCBsaW5rc1xuXG4gICAgLy8gSWYgbm90IGFscmVhZHkgc2V0LCBjb21wdXRlIHRoZSBiYWNrZ3JvdW5kIGltYWdlXG4gICAgaWYgKCF0aGlzLmNvbnRlbnRTdHlsZSkge1xuICAgICAgY29uc3QgYmFja2dyb3VuZEltYWdlcyA9IChjb25maWcuYmFja2dyb3VuZEltYWdlcyB8fCBbXSlcbiAgICAgICAgLy8gRmlsdGVyIG9uIG5vdCBuaWwsIGJlY2F1c2UgY2FuIG9jY3VyIGlmIGRldGVjdGVkIGhhcyBub3QgZXhpc3RzIChzZWUgY29uZmlnLXNlcnZpY2UuanMpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGltZykgPT5cbiAgICAgICAgICAgIGlzTm90TmlsKGltZykgJiZcbiAgICAgICAgICAgIC8vIElmIG9mZmxpbmUsIGZpbHRlciBvbiBsb2NhbCBkYXRhVVJMIGltYWdlXG4gICAgICAgICAgICAoIXRoaXMub2ZmbGluZSB8fCAhaW1nLnN0YXJ0c1dpdGgoJ2h0dHAnKSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gQmFja2dyb3VuZCBpbWFnZSBmb3VuZDogc2VsZWN0IG9uZSByYW5kb21seVxuICAgICAgaWYgKGJhY2tncm91bmRJbWFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgaW1hZ2UsIGNyZWRpdHMgfSA9IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdChiYWNrZ3JvdW5kSW1hZ2VzKTtcbiAgICAgICAgdGhpcy5jb250ZW50U3R5bGUgPSBpbWFnZSA/IHsgJ2JhY2tncm91bmQtaW1hZ2UnOiBgdXJsKCR7aW1hZ2V9KWAgfSA6IHt9O1xuICAgICAgICB0aGlzLmNvbnRlbnRDcmVkaXRzID0gY3JlZGl0cyB8fCAnJztcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGJhY2tncm91bmQgY29sb3JcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29sb3IgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5DT0xPUl9QUklNQVJZKSB8fCAndmFyKC0taW9uLWNvbG9yLXByaW1hcnkpJztcbiAgICAgICAgdGhpcy5jb250ZW50U3R5bGUgPSAocHJpbWFyeUNvbG9yICYmIHsgJ2JhY2tncm91bmQtY29sb3InOiBwcmltYXJ5Q29sb3IgfSkgfHwge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja1Njcm9sbGJhcigpO1xuICAgIHRoaXMucmVmcmVzaEJ1dHRvbnMoKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gSWYgZmlyc3QgbG9hZCwgaGlkZSB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNldHRpbmdzQ2hhbmdlZChzZXR0aW5nczogTG9jYWxTZXR0aW5ncykge1xuICAgIGlmIChzZXR0aW5ncy5wYWdlSGlzdG9yeSAhPT0gdGhpcy5wYWdlSGlzdG9yeSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2hvbWVdIFBhZ2UgaGlzdG9yeSBsb2FkZWQnKTtcbiAgICAgIHRoaXMucGFnZUhpc3RvcnkgPSBzZXR0aW5ncy5wYWdlSGlzdG9yeSB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2dpbihhY2NvdW50OiBBY2NvdW50KSB7XG4gICAgaWYgKCFhY2NvdW50KSByZXR1cm47IC8vIFNraXBcbiAgICAvL2NvbnNvbGUuZGVidWcoJ1tob21lXSBMb2dnZWQgYWNjb3VudDogJywgYWNjb3VudCk7XG4gICAgdGhpcy5pc0xvZ2luID0gdHJ1ZTtcbiAgICB0aGlzLmFjY291bnROYW1lID0gYWNjb3VudFRvU3RyaW5nKGFjY291bnQpO1xuICAgIHRoaXMucmVmcmVzaEJ1dHRvbnMoYWNjb3VudCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkxvZ291dCgpIHtcbiAgICB0aGlzLmlzTG9naW4gPSBmYWxzZTtcbiAgICB0aGlzLmFjY291bnROYW1lID0gJyc7XG4gICAgdGhpcy5wYWdlSGlzdG9yeSA9IFtdO1xuICAgIHRoaXMucmVmcmVzaEJ1dHRvbnMoKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hCdXR0b25zKGFjY291bnQ/OiBBY2NvdW50KSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcpIHJldHVybjsgLy8gU2tpcCAod2FpdGluZyBjb25maWcgdG8gYmUgbG9hZGVkKVxuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbaG9tZV0gUmVmcmVzaGluZyBidXR0b25zLi4uJyk7XG5cbiAgICB0aGlzLiRmaWx0ZXJlZEJ1dHRvbnMubmV4dCh0aGlzLmZpbHRlckJ1dHRvbnModGhpcy5idXR0b25zLCBhY2NvdW50KSk7XG4gICAgdGhpcy4kZmlsdGVyZWRUb29sYmFyQnV0dG9ucy5uZXh0KHRoaXMuZmlsdGVyQnV0dG9ucyh0aGlzLnRvb2xiYXJCdXR0b25zLCBhY2NvdW50KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVyQnV0dG9ucyhpdGVtczogTWVudUl0ZW1bXSwgYWNjb3VudD86IEFjY291bnQpOiBNZW51SXRlbVtdIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZykgcmV0dXJuOyAvLyBTa2lwICh3YWl0aW5nIGNvbmZpZyB0byBiZSBsb2FkZWQpXG5cbiAgICBhY2NvdW50ID0gYWNjb3VudCB8fCB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQ7XG4gICAgcmV0dXJuIChpdGVtcyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIE1lbnVJdGVtcy5jaGVja0lmVmlzaWJsZShpdGVtLCBhY2NvdW50LCB0aGlzLl9jb25maWcsIHtcbiAgICAgICAgICBpc0xvZ2luOiB0aGlzLmlzTG9naW4sXG4gICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgICAgbG9nUHJlZml4OiAnW2hvbWVdJyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgLy8gUmVwbGFjZSB0aXRsZSB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoaXRlbS50aXRsZVByb3BlcnR5KSAmJiB0aGlzLl9jb25maWcpIHtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2NvbmZpZy5wcm9wZXJ0aWVzPy5baXRlbS50aXRsZVByb3BlcnR5XSA/PyBpdGVtLnRpdGxlO1xuICAgICAgICAgIGlmIChpdGVtLnRpdGxlICE9PSB0aXRsZSkge1xuICAgICAgICAgICAgLy8gQ2xvbmUgYmVmb3JlIGNoYW5naW5nLCB0byBiZSBhYmxlIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHRpdGxlIChlLmcuIGlmIGNvbmZpZyBwcm9wZXJ0eSBjaGFuZ2VkKVxuICAgICAgICAgICAgaXRlbS5jbG9uZSgpO1xuICAgICAgICAgICAgaXRlbS50aXRsZSA9IHRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgb3Blbk1hcmtkb3duTW9kYWwoZXZlbnQ/OiBFdmVudCwgaXRlbTogSU1lbnVJdGVtID0gbnVsbCkge1xuICAgIGlmIChpc05pbE9yQmxhbmsoaXRlbT8ucGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgcmVsYXRpdmUgcGF0aFxuICAgIGxldCB1cmwgPSBpdGVtLnBhdGg7XG4gICAgaWYgKHRoaXMubmV0d29yay5wZWVyICYmICh1cmwuc3RhcnRzV2l0aCgnLi8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnLycpKSkge1xuICAgICAgdXJsID0gUGVlci5wYXRoKHRoaXMubmV0d29yay5wZWVyLCB1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhGaWxlbmFtZSA9IFVyaVV0aWxzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgY29uc3QgaXNNYXJrZG93bkZpbGUgPSBwYXRoRmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpO1xuXG4gICAgLy8gT3BlbiBhcyBtYXJrZG93blxuICAgIGlmIChpc01hcmtkb3duRmlsZSkge1xuICAgICAgYXdhaXQgQXBwTWFya2Rvd25Nb2RhbC5zaG93KHRoaXMubW9kYWxDdHJsLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGl0ZW0udGl0bGUsIGl0ZW0udGl0bGVBcmdzKSxcbiAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgY2FuUHJpbnQ6ICF0aGlzLm1vYmlsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPcGVuIGFzIGV4dGVybmFsIGxpbmtcbiAgICAgIGF3YWl0IHRoaXMucGxhdGZvcm0ub3Blbih1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB0b2dnbGVEYXJrTW9kZSgpIHtcbiAgICBjb25zdCBlbmFibGUgPSAhdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlO1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBkYXJrTW9kZTogZW5hYmxlLCBhdXRvRGFya01vZGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZVBhZ2VIaXN0b3J5KHBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVtb3ZlUGFnZUhpc3RvcnkocGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWwgPSBhd2FpdCB0aGlzLmNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIHRoaXMuaGFzU2Nyb2xsYmFyID0gc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKCdbaG9tZV0gQ2hlY2sgc2Nyb2xsYmFyJywgdGhpcy5oYXNTY3JvbGxiYXIpO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0RmVlZChmZWVkOiBGZWVkc0NvbXBvbmVudCkge1xuICAgIGlmICghZmVlZCkgcmV0dXJuO1xuICAgIHRoaXMuY29ubmVjdCgnaGFzRmVlZCcsIGZlZWQuaGFzRmVlZHMkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvb2xiYXJCdXR0b25DbGljayhldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaXRlbS5hY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIiB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGU+XG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uIFthdXRvSGlkZV09XCJhdXRvSGlkZU5vdGlmaWNhdGlvbkljb25cIj48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgIH1cblxuICAgIDwhLS0gSW5qZWN0ZWQgdG9vbGJhciBidXR0b25zIC0tPlxuICAgIEBmb3IgKGl0ZW0gb2YgJGZpbHRlcmVkVG9vbGJhckJ1dHRvbnMgfCBhc3luYzsgdHJhY2sgaXRlbS50aXRsZSkge1xuICAgICAgPGlvbi1idXR0b24gW2NvbG9yXT1cIml0ZW0uY29sb3JcIiAoY2xpY2spPVwib25Ub29sYmFyQnV0dG9uQ2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaXRlbS5jc3NDbGFzc1wiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKGl0ZW0udG9vbHRpcCB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChpdGVtLnRvb2x0aXAgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cIml0ZW0uJGJhZGdlIHwgcHVzaFwiXG4gICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VDb2xvcl09XCIoaXRlbS4kYmFkZ2VDb2xvciB8IHB1c2gpIHwgbWF0Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cIiEoaXRlbS4kYmFkZ2UgfCBwdXNoKVwiXG4gICAgICAgICAgICAgICAgICBtYXRCYWRnZU92ZXJsYXA9XCJ0cnVlXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIiBtYXRCYWRnZVBvc2l0aW9uPVwiYWJvdmUgYWZ0ZXJcIj5cbiAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiaXRlbS5pY29uXCIgc2xvdD1cImljb24tb25seVwiIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIml0ZW0ubWF0SWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIj57eyBpdGVtLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICA8aW9uLWxhYmVsICpyeElmPVwiaXRlbS4kdGl0bGU7IGxldCB0aXRsZVwiPlxuICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwidGl0bGUgfCB0cmFuc2xhdGVcIj48L3NwYW4+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gZGFyayBtb2RlIChpZiBhbGxvdyBieSB0aGUgZW52aXJvbm1lbnQgdG9rZW4pIC0tPlxuICAgIEBpZiAoc2V0dGluZ3MuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZURhcmtNb2RlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBbbmFtZV09XCIoZGFya01vZGUkIHwgcHVzaCkgPyAnc3VubnknIDogJ21vb24nXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG5cbiAgICA8IS0tIENoYW5nZSBsb2NhbGUgYnV0dG9uIC0tPlxuICAgIDxpb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJsb2NhbGVNZW51XCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImxhbmd1YWdlXCI+PC9pb24taWNvbj5cbiAgICA8L2lvbi1idXR0b24+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2FwcC10b29sYmFyPlxuXG48IS0tIENoYW5nZSBsb2NhbGUgbWVudSAtLT5cbjxtYXQtbWVudSAjbG9jYWxlTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgIEBmb3IgKGl0ZW0gb2YgbG9jYWxlczsgdHJhY2sgaXRlbS5rZXkpIHtcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hhbmdlTGFuZ3VhZ2UoaXRlbS5rZXkpXCI+XG4gICAgICAgIDwhLS08bWF0LWljb24+e3sgY3VycmVudExvY2FsZSA9PT0gaXRlbS5rZXkgPyAnY2hlY2ttYXJrJyA6IHVuZGVmaW5lZCB9fTwvbWF0LWljb24+LS0+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgaXRlbS52YWx1ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPGlvbi1jb250ZW50IFtuZ1N0eWxlXT1cImNvbnRlbnRTdHlsZVwiIFtjbGFzcy5oYXMtc2Nyb2xsYmFyXT1cImhhc1Njcm9sbGJhclwiIG5vLXBhZGRpbmcteHM+XG4gIDwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1wYWdlXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIShsb2FkaW5nJCB8IHB1c2gpXCI+XG4gICAgQGlmIChzaG93U3Bpbm5lcikge1xuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj5cbiAgICAgICAgPHAgW2lubmVySFRNTF09XCInQ09NTU9OLkxPQURJTkdfRE9UUycgfCB0cmFuc2xhdGVcIj48L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMSBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMiBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlNCBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMyBzay1jdWJlXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGVza3RvcDogdHJhbnNsdWNlbnQgdG9wIHRvb2xiYXIgLS0+XG4gIEBpZiAoIW1vYmlsZSkge1xuICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICA8aW9uLXRvb2xiYXIgY29sb3I9XCJ0cmFhbnNwYXJlbnRcIiB0cmFuc2x1Y2VudD5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tbWVudS10b2dnbGU+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgZmlsbD1cImNsZWFyXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cIm1lbnVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLW1lbnUtdG9nZ2xlPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuXG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uXG4gICAgICAgICAgICAgIFtzdHlsZV09XCInaW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIHVucmVhZENvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgICBbYXV0b0hpZGVdPVwiYXV0b0hpZGVOb3RpZmljYXRpb25JY29uXCJcbiAgICAgICAgICAgID48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gSW5qZWN0ZWQgdG9vbGJhciBidXR0b25zIC0tPlxuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgJGZpbHRlcmVkVG9vbGJhckJ1dHRvbnMgfCBhc3luYzsgdHJhY2sgaXRlbS50aXRsZSkge1xuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgZmlsbD1cInNvbGlkXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIml0ZW0uY29sb3IgfHwgJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub29sYmFyQnV0dG9uQ2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IChpdGVtLnRvb2x0aXAgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChpdGVtLnRvb2x0aXAgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiaXRlbS4kYmFkZ2UgfCBwdXNoXCJcbiAgICAgICAgICAgICAgW21hdEJhZGdlQ29sb3JdPVwiKGl0ZW0uJGJhZGdlQ29sb3IgfCBwdXNoKSB8IG1hdENvbG9yXCJcbiAgICAgICAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cIiEoaXRlbS4kYmFkZ2UgfCBwdXNoKVwiXG4gICAgICAgICAgICAgIG1hdEJhZGdlT3ZlcmxhcD1cInRydWVcIiBtYXRCYWRnZVNpemU9XCJzbWFsbFwiIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cIml0ZW0uaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiBbbmFtZV09XCJpdGVtLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJpdGVtLm1hdEljb25cIiBzbG90PVwiaWNvbi1vbmx5XCI+e3sgaXRlbS5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCAqcnhJZj1cIml0ZW0uJHRpdGxlOyBsZXQgdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInRpdGxlIHwgdHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIGRhcmsgbW9kZSAoaWYgYWxsb3cgYnkgdGhlIGVudmlyb25tZW50IHRva2VuKSAtLT5cbiAgICAgICAgICBAaWYgKHNldHRpbmdzLmFsbG93RGFya01vZGUpIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgZmlsbD1cInNvbGlkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURhcmtNb2RlKClcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdIT01FLkJUTl9EQVJLX01PREUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0hPTUUuQlROX0RBUktfTU9ERScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIFtuYW1lXT1cIihkYXJrTW9kZSQgfCBwdXNoKSA/ICdtb29uJyA6ICdzdW5ueSdcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8IS0tIGNoYW5nZSBsb2NhbGUgYnV0dG9uIC0tPlxuICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImxvY2FsZU1lbnVcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnU0VUVElOR1MuTE9DQUxFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnU0VUVElOR1MuTE9DQUxFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwibGFuZ3VhZ2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9kaXY+XG4gIH1cblxuICA8IS0tIEluc3RhbGwgKGFuZCB1cGdyYWRlKSBjYXJkIC0tPlxuICA8YXBwLWluc3RhbGwtdXBncmFkZS1jYXJkIFtpc0xvZ2luXT1cImlzTG9naW5cIiBbc2hvd0luc3RhbGxCdXR0b25dPVwidHJ1ZVwiPjwvYXBwLWluc3RhbGwtdXBncmFkZS1jYXJkPlxuXG4gIEBpZiAoIShsb2FkaW5nJCB8IHB1c2gpKSB7XG4gICAgQGxldCBoYXNGZWVkID0gaGFzRmVlZCQgfCBhc3luYztcbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIwXCIgW3NpemVYbF09XCJoYXNGZWVkID8gMyA6IDBcIj48L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDwhLS0gV2VsY29tZSBjYXJkIC0tPlxuICAgICAgICAgIDxpb24tY2FyZCBjbGFzcz1cIm1haW4gd2VsY29tZSBpb24tcGFkZGluZyBpb24tdGV4dC1jZW50ZXIgaW9uLWFsaWduLXNlbGYtY2VudGVyXCIgQGZhZGVJbkFuaW1hdGlvbj5cbiAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZSBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNXZWJcIiBbaW5uZXJIVE1MXT1cIidIT01FLldFTENPTUVfV0VCJyB8IHRyYW5zbGF0ZTogeyBhcHBOYW1lOiBhcHBOYW1lIH1cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNXZWJcIiBbaW5uZXJIVE1MXT1cIidIT01FLldFTENPTUVfQVBQJyB8IHRyYW5zbGF0ZTogeyBhcHBOYW1lOiBhcHBOYW1lIH1cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZSBbaW5uZXJIVE1MXT1cImRlc2NyaXB0aW9uXCI+PC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImxvZ29cIiBbYXR0ci5zcmNdPVwibG9nb1wiIGFsdD1cIkxvZ29cIiAvPlxuICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8IS0tIHJlZ2lzdGVyIGhlbHAgdGV4dCAtLT5cbiAgICAgICAgICAgICAgPGlvbi10ZXh0ICpuZ0lmPVwiIWlzTG9naW4gJiYgY2FuUmVnaXN0ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SE9NRS5SRUdJU1RFUl9IRUxQPC9zcGFuPlxuICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW9uLXBhZGRpbmctdG9wXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBJZiBOT1QgbG9naW4gLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvZ2luOyBlbHNlIGxvZ2luQnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJjYW5SZWdpc3RlclwiIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJyZWdpc3RlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5IT01FLkJUTl9SRUdJU1RFUjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJsaWdodFwiIFtyb3V0ZXJMaW5rXT1cIlsnLyddXCIgKGNsaWNrKT1cImxvZ2luKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkFVVEguQlROX0xPR0lOPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBJZiB1c2VyIGxvZ2luIC0tPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbG9naW5CdXR0b25zPlxuICAgICAgICAgICAgICAgICAgPCEtLSBGZWF0dXJlIGJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpyeElmPVwiJGZpbHRlcmVkQnV0dG9uczsgbGV0IGJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXRlbS5wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVyRGlyZWN0aW9uPVwicm9vdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlvbi1mbG9hdC1zdGFydFwiICpuZ0lmPVwiaXRlbS5pY29uXCIgW25hbWVdPVwiaXRlbS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0XCIgKm5nSWY9XCJpdGVtLm1hdEljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD57eyAnSE9NRS5CVE5fREFUQV9FTlRSWScgfCB0cmFuc2xhdGU6IHsgbmFtZTogKGl0ZW0udGl0bGUgfCB0cmFuc2xhdGUpIH0gfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1iYWRnZSAqcnhJZj1cIml0ZW0uJGJhZGdlOyBsZXQgYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCIoaXRlbS4kYmFkZ2VDb2xvciB8IHB1c2gpIHx8ICdhY2NlbnQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tiYWRnZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWJhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXZpZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLmFjdGlvblwiIFtjbGFzc109XCJpdGVtLmNzc0NsYXNzXCIgY2xhc3M9XCJidXR0b24tZGl2aWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT57eyBpdGVtLnRpdGxlIH19Jm5ic3A7PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS08cCAqbmdJZj1cImJ1dHRvbnMubGVuZ3RoXCIgY2xhc3M9XCJ2aXNpYmxlLW1vYmlsZVwiPiZuYnNwOzwvcD4tLT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cInNob3dBY2NvdW50QnV0dG9uXCIgZXhwYW5kPVwiYmxvY2tcIiBjb2xvcj1cInNlY29uZGFyeVwiIFtyb3V0ZXJMaW5rXT1cIlsnL2FjY291bnQnXVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnRcIiBuYW1lPVwicGVyc29uLWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+SE9NRS5CVE5fTVlfQUNDT1VOVDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgIDxwIGhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1vYmlsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCInSE9NRS5OT1RfVEhJU19BQ0NPVU5UX1FVRVNUSU9OJyB8IHRyYW5zbGF0ZTogeyBkaXNwbGF5TmFtZTogYWNjb3VudE5hbWUgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cImxvZ291dCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SE9NRS5CVE5fRElTQ09OTkVDVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiMFwiIFtzaXplWGxdPVwiaGFzRmVlZCA/IDEgOiAwXCI+PC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBbY2xhc3MuZmVlZF09XCJoYXNGZWVkXCIgW3NpemVdPVwiaGFzRmVlZCA/IDEyIDogMFwiIFtzaXplWGxdPVwiaGFzRmVlZCA/IDQgOiAwXCI+XG4gICAgICAgICAgQGlmIChzaG93RmVlZCkge1xuICAgICAgICAgICAgQGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgICAgPGFwcC1mZWVkXG4gICAgICAgICAgICAgICAgI2ZlZWRcbiAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBbdXJsc109XCJmZWVkVXJsc1wiXG4gICAgICAgICAgICAgICAgW21heEFnZUluTW9udGhzXT1cImZlZWRNYXhBZ2VJbk1vbnRoc1wiXG4gICAgICAgICAgICAgICAgW21heENvbnRlbnRMZW5ndGhdPVwiZmVlZE1heENvbnRlbnRMZW5ndGhcIlxuICAgICAgICAgICAgICAgIChuZ0luaXQpPVwiaW5pdEZlZWQoZmVlZClcIlxuICAgICAgICAgICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgICAgICAgICAgPjwvYXBwLWZlZWQ+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGFwcC1mZWVkXG4gICAgICAgICAgICAgICAgI2ZlZWRcbiAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBbZGVidWddPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFt1cmxzXT1cImZlZWRVcmxzXCJcbiAgICAgICAgICAgICAgICBbbWF4QWdlSW5Nb250aHNdPVwiZmVlZE1heEFnZUluTW9udGhzXCJcbiAgICAgICAgICAgICAgICBbbWF4Q29udGVudExlbmd0aF09XCJmZWVkTWF4Q29udGVudExlbmd0aFwiXG4gICAgICAgICAgICAgICAgKG5nSW5pdCk9XCJpbml0RmVlZChmZWVkKVwiXG4gICAgICAgICAgICAgICAgQHNsaWRlSW5BbmltYXRpb25cbiAgICAgICAgICAgICAgICBAZmFkZUluQW5pbWF0aW9uXG4gICAgICAgICAgICAgID48L2FwcC1mZWVkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG5cbiAgICA8IS0tIFBhZ2UgaGlzdG9yeSAtLT5cbiAgICBAbGV0IHBhZ2VIaXN0b3J5ID0gaXNMb2dpbiAmJiAocGFnZUhpc3RvcnkkIHwgcHVzaCk7XG4gICAgQGlmIChwYWdlSGlzdG9yeSB8IGlzTm90RW1wdHlBcnJheSkge1xuICAgICAgPGlvbi1ncmlkIGNsYXNzPVwiaGlzdG9yeS1jb250YWluZXIgaW9uLWFsaWduLXNlbGYtY2VudGVyXCI+XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZUhpc3Rvcnk7IHRyYWNrIHBhZ2UucGF0aCkge1xuICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS14bD1cIlwiIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxpb24tY2FyZCBjbGFzcz1cImlvbi1hbGlnbi1zZWxmLXN0YXJ0IGlvbi10ZXh0LXN0YXJ0XCIgQGZhZGVJbkFuaW1hdGlvbj5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdG9wIGJhciAtLT5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVQYWdlSGlzdG9yeShwYWdlLnBhdGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1mbG9hdC1zdGFydCBpb24tbm8tbWFyZ2luIGNsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBbaW5uZXJIVE1MXT1cInBhZ2Uuc3VidGl0bGUgfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpb24tZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKHBhZ2UudGltZSB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9KSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChwYWdlLnRpbWUgfCBkYXRlRm9ybWF0OiB7IHRpbWU6IHRydWUgfSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRpbWUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyBwYWdlLnRpbWUgfCBkYXRlRnJvbU5vdyB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuXG4gICAgICAgICAgICAgICAgICA8IS0tIG1haW4gcGFnZSAtLT5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZSBjbGFzcz1cImlvbi1uby1tYXJnaW4gaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgZGV0YWlsPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMXhcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInBhZ2UucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgcm91dGVyRGlyZWN0aW9uPVwicm9vdFwiXG4gICAgICAgICAgICAgICAgICAgICAgbGluZXM9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gcGFnZSBpY29uLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwicGFnZS5pY29uXCIgc2xvdD1cInN0YXJ0XCIgW25hbWVdPVwicGFnZS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwYWdlLm1hdEljb25cIiBzbG90PVwic3RhcnRcIj57eyBwYWdlLm1hdEljb24gfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIiBbaW5uZXJIVE1MXT1cInBhZ2UudGl0bGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIGNoaWxkcmVuIHBhZ2VzIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAocGFnZS5jaGlsZHJlbiB8IGlzTm90RW1wdHlBcnJheSkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tcGFkZGluZy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkUGFnZSBvZiBwYWdlLmNoaWxkcmVuOyB0cmFjayBjaGlsZFBhZ2UucGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJjaGlsZFBhZ2UucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckRpcmVjdGlvbj1cInJvb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHBhZ2UgaWNvbi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJjaGlsZFBhZ2UuaWNvblwiIHNsb3Q9XCJzdGFydFwiIGNvbG9yPVwiZGFya1wiIFtuYW1lXT1cImNoaWxkUGFnZS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY2hpbGRQYWdlLm1hdEljb25cIiBzbG90PVwic3RhcnRcIiBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjaGlsZFBhZ2UubWF0SWNvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYXJrXCIgW2lubmVySFRNTF09XCJjaGlsZFBhZ2UudGl0bGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWdyaWQ+XG4gICAgfVxuXG4gICAgPCEtLSBCb3R0b20gYmFubmVyIC0tPlxuICAgIEBpZiAoc2hvd1BhcnRuZXJCYW5uZXIgfHwgc2hvd0xlZ2FsSW5mb3JtYXRpb24pIHtcbiAgICAgIDxpb24tZ3JpZFxuICAgICAgICBjbGFzcz1cImJvdHRvbS1iYW5uZXIgaW9uLXRleHQtY2VudGVyXCJcbiAgICAgICAgW2NsYXNzLmZsb2F0aW5nXT1cIiFtb2JpbGUgJiYgKHBhZ2VIaXN0b3J5IHwgaXNFbXB0eUFycmF5KVwiXG4gICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgID5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPCEtLSBwYXJ0bmVycyBsb2dvcyAtLT5cbiAgICAgICAgICBAaWYgKHNob3dQYXJ0bmVyQmFubmVyKSB7XG4gICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBbc2l6ZUxnXT1cInBhcnRuZXJCYW5uZXJTaXplXCIgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgQGlmIChzaG93TGVnYWxJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXI+e3sgJ0hPTUUuUEFSVE5FUlMnIHwgdHJhbnNsYXRlIH19PC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8IS0tIHBhcnRuZXJzIC0tPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mICRwYXJ0bmVycyB8IGFzeW5jOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwie3sgaXRlbS5zaXRlVXJsIH19XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9nb1wiXG4gICAgICAgICAgICAgICAgICAgIHNyYz1cInt7IGl0ZW0ubG9nbyB9fVwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cInt7IGl0ZW0ubGFiZWwgfX1cIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gaXRlbS5sYWJlbCA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyBpdGVtLmxhYmVsIDogJydcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIGxlZ2FsIGluZm9ybWF0aW9uIC0tPlxuICAgICAgICAgIEBpZiAoc2hvd0xlZ2FsSW5mb3JtYXRpb24pIHtcbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIHNpemUtc209XCI2XCIgc2l6ZS1sZz1cIjRcIiBbY2xhc3MubGVmdC1ib3JkZXJdPVwic2hvd1BhcnRuZXJCYW5uZXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwibGVnYWwtaW5mb1wiPlxuICAgICAgICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXIgY2xhc3M9XCJpb24tdGV4dC1sZWZ0XCI+e3sgJ0hPTUUuTEVHQUxfSU5GT1JNQVRJT04nIHwgdHJhbnNsYXRlIH19PC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBsZWdhbEluZm9ybWF0aW9uOyB0cmFjayBpdGVtLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taXRlbSAoY2xpY2spPVwib3Blbk1hcmtkb3duTW9kYWwoJGV2ZW50LCBpdGVtKVwiIGxpbmVzPVwibm9uZVwiIFtidXR0b25dPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS50aXRsZSB8IHRyYW5zbGF0ZTogaXRlbS50aXRsZUFyZ3MgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICBAaWYgKHNob3dJbnN0YWxsTGlua3MpIHtcbiAgICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1sZz1cIjNcIiBvZmZzZXQtbGc9XCI5XCIgW2NsYXNzLmxlZnQtYm9yZGVyXT1cInNob3dQYXJ0bmVyQmFubmVyXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwibGVnYWwtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGlvbi1saXN0LWhlYWRlcj57eyAnSE9NRS5JTlNUQUxMX0FQUCcgfCB0cmFuc2xhdGUgfX08L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETyAtLT5cbiAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1ncmlkPlxuICAgIH1cbiAgfVxuXG4gIDwhLS0gaW1hZ2UgY3JlZGl0cyAtLT5cbiAgQGlmIChjb250ZW50Q3JlZGl0cyB8IGlzTm90TmlsT3JCbGFuaykge1xuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNyZWRpdHNcIiBbY2xhc3MuZmxvYXRpbmddPVwiIW1vYmlsZVwiPlxuICAgICAgPGlvbi10ZXh0Pnt7IGNvbnRlbnRDcmVkaXRzIH19PC9pb24tdGV4dD5cbiAgICA8L2Rpdj5cbiAgfVxuPC9pb24tY29udGVudD5cbiJdfQ==
|