simpo-component-library 3.6.723 → 3.6.725

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.
@@ -917,7 +917,7 @@ export class ProductDescComponent extends BaseSection {
917
917
  return currentDate;
918
918
  }
919
919
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductDescComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.RestService }, { token: i4.CartService }, { token: i5.StorageServiceService }, { token: i6.MessageService }, { token: i7.Meta }, { token: i7.Title }, { token: i8.MatBottomSheet }, { token: i0.Renderer2 }, { token: i9.MatDialog }, { token: i10.AnalyticsService }], target: i0.ɵɵFactoryTarget.Component }); }
920
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }, { propertyName: "aboveHeight", first: true, predicate: ["aboveHeight"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "imageSection", first: true, predicate: ["imageSection"], descendants: true }, { propertyName: "detailSection", first: true, predicate: ["detailSection"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div> -->\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\r\n [simpoLayout]=\"styles?.layout\" #container>\r\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div> -->\r\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\r\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\r\n <div class=\"h-100 d-flex flex-column flex-lg-column-reverse justify-content-start gap-1\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\r\n <div class=\"product-hero-card-modern\">\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Moved descriptors to Details tab below -->\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <!-- Moved tags to Details tab below -->\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <!-- Tabs Navigation -->\r\n <div class=\"product-tabs-container\">\r\n <ul class=\"tabs-list\">\r\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\r\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Details')\">Details</li>\r\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\r\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Reviews')\">Reviews</li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Tab Content -->\r\n <div class=\"tab-content-pane\">\r\n <div *ngIf=\"activeTab == 'Details'\">\r\n <div [innerHTML]=\"responseData?.brief | sanitizeHtml\" class=\"mt-2 text-justify line-height-24 font-14\"></div>\r\n\r\n <!-- Integrated descriptors and tags here -->\r\n <div class=\"mt-2\">\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'Reviews'\">\r\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container> -->\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\r\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\r\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\r\n message</mat-icon>Notify Me</button>\r\n </div>\r\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-icon\" (click)=\"shareProduct()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-3\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-semibold\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"product-info-minimal\">\r\n <!-- Title and Price Row -->\r\n <div class=\"title-price-row-modern\">\r\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\r\n <div class=\"product-price-modern\">\r\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\r\n </div>\r\n </div>\r\n\r\n <!-- Rating Row -->\r\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\r\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"separator\">|</span>\r\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\r\n {{responseData?.totalReviewCount}} reviews</span>\r\n </div>\r\n\r\n <!-- Brief Description -->\r\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc mt-2\">\r\n <div>\r\n <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <mat-icon>add</mat-icon> PRICE BREAKUP\r\n </div>\r\n </div>\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\r\n [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\r\n {{ele?.materialName | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Net Weight/{{ele?.unit | titlecase}}\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\r\n </div>\r\n </div>\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.purity |\r\n titlecase}}\r\n </div>\r\n </div>\r\n <!-- <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Price/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\r\n Making Charges\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Net Weight\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.baseWeight}} </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Making Charge %\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.makingChargePercentage}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"tab-group\">\r\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\r\n <div class=\"style-1-vertical d-flex flex-column w-100\">\r\n <div class=\"main-image-container p-0\">\r\n <div class=\"item-img rounded-3\">\r\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\r\n [magnification]=\"2\" [enableScrollZoom]=\"true\">\r\n </lib-ngx-image-zoom>\r\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\r\n class=\"w-100 h-100 object-fit-cover\">\r\n </div>\r\n </div>\r\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\r\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\r\n [class.active-thumb]=\"currentImg == img.imgUrl\"\r\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\r\n <div class=\"bento-masonry-container\">\r\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\" [class.featured]=\"i === 0\">\r\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\">\r\n <div class=\"col-4 video-call-img\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\r\n alt=\"\" class=\"w-100 h-100 \">\r\n </div>\r\n <div class=\"col-8 align-content-center\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n Schedule a Video Call\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section mb-2\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\"\r\n [style.borderColor]=\"styles?.background?.accentColor\">\r\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\r\n <div class=\"d-flex mx-1\"><mat-icon\r\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\r\n style=\"width: 100%;\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\r\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\r\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\r\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\r\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\r\n </svg>\r\n </span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\r\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n expected Order will\r\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #TryAtHome>\r\n <!-- Try At Home Section -->\r\n <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-home\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\r\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\r\n </svg>\r\n </span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\r\n <!-- <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\r\n HOME</button>\r\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #StoreSection>\r\n <!-- Nearest Store Section -->\r\n <ng-container\r\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0;else emptyStore\">\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-center store-item\">\r\n <span class=\"store-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #emptyStore>\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <span class=\"delivery-text\">No Stores are available</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"varient-data\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div>\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div>\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\r\n <mat-icon>video_call</mat-icon>&nbsp;\r\n SCHEDULE A VIDEO CALL\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon>&nbsp;\r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3 text-center\">COMPONENT</div>\r\n <div class=\"col-3 text-center\">RATE</div>\r\n <div class=\"col-3 text-center\">WEIGHT</div>\r\n <div class=\"col-3 text-center\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\r\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\r\n number:'1.2-2' }}</div>\r\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\r\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #ReviewsSection>\r\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\r\n\r\n <!-- Header: Title + Average | Bar Chart -->\r\n <div class=\"rv-header\">\r\n <div class=\"rv-header-left\">\r\n <h2 class=\"rv-title\">Reviews &amp; Ratings</h2>\r\n <div class=\"rv-average-row\">\r\n <!-- filled stars -->\r\n <div class=\"rv-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"rv-avg-label\">average</span>\r\n </div>\r\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\r\n {{responseData?.totalReviewCount | number}} Reviews\r\n </div>\r\n </div>\r\n\r\n <div class=\"rv-bars\">\r\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\r\n <div class=\"rv-bar-row\">\r\n <span class=\"rv-bar-label\">{{rating}}</span>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <div class=\"rv-bar-track\">\r\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Review Cards Grid -->\r\n <div class=\"rv-grid\">\r\n <ng-container *ngFor=\"let review of reviewsData\">\r\n <ng-container *ngIf=\"review.review\">\r\n <div class=\"rv-card\">\r\n <div class=\"rv-card-top\">\r\n <div class=\"rv-reviewer\">\r\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\r\n class=\"rv-avatar\" alt=\"\">\r\n <div class=\"rv-name-date\">\r\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\r\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\r\n </div>\r\n </div>\r\n <!-- Star rating -->\r\n <div class=\"rv-card-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\r\n\r\n <!-- Review Images -->\r\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\r\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\r\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\r\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-body\" style=\"height: 100%;\">\r\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\r\n <source\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\r\n type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog review-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title fs-5\"></h1>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"detail-review-container\">\r\n <div class=\"image-section\">\r\n <div class=\"product-image\">\r\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\r\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\r\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\r\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\r\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\r\n <!-- <div class=\"earbuds-container\">\r\n <div class=\"charging-case\"></div>\r\n <div class=\"earbud left\"></div>\r\n <div class=\"earbud right\"></div>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"navigation-arrows\">\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"review-section\">\r\n <div class=\"reviewer-header\">\r\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\r\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\r\n </div>\r\n\r\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\r\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n </div>\r\n\r\n <div class=\"review-date\">\r\n Reviewed in India on 24 July 2025\r\n </div>\r\n\r\n <div class=\"review-text\">\r\n {{selectedReview?.review ?? \"-\"}}\r\n </div>\r\n\r\n <div class=\"images-section\">\r\n <h3>Images in this review</h3>\r\n <div class=\"review-images\">\r\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\r\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\r\n <img [src]=\"img.imgUrl\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:40px;width:40px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.total-container,.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:600px;margin:0 auto;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:block;column-count:2;column-gap:20px;width:100%}.bento-item-modern{break-inside:avoid;margin-bottom:20px;border-radius:24px;overflow:hidden;background:#fdfdfd;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-item-modern.featured{margin-bottom:25px;border-radius:28px}.bento-img-modern{width:100%;height:auto;max-height:500px;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-5px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{column-count:1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column;gap:1rem}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "pipe", type: i11.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: i11.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i13.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i14.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i15.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: i16.NgxImageZoomComponent, selector: "lib-ngx-image-zoom", inputs: ["thumbImage", "fullImage", "zoomMode", "magnification", "minZoomRatio", "maxZoomRatio", "scrollStepSize", "enableLens", "lensWidth", "lensHeight", "circularLens", "enableScrollZoom", "altText", "titleText"], outputs: ["zoomScroll", "zoomPosition", "imagesLoaded"] }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "edit", "customClass", "delete", "nextComponentColor"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId", "iconColor"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i17.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i18.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: SvgDividerComponent, selector: "simpo-svg-divider", inputs: ["dividerType", "color"] }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "ngmodule", type: NgxSkeletonLoaderModule }] }); }
920
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }, { propertyName: "aboveHeight", first: true, predicate: ["aboveHeight"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "imageSection", first: true, predicate: ["imageSection"], descendants: true }, { propertyName: "detailSection", first: true, predicate: ["detailSection"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div> -->\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\r\n [simpoLayout]=\"styles?.layout\" #container>\r\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div> -->\r\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\r\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\r\n <div class=\"h-100 d-flex flex-column flex-lg-column-reverse justify-content-start gap-1\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\r\n <div class=\"product-hero-card-modern\">\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.deliveryEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.storesEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.appointmentBookingEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.videoCallEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.brandEnabled\">\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Moved descriptors to Details tab below -->\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <!-- Moved tags to Details tab below -->\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <!-- Tabs Navigation -->\r\n <div class=\"product-tabs-container\">\r\n <ul class=\"tabs-list\">\r\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\r\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Details')\">Details</li>\r\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\r\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Reviews')\">Reviews</li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Tab Content -->\r\n <div class=\"tab-content-pane\">\r\n <div *ngIf=\"activeTab == 'Details'\">\r\n <div [innerHTML]=\"responseData?.brief | sanitizeHtml\" class=\"mt-2 text-justify line-height-24 font-14\"></div>\r\n\r\n <!-- Integrated descriptors and tags here -->\r\n <div class=\"mt-2\">\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'Reviews'\">\r\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container> -->\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\r\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\r\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\r\n message</mat-icon>Notify Me</button>\r\n </div>\r\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-icon\" (click)=\"shareProduct()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-3\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-semibold\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"product-info-minimal\">\r\n <!-- Title and Price Row -->\r\n <div class=\"title-price-row-modern\">\r\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\r\n <div class=\"product-price-modern\">\r\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\r\n </div>\r\n </div>\r\n\r\n <!-- Rating Row -->\r\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\r\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"separator\">|</span>\r\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\r\n {{responseData?.totalReviewCount}} reviews</span>\r\n </div>\r\n\r\n <!-- Brief Description -->\r\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc mt-2\">\r\n <div>\r\n <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <mat-icon>add</mat-icon> PRICE BREAKUP\r\n </div>\r\n </div>\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\r\n [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\r\n {{ele?.materialName | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Net Weight/{{ele?.unit | titlecase}}\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\r\n </div>\r\n </div>\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.purity |\r\n titlecase}}\r\n </div>\r\n </div>\r\n <!-- <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Price/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\r\n Making Charges\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Net Weight\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.baseWeight}} </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Making Charge %\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.makingChargePercentage}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"tab-group\">\r\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\r\n <div class=\"style-1-vertical d-flex flex-column w-100\">\r\n <div class=\"main-image-container p-0\">\r\n <div class=\"item-img rounded-3\">\r\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\r\n [magnification]=\"2\" [enableScrollZoom]=\"true\">\r\n </lib-ngx-image-zoom>\r\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\r\n class=\"w-100 h-100 object-fit-cover\">\r\n </div>\r\n </div>\r\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\r\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\r\n [class.active-thumb]=\"currentImg == img.imgUrl\"\r\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\r\n <div class=\"bento-masonry-container\">\r\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\" [class.featured]=\"i === 0\">\r\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\">\r\n <div class=\"col-4 video-call-img\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\r\n alt=\"\" class=\"w-100 h-100 \">\r\n </div>\r\n <div class=\"col-8 align-content-center\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n Schedule a Video Call\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section mb-2\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\"\r\n [style.borderColor]=\"styles?.background?.accentColor\">\r\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\r\n <div class=\"d-flex mx-1\"><mat-icon\r\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\r\n style=\"width: 100%;\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\r\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\r\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\r\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\r\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\r\n </svg>\r\n </span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\r\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n expected Order will\r\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #TryAtHome>\r\n <!-- Try At Home Section -->\r\n <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-home\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\r\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\r\n </svg>\r\n </span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\r\n <!-- <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\r\n HOME</button>\r\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #StoreSection>\r\n <!-- Nearest Store Section -->\r\n <ng-container\r\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0;else emptyStore\">\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-center store-item\">\r\n <span class=\"store-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #emptyStore>\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <span class=\"delivery-text\">No Stores are available</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"varient-data\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div>\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div>\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\r\n <mat-icon>video_call</mat-icon>&nbsp;\r\n SCHEDULE A VIDEO CALL\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon>&nbsp;\r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3 text-center\">COMPONENT</div>\r\n <div class=\"col-3 text-center\">RATE</div>\r\n <div class=\"col-3 text-center\">WEIGHT</div>\r\n <div class=\"col-3 text-center\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\r\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\r\n number:'1.2-2' }}</div>\r\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\r\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #ReviewsSection>\r\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\r\n\r\n <!-- Header: Title + Average | Bar Chart -->\r\n <div class=\"rv-header\">\r\n <div class=\"rv-header-left\">\r\n <h2 class=\"rv-title\">Reviews &amp; Ratings</h2>\r\n <div class=\"rv-average-row\">\r\n <!-- filled stars -->\r\n <div class=\"rv-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"rv-avg-label\">average</span>\r\n </div>\r\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\r\n {{responseData?.totalReviewCount | number}} Reviews\r\n </div>\r\n </div>\r\n\r\n <div class=\"rv-bars\">\r\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\r\n <div class=\"rv-bar-row\">\r\n <span class=\"rv-bar-label\">{{rating}}</span>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <div class=\"rv-bar-track\">\r\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Review Cards Grid -->\r\n <div class=\"rv-grid\">\r\n <ng-container *ngFor=\"let review of reviewsData\">\r\n <ng-container *ngIf=\"review.review\">\r\n <div class=\"rv-card\">\r\n <div class=\"rv-card-top\">\r\n <div class=\"rv-reviewer\">\r\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\r\n class=\"rv-avatar\" alt=\"\">\r\n <div class=\"rv-name-date\">\r\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\r\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\r\n </div>\r\n </div>\r\n <!-- Star rating -->\r\n <div class=\"rv-card-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\r\n\r\n <!-- Review Images -->\r\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\r\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\r\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\r\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-body\" style=\"height: 100%;\">\r\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\r\n <source\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\r\n type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog review-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title fs-5\"></h1>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"detail-review-container\">\r\n <div class=\"image-section\">\r\n <div class=\"product-image\">\r\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\r\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\r\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\r\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\r\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\r\n <!-- <div class=\"earbuds-container\">\r\n <div class=\"charging-case\"></div>\r\n <div class=\"earbud left\"></div>\r\n <div class=\"earbud right\"></div>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"navigation-arrows\">\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"review-section\">\r\n <div class=\"reviewer-header\">\r\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\r\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\r\n </div>\r\n\r\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\r\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n </div>\r\n\r\n <div class=\"review-date\">\r\n Reviewed in India on 24 July 2025\r\n </div>\r\n\r\n <div class=\"review-text\">\r\n {{selectedReview?.review ?? \"-\"}}\r\n </div>\r\n\r\n <div class=\"images-section\">\r\n <h3>Images in this review</h3>\r\n <div class=\"review-images\">\r\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\r\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\r\n <img [src]=\"img.imgUrl\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:40px;width:40px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.total-container,.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:600px;margin:0 auto;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:block;column-count:2;column-gap:20px;width:100%}.bento-item-modern{break-inside:avoid;margin-bottom:20px;border-radius:24px;overflow:hidden;background:#fdfdfd;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-item-modern.featured{margin-bottom:25px;border-radius:28px}.bento-img-modern{width:100%;height:auto;max-height:500px;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-5px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{column-count:1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column;gap:1rem}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "pipe", type: i11.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i11.DatePipe, name: "date" }, { kind: "pipe", type: i11.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i13.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i14.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i15.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue", "backgroundInfo"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: i16.NgxImageZoomComponent, selector: "lib-ngx-image-zoom", inputs: ["thumbImage", "fullImage", "zoomMode", "magnification", "minZoomRatio", "maxZoomRatio", "scrollStepSize", "enableLens", "lensWidth", "lensHeight", "circularLens", "enableScrollZoom", "altText", "titleText"], outputs: ["zoomScroll", "zoomPosition", "imagesLoaded"] }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "edit", "customClass", "delete", "nextComponentColor"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId", "iconColor"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i17.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i18.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: SvgDividerComponent, selector: "simpo-svg-divider", inputs: ["dividerType", "color"] }, { kind: "directive", type: ButtonEditorDirective, selector: "button[appButtonEditor]", inputs: ["appButtonEditor", "buttonData", "buttonStyle", "backgroundInfo", "sectionId", "buttonId"] }, { kind: "directive", type: SpacingHorizontalDirective, selector: "[spacingHorizontal]", inputs: ["spacingHorizontal", "isHeader"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "ngmodule", type: NgxSkeletonLoaderModule }] }); }
921
921
  }
922
922
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductDescComponent, decorators: [{
923
923
  type: Component,
@@ -949,7 +949,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
949
949
  SpacingHorizontalDirective,
950
950
  SanitizeHtmlPipe,
951
951
  NgxSkeletonLoaderModule
952
- ], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div> -->\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\r\n [simpoLayout]=\"styles?.layout\" #container>\r\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div> -->\r\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\r\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\r\n <div class=\"h-100 d-flex flex-column flex-lg-column-reverse justify-content-start gap-1\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\r\n <div class=\"product-hero-card-modern\">\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Moved descriptors to Details tab below -->\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <!-- Moved tags to Details tab below -->\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <!-- Tabs Navigation -->\r\n <div class=\"product-tabs-container\">\r\n <ul class=\"tabs-list\">\r\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\r\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Details')\">Details</li>\r\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\r\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Reviews')\">Reviews</li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Tab Content -->\r\n <div class=\"tab-content-pane\">\r\n <div *ngIf=\"activeTab == 'Details'\">\r\n <div [innerHTML]=\"responseData?.brief | sanitizeHtml\" class=\"mt-2 text-justify line-height-24 font-14\"></div>\r\n\r\n <!-- Integrated descriptors and tags here -->\r\n <div class=\"mt-2\">\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'Reviews'\">\r\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container> -->\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\r\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\r\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\r\n message</mat-icon>Notify Me</button>\r\n </div>\r\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-icon\" (click)=\"shareProduct()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-3\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-semibold\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"product-info-minimal\">\r\n <!-- Title and Price Row -->\r\n <div class=\"title-price-row-modern\">\r\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\r\n <div class=\"product-price-modern\">\r\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\r\n </div>\r\n </div>\r\n\r\n <!-- Rating Row -->\r\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\r\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"separator\">|</span>\r\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\r\n {{responseData?.totalReviewCount}} reviews</span>\r\n </div>\r\n\r\n <!-- Brief Description -->\r\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc mt-2\">\r\n <div>\r\n <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <mat-icon>add</mat-icon> PRICE BREAKUP\r\n </div>\r\n </div>\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\r\n [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\r\n {{ele?.materialName | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Net Weight/{{ele?.unit | titlecase}}\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\r\n </div>\r\n </div>\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.purity |\r\n titlecase}}\r\n </div>\r\n </div>\r\n <!-- <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Price/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\r\n Making Charges\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Net Weight\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.baseWeight}} </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Making Charge %\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.makingChargePercentage}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"tab-group\">\r\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\r\n <div class=\"style-1-vertical d-flex flex-column w-100\">\r\n <div class=\"main-image-container p-0\">\r\n <div class=\"item-img rounded-3\">\r\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\r\n [magnification]=\"2\" [enableScrollZoom]=\"true\">\r\n </lib-ngx-image-zoom>\r\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\r\n class=\"w-100 h-100 object-fit-cover\">\r\n </div>\r\n </div>\r\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\r\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\r\n [class.active-thumb]=\"currentImg == img.imgUrl\"\r\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\r\n <div class=\"bento-masonry-container\">\r\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\" [class.featured]=\"i === 0\">\r\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\">\r\n <div class=\"col-4 video-call-img\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\r\n alt=\"\" class=\"w-100 h-100 \">\r\n </div>\r\n <div class=\"col-8 align-content-center\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n Schedule a Video Call\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section mb-2\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\"\r\n [style.borderColor]=\"styles?.background?.accentColor\">\r\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\r\n <div class=\"d-flex mx-1\"><mat-icon\r\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\r\n style=\"width: 100%;\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\r\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\r\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\r\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\r\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\r\n </svg>\r\n </span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\r\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n expected Order will\r\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #TryAtHome>\r\n <!-- Try At Home Section -->\r\n <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-home\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\r\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\r\n </svg>\r\n </span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\r\n <!-- <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\r\n HOME</button>\r\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #StoreSection>\r\n <!-- Nearest Store Section -->\r\n <ng-container\r\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0;else emptyStore\">\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-center store-item\">\r\n <span class=\"store-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #emptyStore>\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <span class=\"delivery-text\">No Stores are available</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"varient-data\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div>\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div>\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\r\n <mat-icon>video_call</mat-icon>&nbsp;\r\n SCHEDULE A VIDEO CALL\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon>&nbsp;\r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3 text-center\">COMPONENT</div>\r\n <div class=\"col-3 text-center\">RATE</div>\r\n <div class=\"col-3 text-center\">WEIGHT</div>\r\n <div class=\"col-3 text-center\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\r\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\r\n number:'1.2-2' }}</div>\r\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\r\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #ReviewsSection>\r\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\r\n\r\n <!-- Header: Title + Average | Bar Chart -->\r\n <div class=\"rv-header\">\r\n <div class=\"rv-header-left\">\r\n <h2 class=\"rv-title\">Reviews &amp; Ratings</h2>\r\n <div class=\"rv-average-row\">\r\n <!-- filled stars -->\r\n <div class=\"rv-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"rv-avg-label\">average</span>\r\n </div>\r\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\r\n {{responseData?.totalReviewCount | number}} Reviews\r\n </div>\r\n </div>\r\n\r\n <div class=\"rv-bars\">\r\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\r\n <div class=\"rv-bar-row\">\r\n <span class=\"rv-bar-label\">{{rating}}</span>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <div class=\"rv-bar-track\">\r\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Review Cards Grid -->\r\n <div class=\"rv-grid\">\r\n <ng-container *ngFor=\"let review of reviewsData\">\r\n <ng-container *ngIf=\"review.review\">\r\n <div class=\"rv-card\">\r\n <div class=\"rv-card-top\">\r\n <div class=\"rv-reviewer\">\r\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\r\n class=\"rv-avatar\" alt=\"\">\r\n <div class=\"rv-name-date\">\r\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\r\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\r\n </div>\r\n </div>\r\n <!-- Star rating -->\r\n <div class=\"rv-card-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\r\n\r\n <!-- Review Images -->\r\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\r\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\r\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\r\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-body\" style=\"height: 100%;\">\r\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\r\n <source\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\r\n type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog review-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title fs-5\"></h1>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"detail-review-container\">\r\n <div class=\"image-section\">\r\n <div class=\"product-image\">\r\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\r\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\r\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\r\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\r\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\r\n <!-- <div class=\"earbuds-container\">\r\n <div class=\"charging-case\"></div>\r\n <div class=\"earbud left\"></div>\r\n <div class=\"earbud right\"></div>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"navigation-arrows\">\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"review-section\">\r\n <div class=\"reviewer-header\">\r\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\r\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\r\n </div>\r\n\r\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\r\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n </div>\r\n\r\n <div class=\"review-date\">\r\n Reviewed in India on 24 July 2025\r\n </div>\r\n\r\n <div class=\"review-text\">\r\n {{selectedReview?.review ?? \"-\"}}\r\n </div>\r\n\r\n <div class=\"images-section\">\r\n <h3>Images in this review</h3>\r\n <div class=\"review-images\">\r\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\r\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\r\n <img [src]=\"img.imgUrl\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:40px;width:40px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.total-container,.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:600px;margin:0 auto;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:block;column-count:2;column-gap:20px;width:100%}.bento-item-modern{break-inside:avoid;margin-bottom:20px;border-radius:24px;overflow:hidden;background:#fdfdfd;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-item-modern.featured{margin-bottom:25px;border-radius:28px}.bento-img-modern{width:100%;height:auto;max-height:500px;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-5px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{column-count:1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column;gap:1rem}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}\n"] }]
952
+ ], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Call Schedule\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"Video Scheduling\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoBackground]=\"styles?.background\" simpoHover\r\n (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\">\r\n\r\n <!-- <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div> -->\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\" [spacingHorizontal]=\"stylesLayout\"\r\n [simpoLayout]=\"styles?.layout\" #container>\r\n <!-- <div class=\"display-none\"><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\"\r\n (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div> -->\r\n <div class=\"row m-0 w-100 mt-lg-4 h-auto overflow-visible\" #aboveHeight>\r\n <div class=\"col-lg-6 col-sm-12 image-section-modern\" #imageSection>\r\n <div class=\"h-100 d-flex flex-column flex-lg-column-reverse justify-content-start gap-1\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-sm-12 detail-section-modern \" #detailSection>\r\n <div class=\"product-hero-card-modern\">\r\n <ng-container *ngIf=\"isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"variants\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.deliveryEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.deliveryEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"DeliverySection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.storesEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.storesEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"StoreSection\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.appointmentBookingEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.appointmentBookingEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"TryAtHome\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.videoCallEnabled\">\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container *ngTemplateOutlet=\"videoCallSchedule\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"ecomConfigs?.brandEnabled\">\r\n <ng-container *ngTemplateOutlet=\"branding\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n\r\n <!-- Moved descriptors to Details tab below -->\r\n\r\n <!-- <div class=\"product-desc body-large d-block\" *ngIf=\"responseData?.brief\"\r\n [innerHTML]=\"responseData.brief\"></div> -->\r\n <!-- Moved tags to Details tab below -->\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <!-- Tabs Navigation -->\r\n <div class=\"product-tabs-container\">\r\n <ul class=\"tabs-list\">\r\n <li class=\"tab-item\" [class.active]=\"activeTab == 'Details'\"\r\n [style.color]=\"activeTab == 'Details' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Details' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Details')\">Details</li>\r\n <li class=\"tab-item\" *ngIf=\"reviewsData\" [class.active]=\"activeTab == 'Reviews'\"\r\n [style.color]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : ''\"\r\n [style.borderColor]=\"activeTab == 'Reviews' ? styles?.background?.accentColor : 'transparent'\"\r\n (click)=\"changeTab('Reviews')\">Reviews</li>\r\n </ul>\r\n </div>\r\n\r\n <!-- Tab Content -->\r\n <div class=\"tab-content-pane\">\r\n <div *ngIf=\"activeTab == 'Details'\">\r\n <div [innerHTML]=\"responseData?.brief | sanitizeHtml\" class=\"mt-2 text-justify line-height-24 font-14\"></div>\r\n\r\n <!-- Integrated descriptors and tags here -->\r\n <div class=\"mt-2\">\r\n <ng-container *ngTemplateOutlet=\"descriptors\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeTab == 'Reviews'\">\r\n <ng-container *ngTemplateOutlet=\"ReviewsSection\"></ng-container>\r\n </div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container> -->\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"styles?.devider?.display\">\r\n <simpo-svg-divider [dividerType]=\"styles?.devider?.deviderType\"\r\n [color]=\"nextComponentColor?.color\"></simpo-svg-divider>\r\n </ng-container>\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\"\r\n [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add\r\n Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [backgroundInfo]=\"styles?.background\" [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addProductReview()\"\r\n [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit\r\n review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\"\r\n [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <button class=\"out-of-stock text-center\" *ngIf=\"isItemOutOfStock\" [appButtonEditor]=\"edit ?? false\"\r\n simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\">Out of\r\n Stock</button>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !ecomConfigs?.videoCallEnabled\"\r\n [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\" [style.color]=\"data?.styles?.background?.accentColor\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center fc\"\r\n [style.color]=\"data?.styles?.background?.accentColor\">{{responseData?.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\" [style.color]=\"data?.styles?.background?.accentColor\">+</div>\r\n </div>\r\n <button *ngIf=\"responseData?.quantity && ecomConfigs?.videoCallEnabled\" class=\"send-btn w-100\"\r\n [appButtonEditor]=\"edit ?? false\" simpoButtonDirective [buttonStyle]=\"getButtonStyle(0)\"\r\n [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\" [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n <mat-icon>videocam</mat-icon>LIVE VIDEO CALL</button>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\"\r\n (click)=\"!edit ? addToCart() : ''\"><mat-icon>shopping_cart</mat-icon>{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div *ngIf=\"(!responseData?.quantity && !isItemOutOfStock) && !IsEcommerce\" class=\"w-75\">\r\n <button class=\"send-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(0)\" [buttonId]=\"getButtonId(0)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(0)\" (click)=\"raiseLead()\"><mat-icon style=\"height:14px !important\">\r\n message</mat-icon>Notify Me</button>\r\n </div>\r\n <div class=\"favourite\" *ngIf=\"IsEcommerce\" (click)=\"isItemAsFavorite ? removeToFavourite() : addToFavourite()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n <div class=\"share-icon\" (click)=\"shareProduct()\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\">share</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #variants>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style1'\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"mb-3\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"data?.styles?.customization == 'Style2' && selectedVarient.size > 0\">\r\n <ng-container>\r\n <div class=\"row mt-2 style2-container w-100\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div *ngFor=\"let item of selectedVarient | keyvalue\" class=\"px-3 py-2 varient-item\"\r\n [class]=\"getClass(selectedVarient)\" [style.borderColor]=\"data?.styles?.background?.accentColor\">\r\n <div class=\"variant-head\">{{item.key | titlecase}}</div>\r\n <div class=\"variant-value text-start fw-semibold\">\r\n {{item.value |\r\n titlecase}}</div>\r\n </div>\r\n <div class=\"cursor-pointer p-0\" [class]=\"getClass(selectedVarient)\">\r\n <div class=\"custom-text d-flex align-items-center justify-content-center h-100 p-2\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightVariant\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">CUSTOMISE\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #ProductDesc>\r\n <div class=\"product-info-minimal\">\r\n <!-- Title and Price Row -->\r\n <div class=\"title-price-row-modern\">\r\n <h1 class=\"product-title-modern\">{{responseData?.name}}</h1>\r\n <div class=\"product-price-modern\">\r\n <span [innerHTML]=\"currency\"></span> {{responseData?.price?.sellingPrice}}\r\n </div>\r\n </div>\r\n\r\n <!-- Rating Row -->\r\n <div class=\"rating-row-modern\" *ngIf=\"responseData?.averageRating\">\r\n <p-rating [(ngModel)]=\"responseData.averageRating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n <span class=\"rating-score\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"separator\">|</span>\r\n <span class=\"reviews-link\" [style.color]=\"styles?.background?.accentColor\">\r\n {{responseData?.totalReviewCount}} reviews</span>\r\n </div>\r\n\r\n <!-- Brief Description -->\r\n <div class=\"product-brief-modern\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData?.brief | sanitizeHtml\">\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #descriptors>\r\n <div class=\"row prod-desc mt-2\">\r\n <div>\r\n <div class=\"product-header d-flex align-items-center justify-content-between\">\r\n <span class=\"header-text\" *ngIf=\"responseData?.descriptor || responseData?.materials\">Product Details</span>\r\n <div class=\"pricebreakup-btn d-flex align-items-center justify-content-center cursor-pointer\"\r\n *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\" data-bs-toggle=\"offcanvas\"\r\n data-bs-target=\"#offcanvasRightPriceBreakup\" [style.background]=\"data?.styles?.background?.accentColor\"\r\n [style.color]=\"getTextColor(data?.styles?.background?.accentColor)\">\r\n <mat-icon>add</mat-icon> PRICE BREAKUP\r\n </div>\r\n </div>\r\n <div class=\"description\">\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name | sanitizeHtml\"\r\n [style.background]=\"data?.styles?.background?.color\"></div>\r\n </div>\r\n <ng-container *ngIf=\"subIndustryName == 'Ecommerce Jewellery'\">\r\n <div class=\"jewellery-table-container\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor(ele.materialType)\">\r\n {{ele?.materialName | titlecase}}\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor(ele.materialType)\">\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Net Weight/{{ele?.unit | titlecase}}\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.quantity + \" \" + (ele?.unit | titlecase)}}\r\n </div>\r\n </div>\r\n <div class=\"col-6 metal-purity\">\r\n <div class=\"row-header\">\r\n Purity\r\n </div>\r\n <div class=\"row-content\">\r\n {{ele.purity |\r\n titlecase}}\r\n </div>\r\n </div>\r\n <!-- <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Price/Gram\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ getPricePerGram(ele.primaryMaterialWeight,ele.materialPrice) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{ele.materialPrice | number:'1.2-2'}}\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"jewel-container mt-2\">\r\n <div class=\"jewel-header\" [style.background]=\"getHeaderColor('Making Charges')\">\r\n Making Charges\r\n </div>\r\n <div class=\"row m-0 w-100 br-p\" [style.background]=\"getBackgroundColor('Making Charges')\">\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Net Weight\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.baseWeight}} </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Making Charge %\r\n </div>\r\n <div class=\"row-content\">\r\n {{responseData?.makingChargePercentage}}\r\n </div>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row-header\">\r\n Value\r\n </div>\r\n <div class=\"row-content\">\r\n \u20B9{{responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"tab-group\">\r\n <div class=\"tab\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" >Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large collapse\" id=\"collapseExample\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div> -->\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading && (isMobile || data?.styles?.gridStyle == 'Style1')\">\r\n <div class=\"style-1-vertical d-flex flex-column w-100\">\r\n <div class=\"main-image-container p-0\">\r\n <div class=\"item-img rounded-3\">\r\n <lib-ngx-image-zoom *ngIf=\"currentImg\" [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\"\r\n [magnification]=\"2\" [enableScrollZoom]=\"true\">\r\n </lib-ngx-image-zoom>\r\n <img *ngIf=\"!currentImg\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\"\r\n class=\"w-100 h-100 object-fit-cover\">\r\n </div>\r\n </div>\r\n <div class=\"thumbnail-row py-3 d-flex gap-2 overflow-auto hide-scroll\">\r\n <img class=\"img thumbnail-img\" *ngFor=\"let img of itemImages\" [src]=\"img.imgUrl\" (click)=\"changeImg(img.imgUrl)\"\r\n [class.active-thumb]=\"currentImg == img.imgUrl\"\r\n style=\"cursor: pointer; min-width: 80px; width: 80px; height: 80px; object-fit: cover; border-radius: 8px; border: 2px solid transparent;\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!varientLoading && (!isMobile && data?.styles?.gridStyle == 'Style2')\">\r\n <div class=\"bento-masonry-container\">\r\n <div *ngFor=\"let img of itemImages; let i = index\" class=\"bento-item-modern\" [class.featured]=\"i === 0\">\r\n <img [src]=\"img.imgUrl\" class=\"bento-img-modern\" (click)=\"changeImg(img.imgUrl)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #branding>\r\n <div class=\"row w-100\">\r\n <ng-container *ngFor=\"let brand of brandPromises\">\r\n <div class=\"col-4 d-flex flex-column align-items-center g-2\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\"\r\n [src]=\"brand?.logoUrl\" alt=\"\" class=\"w-h-40 p-0 rounded-circle\">\r\n <div class=\"brand-text w-100 text-center py-2\">\r\n {{brand?.title | titlecase}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #videoCallSchedule>\r\n <!-- *ngIf=\"ecomConfigs?.videoCallEnabled\" -->\r\n <ng-container>\r\n <div class=\"row w-100 video-container\">\r\n <div class=\"col-4 video-call-img\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/355007c175362077266611289-229221023_small.gif\"\r\n alt=\"\" class=\"w-100 h-100 \">\r\n </div>\r\n <div class=\"col-8 align-content-center\">\r\n <div class=\"video-head-text\">\r\n Live Video Call\r\n </div>\r\n <div class=\"sub-text\">\r\n Join a live video call with our consultants to see your favourite designs up close!\r\n </div>\r\n <button class=\"sch-btn text-center cursor-pointer\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(2)\" [buttonId]=\"getButtonId(2)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(2)\" (click)=\"!edit ? openDialogBox(dialogBox) : ''\">\r\n Schedule a Video Call\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #DeliverySection>\r\n <div class=\"delivery-container\">\r\n <h2 class=\"delivery-title\">Delivery, Stores & Trial</h2>\r\n\r\n <!-- Location Section -->\r\n <div class=\"location-section mb-2\">\r\n <div class=\"location-container d-flex align-items-center justify-content-between\"\r\n [style.borderColor]=\"styles?.background?.accentColor\">\r\n <div class=\"d-flex align-items-center flex-grow-1 me-2\" style=\"width: calc(100% - 100px);\">\r\n <div class=\"d-flex mx-1\"><mat-icon\r\n class=\"gps d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" class=\"postal-code-input flex-grow-1\" placeholder=\"Enter PinCode\" [(ngModel)]=\"pincode\"\r\n style=\"width: 100%;\">\r\n </div>\r\n <button class=\"btn locate-btn\" (click)=\"getStoreDetails()\">Submit</button>\r\n </div>\r\n <div *ngIf=\"!isPinCode\" style=\"color: red;\">Pin code must be 6 digits.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(pincode?.toString().length ?? 0) == 6\">\r\n <!-- Free Delivery Section -->\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-gift\">\r\n <polyline points=\"20 12 20 22 4 22 4 12\"></polyline>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect>\r\n <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line>\r\n <path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path>\r\n <path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>\r\n </svg>\r\n </span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges == 0\">Expected\r\n Delivery by {{ getDateAfterxDays() | date:'d MMM' }}</span>\r\n\r\n <span class=\"delivery-text\" *ngIf=\"ecomConfigs?.deliveryCharges > 0\">Your\r\n expected Order will\r\n Deliver by {{ getDateAfterxDays() | date:'d MMM' }} with a Delivery Charge of\r\n \u20B9 {{ecomConfigs?.deliveryCharges | number:'1.2-2'}}</span>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #TryAtHome>\r\n <!-- Try At Home Section -->\r\n <div class=\"try-home-section\">\r\n <div class=\"d-flex align-items-start try-home-item\">\r\n <span class=\"home-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-home\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path>\r\n <polyline points=\"9 22 9 12 15 12 15 22\"></polyline>\r\n </svg>\r\n </span>\r\n <div class=\"try-home-details\">\r\n <div class=\"try-home-header\">\r\n <span class=\"try-home-text\">Try At Home</span>\r\n <span class=\"free-text\"> (It's Free)</span>\r\n </div>\r\n <div class=\"home-appointment-text\">Home Appointment <span>Available to try from 29 Jul</span></div>\r\n <!-- <div class=\"appointment-text\">\r\n Home Appointment <span class=\"appointment-available\">Available to try from 28 Jun</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex-align-items-center justify-content-center w-100\">\r\n <button class=\"book-appointment-btn\" (click)=\"addToTrialCart()\" *ngIf=\"!isItemAddedAsTrial\">Try at\r\n HOME</button>\r\n <button class=\"book-appointment-btn\" *ngIf=\"isItemAddedAsTrial\">HOME APPOINTMENT BOOKED</button>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #StoreSection>\r\n <!-- Nearest Store Section -->\r\n <ng-container\r\n *ngIf=\"storeDetails?.nearbyStore?.storeName && storeDetails?.nearbyStore?.storeName?.length > 0;else emptyStore\">\r\n <div class=\"store-section\">\r\n <div class=\"d-flex align-items-center store-item\">\r\n <span class=\"store-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <div class=\"store-details\">\r\n <div class=\"store-text\">\r\n <span class=\"store-label\">Nearest Store - </span>\r\n <span class=\"store-name\">{{ storeDetails?.nearbyStore?.storeName | titlecase}}</span>\r\n <!-- <span class=\"store-distance\"> (4km)</span> -->\r\n </div>\r\n <!-- <div class=\"availability-section\">\r\n <span class=\"availability-badge\">\u23F0 AVAILABLE BY 28 JUN</span>\r\n </div> -->\r\n <!-- <div class=\"other-stores-text\">\r\n Also Available in <span class=\"other-stores-link\">18 other stores</span>\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center w-100\">\r\n <button class=\"find-store-btn w-100\" [appButtonEditor]=\"edit ?? false\" simpoButtonDirective\r\n [buttonStyle]=\"getButtonStyle(1)\" [buttonId]=\"getButtonId(1)\" [sectionId]=\"data?.id\"\r\n [id]=\"data?.id+getButtonId(1)\" (click)=\"onFindInStore(storeDetails?.nearbyStore?.id)\">FIND IN\r\n STORE</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #emptyStore>\r\n <div class=\"delivery-section\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"delivery-icon d-flex align-items-center\">\r\n <svg [style.color]=\"styles?.background?.accentColor\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" class=\"feather feather-shopping-bag\">\r\n <path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <path d=\"M16 10a4 4 0 0 1-8 0\"></path>\r\n </svg>\r\n </span>\r\n <span class=\"delivery-text\">No Stores are available</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-variant\" tabindex=\"-1\" id=\"offcanvasRightVariant\"\r\n aria-labelledby=\"offcanvasRightLabel\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price px-3 pb-2\">\r\n <div class=\"price-text\">Price</div>\r\n <div class=\"d-flex g-3 align-items-center\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice && responseData.price.discountedPrice > 0\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"price\"\r\n *ngIf=\"responseData?.price?.sellingPrice && getDifference(responseData?.price?.sellingPrice, responseData?.price?.discountedPrice) > 2\"\r\n [ngClass]=\"{'text-decoration-line-through': responseData?.price?.discountedPrice}\"><span\r\n [innerHTML]='currency'></span>\r\n {{responseData?.price?.sellingPrice | number:'1.0-0'}}</div>\r\n </div>\r\n </div>\r\n <div class=\"varient-container h-100 p-3\">\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div class=\"varient-data\">\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n <div *ngFor=\"let varientValue of varient.value\" class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue | titlecase}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"confirm-btn w-100 p-3 text-center cursor-pointer\" data-bs-dismiss=\"offcanvas\"\r\n [style.background]=\"data?.styles?.background?.accentColor\" style=\"color: white;\">Confirm\r\n Customization</div>\r\n</div>\r\n\r\n<ng-template #dialogBox>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header d-flex align-item-center\">\r\n <div class=\"heading-video w-100 py-2 text-center\">Live Video call at your convenience!</div>\r\n <div class=\"schedule-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon (click)=\"matCloseDialog()\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"modal-body h-100\">\r\n <div class=\"row h-100 w-100 video-call-container\">\r\n <div class=\"col-6 h-100\" *ngIf=\"!isMobile\">\r\n <img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/557699c1753779503913freepik-overhead-shot-a-person-holding-a-smartphone-with-a-1029_vmg8GqHj (online-video-cutter.com).gif\"\r\n alt=\"\" class=\"w-100 h-100\" style=\"object-fit: cover;\">\r\n </div>\r\n <div class=\"col-6 position-relative h-100 call-details\">\r\n <!-- Name Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.username\">\r\n <input type=\"text\" placeholder=\"Enter Name*\" [(ngModel)]=\"videoCallPayload.username\"\r\n (input)=\"onInputChange('username')\">\r\n </div>\r\n\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.email\">\r\n <input type=\"email\" placeholder=\"Enter Email*\" [(ngModel)]=\"videoCallPayload.email\"\r\n (input)=\"onInputChange('email')\">\r\n </div>\r\n\r\n <!-- Mobile Number Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.mobileNumber\">\r\n <div class=\"sub-text-call\">IN +91</div>\r\n <input type=\"number\" placeholder=\"Enter Mobile*\" [(ngModel)]=\"videoCallPayload.mobileNumber\"\r\n (input)=\"onInputChange('mobileNumber')\">\r\n </div>\r\n\r\n\r\n <!-- Pincode Input with Validation -->\r\n <div class=\"input-field my-3\" [class.error-border]=\"validationErrors.pincode\">\r\n <div class=\"sub-text-call d-flex justify-content-center w-12 border-0\">\r\n <mat-icon class=\"f-18 d-flex align-items-center justify-content-center\">gps_fixed</mat-icon>\r\n </div>\r\n <input type=\"number\" placeholder=\"Enter Pin Code*\" class=\"w-88\" [(ngModel)]=\"videoCallPayload.pincode\"\r\n (input)=\"onInputChange('pincode')\">\r\n </div>\r\n <div class=\"language my-3\">\r\n <div class=\"mini-text mb-2\">Language Preference</div>\r\n <div class=\"language-container d-flex gap-2 flex-wrap mt-1\">\r\n <ng-container *ngFor=\"let lang of languages\">\r\n <div class=\"lang px-2 py-1 rounded cursor-pointer\"\r\n [style.background]=\"lang == selectedLang ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectedLang = lang\"\r\n [style.color]=\"lang == selectedLang ? getTextColor(data?.styles?.background?.accentColor) : '#000000'\">\r\n {{lang}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"selectedLang == 'Others'\">\r\n <div class=\"input-field my-3\">\r\n <input type=\"text\" placeholder=\"Enter Other Language\" [(ngModel)]=\"otherLanguage\">\r\n </div>\r\n </ng-container>\r\n <button class=\"video-btn mt-2 d-flex align-items-center justify-content-center\" [disabled]=\"isSubmitting\">\r\n <ng-container *ngIf=\"isSubmitting\">\r\n <div class=\"spinner-border spinner-border-sm me-2\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n SCHEDULING...\r\n </ng-container>\r\n <ng-container *ngIf=\"!isSubmitting && !scheduled\">\r\n <div (click)=\"scheduleVideoCall()\" class=\"d-flex align-items-center\">\r\n <mat-icon>video_call</mat-icon>&nbsp;\r\n SCHEDULE A VIDEO CALL\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"scheduled\">\r\n <mat-icon>check_circle</mat-icon>&nbsp;\r\n SCHEDULED SUCCESSFULLY\r\n </ng-container>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"offcanvas offcanvas-end offcanvas-small overflow-scroll\" tabindex=\"-1\" id=\"offcanvasRightPriceBreakup\">\r\n <div class=\"varient-header d-flex align-items-center justify-content-end p-2\">\r\n <mat-icon data-bs-dismiss=\"offcanvas\"\r\n class=\"cursor-pointer d-flex align-items-center justify-content-center fs-5\">close</mat-icon>\r\n </div>\r\n <div class=\"varient-price p-10-20\">\r\n <div class=\"price-break-header\">{{responseData?.name}}</div>\r\n </div>\r\n <div class=\"price-breakup h-100 w-100\">\r\n <ng-container *ngFor=\"let ele of responseData?.materials\">\r\n <div class=\"price-container mb-3 p-10-20\">\r\n <div class=\"price-container-header\">\r\n {{ ele.materialType + \" BREAKUP\" }}\r\n </div>\r\n <div class=\"row w-100 header-row\">\r\n <div class=\"col-3 text-center\">COMPONENT</div>\r\n <div class=\"col-3 text-center\">RATE</div>\r\n <div class=\"col-3 text-center\">WEIGHT</div>\r\n <div class=\"col-3 text-center\">FINAL VALUE</div>\r\n </div>\r\n <div class=\"row w-100 value-row\">\r\n <div class=\"col-3 text-center\">{{ ele.purity | titlecase }}</div>\r\n <div class=\"col-3 text-center\">\u20B9{{ getPricePerGram(ele.pricePerUnit,ele.materialType) |\r\n number:'1.2-2' }}</div>\r\n <div class=\"col-3 text-center\">{{ele.quantity + ' ' + (ele.unit | titlecase)}}</div>\r\n <div class=\"col-3 text-center total\">\u20B9{{ ele.pricePerUnit * ele.quantity | number }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"price-container mb-3 p-10-30 py-0 border-unset\">\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Making Charges</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.makingChargeAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Tax Amount</div>\r\n <div class=\"col-6 text-end total\">\u20B9{{ responseData?.jewelryPriceBreakup?.taxAmount | number:'1.2-2' }}\r\n </div>\r\n </div>\r\n <div class=\"row w-100 summary-row\">\r\n <div class=\"col-6 text-start\">Total Amount</div>\r\n <div class=\"col-6 text-end total\">\r\n \u20B9{{(responseData?.jewelryPriceBreakup?.priceWithoutTax + responseData?.jewelryPriceBreakup?.taxAmount) |\r\n number:'1.2-2'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<ng-template #ReviewsSection>\r\n <div class=\"rv-section\" *ngIf=\"reviewsData\">\r\n\r\n <!-- Header: Title + Average | Bar Chart -->\r\n <div class=\"rv-header\">\r\n <div class=\"rv-header-left\">\r\n <h2 class=\"rv-title\">Reviews &amp; Ratings</h2>\r\n <div class=\"rv-average-row\">\r\n <!-- filled stars -->\r\n <div class=\"rv-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <span class=\"rv-avg-num\">{{responseData?.averageRating | number:'1.1-1'}}</span>\r\n <span class=\"rv-avg-label\">average</span>\r\n </div>\r\n <div class=\"rv-count\" [style.color]=\"styles?.background?.accentColor || '#10b981'\">\r\n {{responseData?.totalReviewCount | number}} Reviews\r\n </div>\r\n </div>\r\n\r\n <div class=\"rv-bars\">\r\n <ng-container *ngFor=\"let rating of [5,4,3,2,1]\">\r\n <div class=\"rv-bar-row\">\r\n <span class=\"rv-bar-label\">{{rating}}</span>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <div class=\"rv-bar-track\">\r\n <div class=\"rv-bar-fill\" [style.width.%]=\"getPercentage(rating)\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Review Cards Grid -->\r\n <div class=\"rv-grid\">\r\n <ng-container *ngFor=\"let review of reviewsData\">\r\n <ng-container *ngIf=\"review.review\">\r\n <div class=\"rv-card\">\r\n <div class=\"rv-card-top\">\r\n <div class=\"rv-reviewer\">\r\n <img [src]=\"'https://ui-avatars.com/api/?name=' + (review?.userName ?? 'U') + '&background=random'\"\r\n class=\"rv-avatar\" alt=\"\">\r\n <div class=\"rv-name-date\">\r\n <span class=\"rv-name\">{{review?.userName ?? 'Anonymous'}}</span>\r\n <span class=\"rv-date\">{{review?.createdAt | date:'d MMM y'}}</span>\r\n </div>\r\n </div>\r\n <!-- Star rating -->\r\n <div class=\"rv-card-stars\">\r\n <ng-container *ngFor=\"let s of [1,2,3,4,5]\">\r\n <svg *ngIf=\"s <= review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n <svg *ngIf=\"s > review.rating\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" style=\"opacity:0.25\">\r\n <path\r\n d=\"M13.9718 5.36453C13.9398 5.26298 13.8798 5.17252 13.7986 5.10356C13.7175 5.0346 13.6186 4.98994 13.5132 4.97472L9.37043 4.37088L7.51307 0.617955C7.46021 0.529271 7.38522 0.455834 7.29545 0.404836C7.20568 0.353838 7.1042 0.327026 7.00096 0.327026C6.89771 0.327026 6.79624 0.353838 6.70647 0.404836C6.6167 0.455834 6.54171 0.529271 6.48885 0.617955L4.63149 4.37088L0.488746 4.97472C0.383363 4.98994 0.284416 5.0346 0.203286 5.10356C0.122157 5.17252 0.0621407 5.26298 0.03014 5.36453C-0.00402286 5.46571 -0.00924428 5.57442 0.0150645 5.67841C0.0393733 5.7824 0.0922457 5.87753 0.167722 5.95308L3.17924 8.87287L2.4684 13.0003C2.45038 13.1066 2.46229 13.2158 2.50278 13.3157C2.54328 13.4156 2.61077 13.5022 2.6977 13.5659C2.78477 13.628 2.88746 13.6644 2.99416 13.6712C3.10087 13.678 3.20733 13.6547 3.30153 13.6042L7.00096 11.6551L10.708 13.6042C10.79 13.6491 10.882 13.6728 10.9755 13.673C11.0958 13.6716 11.2129 13.6343 11.3119 13.5659C11.3988 13.5022 11.4663 13.4156 11.5068 13.3157C11.5473 13.2158 11.5592 13.1066 11.5412 13.0003L10.8227 8.87287L13.8266 5.95308C13.9033 5.87835 13.9577 5.7836 13.9833 5.67957C14.009 5.57554 14.005 5.4664 13.9718 5.36453Z\"\r\n fill=\"#eab308\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <p class=\"rv-text\">{{review?.review ?? 'No comment provided.'}}</p>\r\n\r\n <!-- Review Images -->\r\n <div class=\"rv-images\" *ngIf=\"review?.reviewImages?.length\">\r\n <a *ngFor=\"let img of review.reviewImages\" [href]=\"img.imgUrl\" target=\"_blank\" class=\"rv-img-link\">\r\n <img [src]=\"img.imgUrl\" alt=\"Review image\" class=\"rv-img-thumb\" onerror=\"this.style.display='none'\">\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"text-center mt-4\" *ngIf=\"(reviewsData?.length ?? 0) > 3\">\r\n <button class=\"write-review-btn\" (click)=\"loadMoreReviews()\">Load More Reviews</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered video-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-body\" style=\"height: 100%;\">\r\n <video controls muted playsinline style=\"width: 100%; height: 100%;\">\r\n <source\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/371647c1753962084265clideo_editor_48bc93c24e18470888c661bb09e437da (online-video-cutter.com).mp4\"\r\n type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"reviewModal\" tabindex=\"-1\" aria-labelledby=\"reviewModalLabel\" role=\"dialog\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog review-modal\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h1 class=\"modal-title fs-5\"></h1>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"detail-review-container\">\r\n <div class=\"image-section\">\r\n <div class=\"product-image\">\r\n <div class=\"backward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex-1\"\r\n *ngIf=\"currentImageIndex > 0\">\u25BC</div>\r\n <img [src]=\"selectedReview?.reviewImages?.[currentImageIndex]?.imgUrl\" alt=\"\">\r\n <div class=\"forward-arrow arrow\" (click)=\"currentImageIndex = currentImageIndex+1\"\r\n *ngIf=\"currentImageIndex < selectedReview?.images?.length - 1\">\u25B2</div>\r\n <!-- <div class=\"earbuds-container\">\r\n <div class=\"charging-case\"></div>\r\n <div class=\"earbud left\"></div>\r\n <div class=\"earbud right\"></div>\r\n </div> -->\r\n </div>\r\n <!-- <div class=\"navigation-arrows\">\r\n </div> -->\r\n </div>\r\n\r\n <div class=\"review-section\">\r\n <div class=\"reviewer-header\">\r\n <div class=\"reviewer-avatar\">\uD83D\uDC64</div>\r\n <div class=\"reviewer-name\">{{selectedReview?.userName ?? \"-\"}}</div>\r\n </div>\r\n\r\n <div class=\"detail-rating\" *ngIf=\"selectedReview?.rating\">\r\n <p-rating [(ngModel)]=\"selectedReview.rating\" [cancel]=\"false\" [readonly]=\"true\"></p-rating>\r\n </div>\r\n\r\n <div class=\"review-date\">\r\n Reviewed in India on 24 July 2025\r\n </div>\r\n\r\n <div class=\"review-text\">\r\n {{selectedReview?.review ?? \"-\"}}\r\n </div>\r\n\r\n <div class=\"images-section\">\r\n <h3>Images in this review</h3>\r\n <div class=\"review-images\">\r\n <div class=\"review-image\" [ngClass]=\"{'selected': currentImageIndex == i}\"\r\n *ngFor=\"let img of selectedReview?.reviewImages ?? [];let i = index\" (click)=\"currentImageIndex = i\">\r\n <img [src]=\"img.imgUrl\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".product-desc{display:flex}::ng-deep .product-desc table,::ng-deep .brief-desc table{border-collapse:collapse;width:100%;margin:10px 0}::ng-deep .product-desc table td,::ng-deep .product-desc table th,::ng-deep .brief-desc table td,::ng-deep .brief-desc table th{border:1px solid #dddddd!important;text-align:left;padding:8px}*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}::ng-deep .smooth-panel .p-panel-header{cursor:pointer;background:transparent;border:unset;font-size:18px;font-weight:700;padding:0}::ng-deep .smooth-panel .p-panel-content{border:unset;padding:0}.jewel-container{border-radius:12px;box-shadow:#63636333 0 2px 8px}.jewel-header{padding:8px 10px;border-radius:12px 12px 0 0;font-size:15px;font-weight:700;color:#4f3267}.br-p{border-radius:0 0 12px 12px;padding:10px 0}.row-header{font-size:13px;font-weight:700;color:#4f3267}.row-content{color:#4e555e}.jewellery-table-container{border-radius:12px}.jewellery-table{width:100%;border-collapse:collapse;border:1px solid #ddd;transition:all .3s ease}.jewellery-table th,.jewellery-table td{border:1px solid #ddd;padding:12px;text-align:left;transition:background-color .2s ease}.material-header td{background-color:#f8f9fa;font-weight:700;font-size:16px}.column-header{background-color:#f1f1f1}.column-header th{font-weight:600}.material-row:hover{background-color:#f5f5f5}.charges-header th,.total-header th{background-color:#eaeaea;font-weight:700}.total-row td{font-weight:700;font-size:18px;background-color:#f8f8f8}@media screen and (max-width: 600px){.jewellery-table{font-size:14px}.jewellery-table th,.jewellery-table td{padding:8px}}.share-icon,.favourite{border-radius:50%!important;height:40px;width:40px;display:flex;align-items:center;justify-content:center;background-color:#f1f5f9!important;cursor:pointer;transition:all .2s ease;border:none!important}:is(.share-icon,.favourite) mat-icon{font-size:20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.share-icon:hover,.favourite:hover{background-color:#e2e8f0!important;transform:scale(1.05)}.header-text{font-size:17px;font-weight:bolder}.pricebreakup-btn{font-size:11px;font-weight:700;padding:8px;border-radius:8px;letter-spacing:.5px}.pricebreakup-btn mat-icon{font-size:18px;display:flex;align-items:center}.img-list{display:flex;gap:5px;max-height:460px}.img-list img{height:100px;width:100px;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:100%;aspect-ratio:1/1;overflow:hidden}.item-img img{width:100%!important;height:100%!important;object-fit:cover}.price{font-weight:600;font-size:24px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:1px solid;align-items:center;gap:15px;height:44px;width:75%;justify-content:space-between;border-radius:12px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.fc{font-size:17px;font-weight:700}.tab-group{display:flex;gap:10px}.tab{font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black;max-width:max-content}.discount-price{font-size:1.4rem}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#f7f7f7;padding:11px 20px;border-radius:12px;margin-top:unset!important;width:70%!important;border:1px solid #d3d3d347}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#f7f7f7;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:7px 25px;cursor:pointer;font-weight:600}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:5px;height:44px!important;justify-content:space-between;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:14px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.w-h-40{width:40px!important;height:40px!important}.height{height:auto;overflow-y:visible}.mobile-footer{display:none}video{border-radius:18px}@media (min-width: 1024px){.zoom:hover{transform:scale(1.2);transition:transform .2s ease-in-out;overflow:hidden}.product-heading{font-size:20px;font-weight:600;margin-top:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.product-desc{font-size:13px}.brief-desc{font-size:16px;margin-top:unset!important}.total-container{padding-top:10px!important;padding-bottom:4rem!important}.out-of-stock,.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important;height:348px}.item-img img{width:100%;height:348px!important}.display-none{display:none}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{width:25%;border:2px solid lightgray;cursor:pointer}.input-field{margin-top:.7rem!important;margin-bottom:.7rem!important}.prod-desc{margin-top:20px}.video-call-container{margin:0!important}.product-img{height:220px}.call-details{width:100%!important;padding:3%!important}.send-btn{padding:.5rem 1rem!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%;height:auto}.product-heading{font-size:23px;font-weight:600}.discount-price{font-size:1.7rem!important}.header-text{font-size:20px!important}}.send-btn{font-size:14px!important;padding:1rem;display:flex;align-items:center;justify-content:center;text-transform:uppercase;font-weight:600}.send-btn mat-icon{height:20px;width:20px;font-size:18px}a{text-decoration:none}.brief-desc{font-size:14px;color:#4e555e}.total-container{height:auto;position:relative;display:block!important;overflow:visible}.hover_effect{position:unset;width:100%;top:0;left:0;height:100%;margin:unset!important}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}}@media (min-width:1024px){.product-headig{font-size:35px}}.mat-accordion .mat-expansion-panel:last-of-type{box-shadow:none}@media (min-width: 1400px){.container{max-width:unset;width:95%;height:100vh;overflow-y:auto}}.width-max{width:max-content}.fw-600{font-weight:600}.cursor-pointer{cursor:pointer}.offcanvas-variant{border-radius:30px 0 0 30px}.varient-header,.varient-price{background:#f7f7f7}.varient-header{border-radius:30px 0 0}.confirm-btn{border-radius:0 0 0 30px;position:absolute!important;bottom:0!important}.style2-container{border:1px solid;border-radius:12px;margin:0}.varient-item{border-right:1px solid;align-content:center}.variant-head{font-size:12px;color:#33363e}.varient-data{margin-bottom:25px;border-bottom:1px solid black;padding-bottom:25px}.variant-value{font-size:.9rem;color:#000}.custom-text{border-radius:0 8px 8px 0;font-size:.9rem;font-weight:600}.scroll-wrap{flex-wrap:nowrap}.brand-text{word-wrap:break-word;white-space:normal;font-size:12px;font-weight:600;line-height:20px}.video-container{border:1px solid rgb(240,240,240);margin:10px 0;border-radius:12px}.video-head-text{font-size:16px;font-weight:700}.sub-text{font-size:11px;color:#6f7377;margin-bottom:10px}.sch-btn{font-size:1.2rem!important;color:#fff;padding:3px 0;margin-top:5px}.tax-text{font-size:.7rem;color:#6f7377}.modal-content{border-radius:18px!important}.heading-video{font-size:17px;font-weight:600}.heading-video,.schedule-header{background:#f6f3f9}.input-field{display:flex;border-radius:12px;padding:12px;font-size:13px;background:#f6f3f9}.input-field .sub-text-call{width:20%;text-align:center;align-content:center;border-right:1px solid #bfbfbf;color:#0000008a;font-weight:700}.input-field input{width:80%;border:none;outline:none;appearance:none;margin-left:5px;background:#f6f3f9}.delivery-container{margin:35px 0 15px;background-color:transparent}.delivery-title{font-size:16px;font-weight:600;margin:0 0 12px;line-height:1.2;margin-bottom:.5rem!important}.location-container{border:1px solid #cfcfcf;border-radius:12px;padding:10px;margin-bottom:5px;width:100%}.location-icon{width:20px;height:20px;background-color:#374151;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.location-icon:before{content:\"\";width:8px;height:8px;background-color:#fff;border-radius:50%;position:absolute}.postal-code-input{font-size:12px;font-weight:600;letter-spacing:.5px;border:none;outline:none;background:transparent;width:90%}.postal-code-input::placeholder{font-weight:500}.locate-btn{background:none!important;border:none!important;font-weight:600;color:#111827;font-size:13px!important;padding:0!important;box-shadow:none!important;width:auto!important;white-space:nowrap}.gps{font-size:17px}.locate-btn:focus{box-shadow:none!important}.delivery-section{margin-bottom:15px;border:1px solid rgb(240,240,240);padding:10px;border-radius:12px}.delivery-icon{font-size:18px;color:#ec4899;margin-right:14px;width:20px}.delivery-text{font-size:14px;font-weight:700}.store-section{border:1px solid rgb(240,240,240);padding:10px;border-radius:12px;margin-bottom:15px}.store-item{margin-bottom:11px}.store-icon{font-size:18px;color:#f97316;margin-right:14px;margin-top:2px;width:20px}.store-details{flex:1}.store-text{font-size:14px}.store-name{font-weight:700}.availability-section{margin-bottom:6px}.availability-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:#d97706;background-color:#fef3c7;padding:4px 8px;border-radius:12px;letter-spacing:.5px}.other-stores-text{font-size:14px;color:#6b7280;line-height:1.4}.other-stores-link{color:#6b46c1;cursor:pointer;text-decoration:underline}.other-stores-link:hover{color:#553c9a}.find-store-btn{width:100%!important;padding:8px 20px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px}.try-home-section{border-radius:12px;padding:10px;border:1px solid rgb(240,240,240)}.try-home-item{margin-bottom:10px;padding:0}.home-icon{font-size:18px;color:#6b46c1;margin-right:14px;margin-top:2px;width:20px}.try-home-details{flex:1}.try-home-text{font-size:14px;font-weight:700;color:#374151}.free-text{font-size:14px;color:#6b7280}.appointment-text{font-size:14px;color:#6b7280;line-height:1.4}.appointment-available{font-weight:500;color:#374151}.book-appointment-btn{background:#111827;color:#fff;border:none;padding:10px 20px;border-radius:12px;font-weight:600;font-size:14px!important;cursor:pointer;letter-spacing:.5px;transition:all .2s ease;width:100%}.book-appointment-btn:hover{background:#000;transform:translateY(-1px);box-shadow:0 4px 8px #0000001a}@media (max-width: 480px){.container{display:flex;align-items:center;flex-direction:column}.location-section{padding:12px 0}.try-home-section{padding:20px}}.w-90{width:90%}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.w-12{width:12%!important}.w-88{width:88%!important}.video-btn{border:unset;padding:8px;border-radius:12px;font-weight:600;color:#fff;background:#05a702;position:absolute;bottom:20px;left:10px;width:95%!important}.mini-text{font-size:13px}.lang{font-size:12px;align-content:center;background:#f6f3f9}.error-border{border:2px solid #dc3545!important}.offcanvas-small{height:72vh;top:25%;width:35%;border-radius:50px 0 0 50px}.rating{width:max-content;border:1px solid;border-radius:20px;padding:0 10px;margin-bottom:.5rem}.rating-no{padding-right:7px;margin:0;border-right:1px solid;font-size:.75rem}.p-10-20{padding:10px 30px}.price-break-header{font-size:19px;font-weight:600}.price-container{border-bottom:1px solid rgb(233,233,233)}.price-container-header{font-size:14px;font-weight:600;color:#333}.total-ratings{font-size:.75rem}.header-row .col-3{font-size:12px;font-weight:500;color:#666}.value-row .col-3{font-size:14px;font-weight:400;color:#333}.value-row .col-3.total{font-weight:600}.summary-row .col-6{font-size:15px;font-weight:500;color:#333;padding:unset}.summary-row .col-6.total{font-weight:600;padding-right:10px}.summary-row{padding:0 42px}.error-border{border:2px solid #e74c3c!important;box-shadow:0 0 5px #e74c3c4d!important}.form-control,.input-field input{transition:border-color .3s ease,box-shadow .3s ease}.error-border:focus{border-color:#e74c3c!important;box-shadow:0 0 8px #e74c3c80!important}.input-field input:focus{transform:scale(1.02)}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:-.125em;border:.125em solid currentcolor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:.875rem;height:.875rem;border-width:.125em}@keyframes spinner-border{to{transform:rotate(360deg)}}.video-btn:disabled{opacity:.7;cursor:not-allowed}.video-btn:disabled:hover{cursor:not-allowed}.rv-section{padding:2rem 0;background:transparent}.rv-header{display:flex;justify-content:space-between;align-items:flex-start;gap:3rem}.rv-header-left{flex:1}.rv-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:.75rem}.rv-average-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.rv-stars{display:flex;gap:2px}.rv-avg-num{font-size:1.4rem;font-weight:700;color:#111827}.rv-avg-label{font-size:.95rem;color:#6b7280;font-weight:400}.rv-count{font-size:.9rem;font-weight:600}.rv-bars{flex:1;max-width:420px;display:flex;flex-direction:column;gap:6px}.rv-bar-row{display:flex;align-items:center;gap:3px}.rv-bar-label{font-size:15px;font-weight:600;color:#111827;width:10px;text-align:right;flex-shrink:0}.rv-bar-track{flex:1;height:10px;background-color:#f3f4f6;border-radius:3px;overflow:hidden}.rv-bar-fill{height:100%;background-color:#eab308;border-radius:3px}.rv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}.rv-card{padding:12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff}.rv-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:.85rem}.rv-reviewer{display:flex;align-items:center;gap:.7rem}.rv-avatar{width:38px;height:38px;border-radius:50%;object-fit:cover;flex-shrink:0}.rv-name-date{display:flex;flex-direction:column;gap:2px}.rv-name{font-size:16px;font-weight:600;color:#374151}.rv-date{font-size:.75rem;color:#9ca3af}.rv-card-stars{display:flex;gap:2px;flex-shrink:0}.rv-text{font-size:.88rem;line-height:1.65;color:#4b5563;margin:0}.rv-images{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.rv-img-link{display:block;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid #e5e7eb}.rv-img-thumb{width:72px;height:72px;object-fit:cover;display:block;transition:transform .2s ease}.rv-img-link:hover .rv-img-thumb{transform:scale(1.05)}@media (max-width: 768px){.rv-header{flex-direction:column;gap:1.5rem}.rv-bars{max-width:100%}.rv-grid{grid-template-columns:1fr}}.review-section{padding:4rem 1rem;border-top:1px solid #f3f4f6;margin-top:4rem;background:transparent!important}.review-summary-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4rem;gap:3rem}.rating-summary-left{flex:1}.rating-summary-left h2.reviews-header-title{font-size:1.75rem;font-weight:700;margin-bottom:0;color:#111827}.average-score-container{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem}.average-score{color:#111827;display:flex;align-items:baseline;gap:8px}.average-score .score-num{font-size:1.5rem;font-weight:700}.average-score .score-text{font-size:1.1rem;font-weight:400;color:#111827}.total-reviews-count{font-weight:600;font-size:1.1rem;display:block}.rating-distribution{flex:1;max-width:480px}.rating-bar-row{display:flex;align-items:center;gap:1.25rem;margin-bottom:.85rem}.star-label{display:flex;align-items:center;justify-content:flex-start;width:35px;line-height:1}.progress-bar-bg{flex:1;height:12px;background-color:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-bar-fill{height:100%;background-color:#eab308;border-radius:9999px}.review-actions-bar-minimal{display:flex;justify-content:space-between;align-items:center;margin-bottom:2rem}.write-review-btn-minimal{padding:.6rem 1.25rem;background:#f8f9fa;color:#4b5563;border:none;border-radius:8px;font-weight:500;font-size:.9rem;cursor:pointer;transition:all .2s}.write-review-btn-minimal:hover{background:#e5e7eb}.sort-dropdown-minimal select{padding:.6rem 2.25rem .6rem 1rem;border:1px solid #d1d5db;border-radius:8px;background:#fff;font-size:.9rem;color:#4b5563;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%236b7280'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right .75rem center;background-size:1rem;cursor:pointer}.reviews-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.review-card{padding:1.5rem;border:1px solid #e5e7eb;border-radius:12px;background:#fff;box-shadow:none}.review-divider{margin:2rem 0;border:none;border-top:1px solid #f3f4f6}.reviews-header-title{font-size:1.4rem;font-weight:700;color:#111827;margin-bottom:0}.review-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.25rem}.reviewer-info{display:flex;align-items:center;gap:1rem}.reviewer-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#f3f4f6}.reviewer-name{font-weight:600;font-size:.95rem;color:#374151}.review-date-text{font-size:.8rem;color:#9ca3af}.reviewer-name-date{display:flex;flex-direction:row;align-items:center;gap:8px}.review-card-rating{display:flex;gap:2px}.review-card-text{font-size:1rem;line-height:1.7;color:#4b5563}.product-tabs-container{border-bottom:1px solid #f3f4f6;margin-bottom:8px}.tab-item{padding:1rem 0;font-weight:600;font-size:1.1rem;color:#6b7280;cursor:pointer;position:relative;transition:color .2s}.tab-content-pane h3{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem}.tab-content-pane p{color:#4b5563;line-height:1.8;font-size:1.05rem}@media (max-width: 1024px){.reviews-grid{grid-template-columns:1fr}}@media (max-width: 768px){.review-summary-header{flex-direction:column;gap:2rem}.rating-distribution{max-width:100%}.bento-grid{height:auto;display:flex;flex-direction:column}.tabs-list{gap:1.5rem;overflow-x:auto}}.home-appointment-text{font-size:.8rem;color:#4e555e}.home-appointment-text span{font-weight:600}.video-call-img{height:120px;margin:0;padding:0;border-radius:45px}.video-call-img img{border-top-left-radius:12px;border-bottom-left-radius:12px}.discount{background:#fff3f2;padding:15px 15px 20px;margin-top:14px;border-radius:8px;display:flex;flex-direction:column;gap:5px;position:relative}.discount p{margin-bottom:0;color:#4f3267;font-weight:700;font-size:1rem}.discount .offer{color:#eb4f5c}.discount:before{content:\"\";display:block;height:44px;width:4px;background:#eb4f5c;position:absolute;left:0;top:16px;border-top-right-radius:20px;border-bottom-right-radius:20px}.metal-purity{display:flex;flex-direction:column;gap:10px}.scrollable-content{height:100%;max-height:95vh;overflow-y:auto}.style-2-img{max-height:70%;height:100%!important}.ring-size-video{background:#f0ebff;display:flex;justify-content:space-between;align-items:center;height:45px;padding:12px;border-radius:10px;margin-top:20px;margin-bottom:20px}.ring-size-video .text{color:#4f3267;font-size:.9rem}.ring-size-video .learn-how{color:#de57e9;font-weight:700;font-size:1rem;display:flex;gap:5px;align-items:center;cursor:pointer}.ring-size-video .learn-how mat-icon{font-size:20px;display:flex;align-items:center}.ring-size-video p{margin-bottom:0}.video-modal{height:90vh!important;width:90vw!important;max-width:none}.video-modal .modal-body{padding:0}.review-section{border-radius:10px;padding:15px}.review-img{display:flex;gap:10px;margin-top:10px}.review-img img{max-width:100px;max-height:140px}.detail-review-container{display:flex;max-width:1200px;margin:0 auto;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 10px #0000001a}.image-section{flex:1;background:#000;position:relative;min-height:400px}.product-image{width:100%;height:100%;object-fit:cover;background:linear-gradient(135deg,#e8e8e8,#d0d0d0);display:flex;align-items:center;justify-content:center;max-height:400px;position:relative}.product-image img{height:100%;width:100%;object-fit:contain}.earbuds-container{position:relative;width:300px;height:200px}.charging-case{width:200px;height:120px;background:linear-gradient(145deg,#f0f0f0,#e0e0e0);border-radius:25px;position:absolute;top:40px;left:50px;box-shadow:inset 0 4px 8px #0000001a}.charging-case:before{content:\"\";position:absolute;inset:10px;background:linear-gradient(145deg,#e8e8e8,#d8d8d8);border-radius:15px;box-shadow:inset 0 2px 4px #0000001a}.earbud{position:absolute;width:45px;height:15px;background:linear-gradient(145deg,#2a2a2a,#1a1a1a);border-radius:8px;box-shadow:0 2px 4px #0003}.earbud:before{content:\"noise\";position:absolute;top:2px;left:50%;transform:translate(-50%);font-size:6px;color:#888;font-weight:300}.earbud.left{top:70px;left:80px}.earbud.right{top:90px;left:130px}.earbud.right:before{color:#ff6b35}.review-section{flex:1;padding:30px;background:#fafafa}.reviewer-header{display:flex;align-items:center;margin-bottom:15px}.reviewer-avatar{width:40px;height:40px;background:#ccc;border-radius:50%;margin-right:12px;display:flex;align-items:center;justify-content:center;font-size:18px;color:#666}.reviewer-name{font-size:16px;font-weight:500;color:#333}.detail-rating{margin:10px 0}.stars{display:flex;gap:2px;margin-bottom:5px}.star{color:#ff9500;font-size:18px}.thumbs{display:flex;gap:5px}.thumb{color:#ff9500;font-size:16px}.review-date{font-size:14px;color:#666;margin:15px 0}.review-text{font-size:16px;line-height:1.5;color:#333;margin-bottom:25px}.images-section h3{font-size:16px;color:#666;margin-bottom:15px;font-weight:500}.review-images{display:flex;gap:10px}.review-image{width:60px;height:60px;background:#ddd;border-radius:6px;border:2px solid #e0e0e0;cursor:pointer;transition:border-color .3s}.review-image img{width:100%;height:100%}.review-image:hover,.review-image.selected{border-color:#007185}.navigation-arrows{position:absolute;top:20px;right:20px;display:flex;flex-direction:column;gap:10px}.arrow{width:40px;height:40px;background:#fffc;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;color:#666;transition:background-color .3s;position:absolute;transform:rotate(90deg)}.backward-arrow{left:10px}.forward-arrow{right:10px}.arrow:hover{background:#fff}@media (max-width: 768px){.review-container{flex-direction:column}.image-section{min-height:300px}.review-section{padding:20px}}.review-modal{max-width:none;width:70vw}.review-modal .modal-body{padding:0}@media screen and (max-width: 475px){.offcanvas-small{height:100vh;width:100%;top:0}.review-modal{margin:0;height:100%;width:100%}.detail-review-container{flex-direction:column;height:100%}.product-image{max-height:289px}.image-section{min-height:289px}.video-modal{margin:0;height:100vh!important;width:100vw!important;overflow:hidden}}.modal{z-index:100000033}.breadcrumbs-modern{font-size:.85rem;color:#6b7280;margin-bottom:.5rem}.breadcrumb-item.active{color:#111827;font-weight:500}.product-title-modern{font-size:2rem;font-weight:800;color:#111827;margin:0;line-height:1.2;font-family:var(--website-font-family)}.product-price-modern{font-size:1.75rem;font-weight:700;color:#111827;font-family:var(--website-font-family)}.rating-line-modern{margin-top:.25rem}.rating-score-text{font-weight:700;font-size:1rem;color:#111827}.rating-count-text{font-size:.95rem;color:#10b981;font-weight:600;cursor:pointer}.product-description-brief{font-size:1rem;line-height:1.7;color:#4b5563;margin-top:1.5rem}.low-stock-text{color:#dc2626;font-weight:700;font-size:.875rem}.variants-modern-container{margin:2.5rem 0}.varient-key{font-size:.9rem;font-weight:800;color:#111827;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.75rem}.color-swatch-modern{width:36px;height:36px;border-radius:50%;cursor:pointer;border:3px solid white;box-shadow:0 0 0 1px #e5e7eb;transition:all .25s cubic-bezier(.4,0,.2,1)}.color-swatch-modern:hover{transform:scale(1.15)}.color-swatch-modern.active{box-shadow:0 0 0 2px #111827}.box-varient-modern{padding:.75rem 1.5rem;border:2px solid #f3f4f6;border-radius:10px;font-size:.95rem;font-weight:700;color:#374151;cursor:pointer;transition:all .2s;min-width:70px;text-align:center;background:#fff}.box-varient-modern:hover{border-color:#d1d5db;background:#f9fafb}.box-varient-modern.active{border-color:#111827;background:#111827;color:#fff}.quantity-container{margin-top:1rem}.quantity-selector-modern{border:1px solid #e5e7eb;border-radius:12px;width:fit-content;background:#f9fafb;padding:2px}.qty-btn{width:44px;height:44px;border:none;background:transparent;font-size:1.5rem;color:#111827;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;border-radius:10px}.qty-btn:hover:not(:disabled){background:#fff;box-shadow:0 2px 4px #0000000d}.qty-btn:disabled{color:#d1d5db;cursor:not-allowed}.qty-display{width:50px;text-align:center;font-weight:700;color:#111827;font-size:1.1rem}.out-of-stock-modern{background:#f3f4f6;color:#9ca3af;padding:1.1rem 2.5rem;border:none;border-radius:14px;font-weight:800;font-size:1.1rem;cursor:not-allowed}.wishlist-btn-modern{width:56px;height:56px;border:2px solid #f3f4f6;border-radius:14px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background:#fff}.wishlist-btn-modern:hover{background:#fef2f2;border-color:#fecaca}.wishlist-btn-modern mat-icon{font-size:26px}.total-container,.thumbnail-column{padding-right:15px!important}.thumbnail-list::-webkit-scrollbar{display:none}.thumbnail-list{-ms-overflow-style:none;scrollbar-width:none}.image-section-modern{padding-right:2.5rem!important;padding-left:0!important;width:60%!important;max-width:60%!important;flex:0 0 60%!important;margin-top:0!important}.detail-section-modern{padding-left:.5rem!important;padding-right:0!important;width:40%!important;max-width:40%!important;flex:0 0 40%!important;margin-top:0!important}.thumbnail-column{width:90px!important;flex:0 0 90px!important}.item-img{width:100%!important;max-width:600px;margin:0 auto;border-radius:20px;overflow:hidden;background:#f9fafb;position:relative}lib-ngx-image-zoom{width:100%!important;display:block!important}::ng-deep .ngx-image-zoom-container{width:100%!important;height:auto!important;aspect-ratio:1/1}.bento-grid{display:grid;grid-template-columns:2fr 1fr;grid-template-rows:1fr 1fr;gap:15px;width:100%;aspect-ratio:5/4}.bento-item-large{grid-row:span 2;border-radius:24px;overflow:hidden}.bento-item-small{border-radius:20px;overflow:hidden}.bento-grid img{width:100%;height:100%;object-fit:cover;transition:transform .4s ease}.bento-grid img:hover{transform:scale(1.05)}@media (max-width: 991px){.image-section-modern,.detail-section-modern{width:100%!important;max-width:100%!important;flex:0 0 100%!important;padding:0!important}.bento-grid{grid-template-columns:1fr;grid-template-rows:auto;aspect-ratio:auto}.bento-item-large{grid-row:span 1}}.bento-masonry-container{display:block;column-count:2;column-gap:20px;width:100%}.bento-item-modern{break-inside:avoid;margin-bottom:20px;border-radius:24px;overflow:hidden;background:#fdfdfd;transition:all .4s cubic-bezier(.4,0,.2,1)}.bento-item-modern.featured{margin-bottom:25px;border-radius:28px}.bento-img-modern{width:100%;height:auto;max-height:500px;display:block;object-fit:cover;background:#fdfdfd;cursor:pointer;transition:transform .6s ease}.bento-item-modern:hover{transform:translateY(-5px);box-shadow:0 12px 30px #00000014}.bento-item-modern:hover .bento-img-modern{transform:scale(1.03)}.detail-section-modern{position:sticky;top:0;height:max-content;max-height:calc(100vh - 100px);overflow-y:auto;overflow-x:hidden;padding-left:2rem!important;scrollbar-width:none}.detail-section-modern::-webkit-scrollbar{display:none}.product-hero-card-modern{border:none;box-shadow:none;z-index:10;position:relative}.tabs-list{display:flex;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin-bottom:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.tabs-list::-webkit-scrollbar{display:none}.tab-item{font-size:1rem;font-weight:600;color:#6b7280;padding:.5rem 1rem;border-radius:0;cursor:pointer;transition:all .25s;background:transparent;border-bottom:2px solid transparent;white-space:nowrap;flex-shrink:0}.tab-item:hover{background:transparent;color:#111827}.tab-content-pane{padding-top:.5rem}@media (max-width: 1024px){.product-hero-card-modern{padding:25px}.tab-content-pane{width:100%}}@media (max-width: 991px){.bento-masonry-container{column-count:1}.product-hero-card-modern{position:static;padding:0;box-shadow:none;border:none;background:transparent;z-index:auto}.detail-section-modern{padding-left:0!important;margin-top:2rem;position:static!important;max-height:none!important;height:auto!important;overflow-y:visible!important;overflow-x:visible!important}.image-section-modern{padding-right:0!important}.tab-item{padding:.6rem 1rem;font-size:.95rem}.product-tabs-container{padding:0 4px}}.product-info-minimal{display:flex;flex-direction:column;gap:1rem}.breadcrumbs-modern{display:flex;align-items:center;gap:8px;font-size:.95rem;color:#6b7280;font-weight:500}.breadcrumbs-modern .dot{font-size:1.2rem;line-height:1}.title-price-row-modern{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.product-title-modern{font-size:1.5rem;font-weight:800;color:#111827;margin:0;line-height:1.2}.product-price-modern{font-size:1.5rem;font-weight:500;color:#111827;white-space:nowrap}.rating-row-modern{display:flex;align-items:center;gap:12px;font-size:1rem;flex-wrap:wrap}.rating-score{font-weight:700;color:#111827}.separator{color:#e5e7eb}.reviews-link{font-weight:600}::ng-deep .rating-row-modern p-rating .p-rating-icon.p-rating-icon-active svg,::ng-deep .rating-row-modern p-rating .p-icon{color:#eab308!important;fill:#eab308!important}::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) svg,::ng-deep .rating-row-modern p-rating .p-rating-icon:not(.p-rating-icon-active) .p-icon{color:#eab308!important;fill:#eab308!important;opacity:.25}.product-brief-modern{font-size:.95rem;line-height:1.7;color:#4b5563;margin-top:.5rem;text-align:justify}.write-review-btn{display:inline-flex;align-items:center;justify-content:center;padding:.65rem 1.75rem;background:#f8f9fa;color:#374151;border:1px solid #e5e7eb;border-radius:10px;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s ease;letter-spacing:.02em}.write-review-btn:hover{background:#f1f3f5;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 8px #00000012}@media (max-width: 991px){.product-title-modern,.product-price-modern{font-size:1.3rem}}@media (max-width: 480px){.title-price-row-modern{flex-direction:column;gap:4px}.product-title-modern{font-size:1.2rem}.product-price-modern{font-size:1.2rem;white-space:normal}.rv-section{padding:1rem 0}.rv-header{gap:1rem}.rv-title{font-size:1.15rem;margin-bottom:.5rem}.rv-avg-num{font-size:1.15rem}.rv-bars{max-width:100%;width:100%}.rv-grid{grid-template-columns:1fr;gap:.75rem}.rv-card{padding:10px}.rv-name{font-size:14px}.tabs-list{gap:0}.tab-item{padding:.55rem 1rem;font-size:.9rem}.header-text{font-size:15px!important}.product-header{flex-wrap:wrap;gap:8px}.pricebreakup-btn{font-size:10px;padding:6px}.write-review-btn{width:100%;padding:.65rem 1rem}}\n"] }]
953
953
  }], ctorParameters: () => [{ type: Object, decorators: [{
954
954
  type: Inject,
955
955
  args: [PLATFORM_ID]
@@ -986,4 +986,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
986
986
  type: HostListener,
987
987
  args: ["window: resize", ["$event"]]
988
988
  }] } });
989
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBMEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxxQkFBcUIsRUFBbUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXpGLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU1qRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQs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WCxtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQiwwQkFBMEI7d0JBQzFCLGdCQUFnQjt3QkFDaEIsdUJBQXVCO3FCQUN4QixhQUNVLENBQUMsY0FBYyxDQUFDOzswQkFrQ3hCLE1BQU07MkJBQUMsV0FBVztnWUE3QmtDLGVBQWU7c0JBQXJFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUUzQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0EsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBRWpCLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQWdXTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgUExBVEZPUk1fSUQsIFJlbmRlcmVyMiwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9kdWN0RGVzY01vZGFsLCBQcm9kdWN0RGVzY1N0eWxlc01vZGFsIH0gZnJvbSAnLi9wcm9kdWN0LWRlc2MubW9kYWwnO1xyXG5pbXBvcnQgeyBjaGVja0l0ZW1BbHJlYWR5QWRkZWQsIEl0ZW1JbWFnZSwgSXRlbVZhcmlhbnQsIFByb2R1Y3QgfSBmcm9tICcuLi8uLi9zdHlsZXMvcHJvZHVjdC5tb2RhbCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1kaXJlY3RpdmUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZE1vZGVsLCBCdXR0b25Nb2RlbCwgTGF5T3V0TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xyXG5pbXBvcnQgQmFzZVNlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc2VjdGlvbnMvQmFzZVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTmd4SW1hZ2Vab29tTW9kdWxlIH0gZnJvbSAnbmd4LWltYWdlLXpvb20nO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RzQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RNb2RhbCB9IGZyb20gJy4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLm1vZGFsJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vLi4vc3R5bGVzL09yZGVyZWRJdGVtcy5tb2RhbCc7XHJcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBJdGVtVmFyaWVudENvbXBvbmVudCB9IGZyb20gJy4uL2l0ZW0tdmFyaWVudC9pdGVtLXZhcmllbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcclxuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNpbXBvV3JhcENvbW50YWluZXIgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvd3JhcC1jb250YWluZXJzLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNvY2lhSWNvbnNDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9zb2NpYS1pY29ucy9zb2NpYS1pY29ucy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSYXRpbmdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhdGluZyc7XHJcbmltcG9ydCB7IFJldmlldyB9IGZyb20gJy4uLy4uL3N0eWxlcy9yZXZpZXcubW9kYWwnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vc3R5bGVzL3VzZXIubW9kYWwnO1xyXG5pbXBvcnQgeyBTcGVlZERpYWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NwZWVkZGlhbCc7XHJcbmltcG9ydCB7IEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VjdGlvbnMvY3VzdG9tZXItcmV2aWV3L2N1c3RvbWVyLXJldmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYW5lbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcGFuZWwnO1xyXG5pbXBvcnQgeyBTdmdEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc3ZnLWRpdmlkZXIvc3ZnLWRpdmlkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29ybmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2Nvcm5lci1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCdXR0b25FZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWVkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9zcGFjaW5nLWhvcml6b250YWwuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2FuaXRpemVIdG1sUGlwZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Nhbml0aXplSHRtbCc7XHJcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE5neFNrZWxldG9uTG9hZGVyTW9kdWxlIH0gZnJvbSAnbmd4LXNrZWxldG9uLWxvYWRlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtZGVzYycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIENvbG9yRGlyZWN0aXZlLFxyXG4gICAgLy9ESVJFQ1RJVkVcclxuICAgIFNpbXBvV3JhcENvbW50YWluZXIsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlLFxyXG4gICAgQW5pbWF0aW9uRGlyZWN0aXZlLFxyXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgTmd4SW1hZ2Vab29tTW9kdWxlLFxyXG4gICAgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCxcclxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxyXG4gICAgU29jaWFJY29uc0NvbXBvbmVudCxcclxuICAgIFJhdGluZ01vZHVsZSxcclxuICAgIFNwZWVkRGlhbE1vZHVsZSxcclxuICAgIFRvYXN0TW9kdWxlLFxyXG4gICAgQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsXHJcbiAgICBQYW5lbE1vZHVsZSxcclxuICAgIFN2Z0RpdmlkZXJDb21wb25lbnQsXHJcbiAgICBDb3JuZXJEaXJlY3RpdmUsXHJcbiAgICBCdXR0b25FZGl0b3JEaXJlY3RpdmUsXHJcbiAgICBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSxcclxuICAgIFNhbml0aXplSHRtbFBpcGUsXHJcbiAgICBOZ3hTa2VsZXRvbkxvYWRlck1vZHVsZVxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXNjQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24ge1xyXG4gIEBWaWV3Q2hpbGQoQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSByZXZpZXdDb21wb25lbnQhOiBDdXN0b21lclJldmlld0NvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYWJvdmVIZWlnaHQnKSBhYm92ZUhlaWdodCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlU2VjdGlvbicpIGltYWdlU2VjdGlvbiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2RldGFpbFNlY3Rpb24nKSBkZXRhaWxTZWN0aW9uITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0RGVzY01vZGFsO1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YSE6IFByb2R1Y3Q7XHJcbiAgQElucHV0KCkgaW5kZXg/OiBudW1iZXI7XHJcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjdXN0b21DbGFzcz86IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgbmV4dENvbXBvbmVudENvbG9yPzogQmFja2dyb3VuZE1vZGVsO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmZWF0dXJlUHJvZHVjdERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIHJlY2VudFZpZXdlZERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIHZhcmllbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XHJcbiAgcHVibGljIHNlbGVjdGVkVmFyaWVudDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG4gIHB1YmxpYyByZWxhdGVkUHJvZHVjdERhdGE6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIHB1YmxpYyBwcm9kdWN0UmV2aWV3OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyB0b3RhbFJldmlldzogbnVtYmVyID0gNTtcclxuICBwdWJsaWMgc2hvd1JldmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFJldmlldzogYW55O1xyXG4gIHB1YmxpYyBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YVRhZ1NlcnZpY2U6IE1ldGEsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU2VydmljZTogVGl0bGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldCxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICBzdXBlcigpXHJcblxyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFwiVGVzdGluZ1wiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp0aXRsZVwiLCBjb250ZW50OiBcIlRpdGxlXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOmltYWdlXCIsIGNvbnRlbnQ6IFwiaHR0cHM6Ly9kZXYtYmVlb3MuczMuYW1hem9uYXdzLmNvbS9saWJyYXJ5LW1lZGlhLzg0ODcyOGMxNzI2MDg2MDA5NjU2aW1hZ2VzLnBuZ1wiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzpkZXNjcmlwdGlvblwiLCBjb250ZW50OiBcIkRlc2NyaXB0aW9uXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnNpdGVfbmFtZVwiLCBjb250ZW50OiBcIm5hdHVyYWxzXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnR5cGVcIiwgY29udGVudDogXCJ3ZWJzaXRlXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnVybFwiLCBjb250ZW50OiBcImh0dHBzOi8vbmF0dXJhbHMuZGV2LnNpbXBvLmFpL1wiIH0pO1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGJ1dHRvbklkPzogc3RyaW5nO1xyXG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsXHJcbiAgc3R5bGVzPzogUHJvZHVjdERlc2NTdHlsZXNNb2RhbDtcclxuICBzdWJJbmR1c3RyeU5hbWU6IHN0cmluZyA9ICcnXHJcbiAgaXNJdGVtQXNGYXZvcml0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSXRlbUFkZGVkQXNUcmlhbDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBpdGVtSW1hZ2VzOiBJdGVtSW1hZ2VbXSA9IFtdO1xyXG4gIGl0ZW1zOiBNZW51SXRlbVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgYnVzaW5lc3NEZXRhaWxzOiBhbnk7XHJcbiAgdHJpYWxDYXJ0SXRlbTogYW55W10gPSBbXVxyXG5cclxuICBpc1BpbkNvZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHRvU2hvd0luSmV3ZWxsZXJ5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNFY29tbWVyY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdEZXRhaWxzJztcclxuXHJcbiAgY2hhbmdlVGFiKHRhYjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLmJ1c2luZXNzRGV0YWlscyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiRGV0YWlscycpXHJcbiAgICAvLyBpZih0aGlzLmJ1c2luZXNzRGV0YWlscyAhPSBudWxsKSB7XHJcbiAgICAvLyAgIHRoaXMuYnVzaW5lc3NEZXRhaWxzID0gSlNPTi5wYXJzZSh0aGlzLmJ1c2luZXNzRGV0YWlscyk7XHJcbiAgICAvLyAgIHRoaXMuc3ViSW5kdXN0cnlOYW1lID0gdGhpcy5idXNpbmVzc0RldGFpbHMuc3ViSW5kdXN0cnlOYW1lO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdjYXJhdGxhbmUnKSB8fCB3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdvcnJhJykpIHtcclxuICAgICAgdGhpcy50b1Nob3dJbkpld2VsbGVyeSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRFY29tbWVyY2VDb25maWdzKCk7XHJcbiAgICB0aGlzLnN1YkluZHVzdHJ5TmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdWJJbmR1c3RyeU5hbWUnKSA/PyBcIlwiO1xyXG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcclxuICAgIHRoaXMucmVjZW50Vmlld2VkRGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEsIHRydWUpO1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlcyAmJiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlc1swXSAmJiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlc1swXT8uaW1nVXJsKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmwgPz8gXCJcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1swXTtcclxuICAgIHRoaXMuYnV0dG9uSWQgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmlkIDogJycpICsgKHRoaXMuYnV0dG9uID8gdGhpcy5idXR0b24uaWQgOiAnJyk7XHJcblxyXG4gICAgdGhpcy5waW5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BpbmNvZGUnKTtcclxuICAgIGlmICh0aGlzLnBpbmNvZGUpIHtcclxuICAgICAgdGhpcy5nZXRTdG9yZURldGFpbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgIC8vIHtcclxuICAgICAgLy8gICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXHJcbiAgICAgIC8vICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvd2lzaGxpc3QnXSk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlUHJvZHVjdCgpO1xyXG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICAgICAgLy8gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnQ29waWVkJywgZGV0YWlsOiAnWW91IGNhbiBzaGFyZSB0aGUgdXJsJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5Jc0Vjb21tZXJjZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwid2Vic2l0ZVR5cGVcIikgIT0gJ1NUQVRJQycgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RJZCA9IHFQYXJhbVtcImlkXCJdO1xyXG4gICAgICBpZiAocHJvZHVjdElkKSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBUcmFja2luZyBBbmFseXRpY3NcclxuICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc3RhcnROZXdDb250ZXh0KHtcclxuICAgICAgICAgICdQUk9EVUNUX0lEJzogcHJvZHVjdElkXHJcbiAgICAgICAgfSwgJ1BST0RVQ1RfVklFVycpXHJcblxyXG4gICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdERldGFpbHMocHJvZHVjdElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZVswXTtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudC5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCwgaWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgdmFyaWVudC5xdWFudGl0eSA9IDA7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgodmFyaWVudEtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KHZhcmllbnRLZXksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XSk7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KT8uaW5jbHVkZXModmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWVudHMuc2V0KHZhcmllbnRLZXksIFsuLi4odGhpcy52YXJpZW50cy5nZXQodmFyaWVudEtleSkgPz8gW10pLCB2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV1dKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5nZXRSZWxhdGVkUHJvZHVjdHMoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBpdGVtVmFyaWFudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICAgICAgaWYgKGl0ZW1WYXJpYW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWFudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSBpdGVtVmFyaWFudC52YXJpYW50SWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXM7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UmV2aWV3cyh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUlkKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJDYXJ0KCkudGhlbigoY2FydFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWFudCAmJiBpdGVtLnZhcmllbnRJZCA9PSBpdGVtVmFyaWFudC52YXJpYW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmlhbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWFudCAmJiBpdGVtVmFyaWFudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrSXRlbUFscmVhZHlBZGRlZEluVHJpYWwoKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsO1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb2R1Y3RCeUNhdGVnb3J5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIE9ubHkgYXR0YWNoIGN1c3RvbSBzY3JvbGwgbGlzdGVuZXJzIG9uIGRlc2t0b3Ag4oCUIG9uIG1vYmlsZSB0aGVzZSBjYW5cclxuICAgIC8vIGNhbGwgZS5wcmV2ZW50RGVmYXVsdCgpIGFuZCBibG9jayB0b3VjaC9jbGljayBldmVudHMgb24gdGhlIHRhYnMuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgYWJvdmUgPSB0aGlzLmFib3ZlSGVpZ2h0Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgaW1nRGl2ID0gdGhpcy5pbWFnZVNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkZXRhaWxEaXYgPSB0aGlzLmRldGFpbFNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgLy8gU3RlcCAxOiBzY3JvbGwgYmV0d2VlbiBpbWFnZSBhbmQgZGV0YWlsXHJcbiAgICBpbWdEaXY/LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgKGU6IFdoZWVsRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgYXRCb3R0b20gPSBpbWdEaXYuc2Nyb2xsVG9wICsgaW1nRGl2LmNsaWVudEhlaWdodCA+PSBpbWdEaXYuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICBjb25zdCBhdFRvcCA9IGltZ0Rpdi5zY3JvbGxUb3AgPT09IDA7XHJcblxyXG4gICAgICBpZiAoZS5kZWx0YVkgPiAwICYmIGF0Qm90dG9tKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGRldGFpbERpdi5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZS5kZWx0YVkgPCAwICYmIGF0VG9wKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGRldGFpbERpdi5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN0ZXAgMjogYWZ0ZXIgZGV0YWlsIHNlY3Rpb24sIGNvbnRpbnVlIHRvIFJldmlld3NcclxuICAgIGRldGFpbERpdj8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZTogV2hlZWxFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBhdEJvdHRvbSA9IGRldGFpbERpdi5zY3JvbGxUb3AgKyBkZXRhaWxEaXYuY2xpZW50SGVpZ2h0ID49IGRldGFpbERpdi5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGF0VG9wID0gZGV0YWlsRGl2LnNjcm9sbFRvcCA9PT0gMDtcclxuXHJcbiAgICAgIGlmIChlLmRlbHRhWSA+IDAgJiYgYXRCb3R0b20pIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgfSBlbHNlIGlmIChlLmRlbHRhWSA8IDAgJiYgYXRUb3ApIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaW1nRGl2LnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHZhcmllbnRMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVjZW50Vmlld0l0ZW1MaXN0OiBQcm9kdWN0W10gPSBbXTtcclxuICBnZXRSZWxhdGVkUHJvZHVjdHMoKSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcclxuICAgIGlmICghIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVjZW50Vmlld1Byb2R1Y3QodXNlckRldGFpbHMudXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWNlbnRWaWV3SXRlbUxpc3QgPSByZXNwb25zZTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0VmFyaWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy52YXJpZW50TG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFyaWVudC5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KSA9PiB7XHJcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xyXG4gICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChmb3VuZFZhcmllbnQpIHtcclxuICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB2YXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmw7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucHJpY2UgPSB2YXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IHZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSB2YXJpZW50LnZhcmlhbnRJZDtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IHRoaXMuZ2V0VmFyaWVudFF1YW50aXR5KHZhcmllbnQpO1xyXG4gICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRoaXMuaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHZhcmllbnQpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tJdGVtQWxyZWFkeUFkZGVkSW5UcmlhbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG4gIHJhaXNlTGVhZCgpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSxcclxuICAgICAgZW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgbWVzc2FnZTogXCJcIixcclxuICAgICAgbW9iaWxlTm86IFwiXCIsXHJcbiAgICAgIG1vcmVJbmZvOiB7XHJcbiAgICAgICAgTmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWUsXHJcbiAgICAgICAgXCJNb2JpbGUgTnVtYmVyXCI6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5tb2JpbGUsXHJcbiAgICAgICAgRW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgICBcIkxlYWQgU291cmNlXCI6IFwiV2Vic2l0ZVwiLFxyXG4gICAgICAgIFwiTGVhZCBTdGF0dXNcIjogXCJORVdcIlxyXG4gICAgICB9LFxyXG4gICAgICBuYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jcmVhdGVMZWFkKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RoYW5rIHlvdScsIGRldGFpbDogJ091ciB0ZWFtIHdpbGwgY29udGFjdCB5b3Ugc29vbicgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igb2NjdXJlZCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIGdldEl0ZW1WYXJpZW50KCk6IEl0ZW1WYXJpYW50IHwgbnVsbCB7XHJcbiAgICBsZXQgc2VsZWN0ZWRWYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCkgPT4ge1xyXG4gICAgICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgZm91bmRWYXJpZW50ID0gKHRoaXMuc2VsZWN0ZWRWYXJpZW50LmdldChwcm9wZXJ0eSkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZm91bmRWYXJpZW50KVxyXG4gICAgICAgIHNlbGVjdGVkVmFyaWVudCA9IHZhcmllbnQ7XHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBzZWxlY3RlZFZhcmllbnQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0l0ZW1BbHJlYWR5QWRkZWRJblRyaWFsKCkge1xyXG4gICAgbGV0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKClcclxuICAgIGlmICh1c2VyKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0OiBjaGVja0l0ZW1BbHJlYWR5QWRkZWQgPSBuZXcgY2hlY2tJdGVtQWxyZWFkeUFkZGVkKHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkLCB1c2VyLnVzZXJJZCwgJ1RSSUFMX0NBUlQnKVxyXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmNoZWNrSXRlbUFscmVhZHlBZGRlZChyZXF1ZXN0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1BZGRlZEFzVHJpYWwgPSByZXMuZGF0YVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRUcmlhbENhcnRJbmRleERCRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VHJpYWxDYXJ0SW5kZXhEQkRhdGEoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFRyaWFsQ2FydCgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHJlc3BvbnNlLm9uc3VjY2VzcyA9ICh1c2VyVHJpYWxDYXJ0UmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB0cmlhbENhcnRJdGVtOiBPcmRlcmVkSXRlbXNbXSA9IHVzZXJUcmlhbENhcnRSZXNwb25zZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdHJpYWxDYXJ0SXRlbSkge1xyXG4gICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09PSB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgJiYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID09IDAgfHwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkID09PSBpdGVtLnZhcmllbnRJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0l0ZW1BZGRlZEFzVHJpYWwgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNoYXJlUHJvZHVjdCgpIHtcclxuICAgIG5hdmlnYXRvci5zaGFyZSh7XHJcbiAgICAgIHRpdGxlOiAnQnV5ICcgKyB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSxcclxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxyXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnUHJvZHVjdCBzaGFyZWQnLCBrZXk6ICd3aXNobGlzdCcgfSkpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdTaGFyZWQnLCBkZXRhaWw6ICdGYWlsZWQgdG8gc2hhcmUgcHJvZHVjdC4gVHJ5IEFnYWluLicsIGtleTogJ3dpc2hsaXN0JyB9KSk7XHJcblxyXG4gIH1cclxuICByb3V0ZVRvSG9tZSgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcclxuICB9XHJcblxyXG4gIHNjcmVlbldpZHRoOiBhbnk7XHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuXHJcbiAgY3VycmVudEltZzogYW55O1xyXG4gIGNoYW5nZUltZyh1cmw6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50SW1nID0gdXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0S2V5cyh2YXJpZW50OiBPYmplY3QpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFyaWVudCk7XHJcbiAgfVxyXG5cclxuICBnb1RvQ2FydCgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XHJcbiAgfVxyXG5cclxuICBhZGRUb0NhcnQodHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJyA9ICdBREQnKSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1PdXRPZlN0b2NrKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0NhcnQnLCBkZXRhaWw6ICdJdGVtIGlzIG5vdCBhdmFpbGFibGUgYXMgb2Ygbm93LiBXZSB3aWxsIG5vdGlmeSB5b3Ugb25jZSBhdmFpbGFibGUnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICBpdGVtVmFyaWVudC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtVmFyaWVudC5xdWFudGl0eTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5KSB7XHJcbiAgICAgICAgbGV0IGlzUHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLnZhcmllbnRJZCA9PSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgaXRlbS5xdWFudGl0eSA9IHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5O1xyXG4gICAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQpXHJcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IHRoaXMuVVNFUl9DQVJUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSA/PyBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50Py52YXJpYW50SWQpO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZXNwb25zZURhdGE/LnF1YW50aXR5KVxyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcclxuICAgICAgaWYgKHR5cGUgPT0gJ0FERCcpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5IC09IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9GaWx0ZXIoY2F0ZWdvcnk6IHN0cmluZykge1xyXG4gICAgY2F0ZWdvcnkgPSBjYXRlZ29yeS5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNhdGVnb3J5OiBjYXRlZ29yeSB9IH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9GYXZvdXJpdGUoKSB7XHJcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB3aXNobGlzdCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNJdGVtQXNGYXZvcml0ZSkge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LnB1c2gobmV3IE9yZGVyZWRJdGVtcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB0aGlzLlVTRVJfV0lTSExJU1Q/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVUb0Zhdm91cml0ZSgpIHtcclxuICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gcmVtb3ZlZCBmcm9tIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZW1vdmVJdGVtRnJvbUZhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0QnlDYXRlZ29yeSgpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnlJZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcz8uWzBdPy5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICAgIGlmICh0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YT8ubGVuZ3RoID09IDApXHJcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uSWQodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNvbGxlY3Rpb24/LlswXS5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBjaGFuZ2VQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnXSwgeyBxdWVyeVBhcmFtczogeyBpZDogcHJvZHVjdC5pdGVtSWQgfSB9KTtcclxuICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcclxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gIH1cclxuICBnZXRLZXlCeUlkeChwcm9wZXJ0eTogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydHkpW2luZGV4XTtcclxuICB9XHJcbiAgaXNWYXJpZW50QXZhaWxhYmxlKHZhcmllbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIC8vIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpPT4ge1xyXG4gICAgLy8gICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgIC8vICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcclxuICAgIC8vICAgICAvLyBmb3VuZFZhcmllbnQgPSAodmFyaWVudEtleSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9KVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV2aWV3VGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgcmV2aWV3RGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgYWRkUHJvZHVjdFJldmlldygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLnJldmlld1RpdGxlLmxlbmd0aCA9PSAwICYmIHRoaXMucmV2aWV3RGVzY3JpcHRpb24ubGVuZ3RoID09IDAgJiYgdGhpcy5wcm9kdWN0UmV2aWV3ID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0xvZ2luJywgZGV0YWlsOiAnUGxlYXNlIGxvZ2luIHRvIHBvc3QgcmV2aWV3Jywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXlsb2FkOiBSZXZpZXcgPSB7XHJcbiAgICAgIHByb2R1Y3RJZDogdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkLFxyXG4gICAgICB1c2VySWQ6IHVzZXJEZXRhaWxzLnVzZXJJZCxcclxuICAgICAgcmF0aW5nOiB0aGlzLnByb2R1Y3RSZXZpZXcsXHJcbiAgICAgIHJldmlldzogdGhpcy5yZXZpZXdEZXNjcmlwdGlvbixcclxuICAgICAgdXNlck5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5yZXZpZXdUaXRsZSxcclxuICAgICAgcHJvZHVjdEltYWdlczogW11cclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuYWRkUmV2aWV3KHBheWxvYWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5zaG93UmV2aWV3ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnJhdGluZyArPSAxO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdSZXZpZXcnLCBkZXRhaWw6ICdUaGFua3MgZm9yIGdpdmluZyB5b3VyIGZlZWRiYWNrJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICBpZiAodGhpcy5yZXZpZXdDb21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLnJldmlld0NvbXBvbmVudC5nZXRBbGxSZXZpZXdzKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFZhcmllbnRRdWFudGl0eShwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IGl0ZW1RdWFudGl0eTogbnVtYmVyID0gMDtcclxuICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcclxuICAgICAgICBpdGVtUXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgfSlcclxuICAgIHJldHVybiBpdGVtUXVhbnRpdHk7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHRoaXMuVVNFUl9XSVNITElTVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXHJcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByZXNlbnQ7XHJcbiAgfVxyXG5cclxuICBlZGl0U2VjdGlvbigpIHtcclxuXHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNDc1KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnRvZ2dsZUVkaXRvckV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5lZGl0U2VjdGlvbi5lbWl0KHsgZGF0YTogdGhpcy5kYXRhIH0pO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0l0ZW1PdXRPZlN0b2NrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPT0gMDtcclxuICB9XHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQlVTSU5FU1NfQ09OU1RBTlRTLkNVUlJFTkNZO1xyXG4gIH1cclxuICBnZXQgaXNJdGVtTG93U3RvY2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA8IDU7XHJcbiAgfVxyXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzU7XHJcbiAgfVxyXG5cclxuICBnZXRDYXJhdChjYXJhdDogYW55KSB7XHJcbiAgICBzd2l0Y2ggKGNhcmF0KSB7XHJcbiAgICAgIGNhc2UgJ0syNCc6XHJcbiAgICAgICAgcmV0dXJuIFwiMjQgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzIyJzpcclxuICAgICAgICByZXR1cm4gXCIyMiBDYXJhdHNcIlxyXG4gICAgICBjYXNlICdLMTgnOlxyXG4gICAgICAgIHJldHVybiBcIjE4IENhcmF0c1wiXHJcbiAgICAgIGNhc2UgJ0sxNCc6XHJcbiAgICAgICAgcmV0dXJuIFwiMTQgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzEwJzpcclxuICAgICAgICByZXR1cm4gXCIxMCBDYXJhdHNcIlxyXG4gICAgICBjYXNlICdLOTk5JzpcclxuICAgICAgICByZXR1cm4gXCI5OS45JSBQdXJlXCJcclxuICAgICAgY2FzZSAnSzkyNSc6XHJcbiAgICAgICAgcmV0dXJuIFwiOTIuNSUgUHVyZVwiXHJcbiAgICAgIGNhc2UgJ0s5MDAnOlxyXG4gICAgICAgIHJldHVybiBcIjkwJSBQdXJlXCJcclxuICAgICAgY2FzZSAnVlMnOlxyXG4gICAgICAgIHJldHVybiBcIlZlcnkgU2xpZ2h0bHkgSW5jbHVkZWRcIlxyXG4gICAgICBjYXNlICdTSSc6XHJcbiAgICAgICAgcmV0dXJuIFwiU2xpZ2h0bHkgSW5jbHVkZWRcIlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIjI0IENhcmF0c1wiXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFByaWNlUGVyR3JhbShwcmljZTogYW55LCBtYXRlcmlhbFR5cGU6IHN0cmluZykge1xyXG4gICAgaWYgKG1hdGVyaWFsVHlwZSA9PT0gJ0RJQU1PTkQnIHx8IG1hdGVyaWFsVHlwZSA9PT0gJ0dPTEQnKSB7XHJcbiAgICAgIHJldHVybiBwcmljZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcbiAgaXNEZXNjcmlwdGlvbkNvbGxhcHNlZCA9IGZhbHNlO1xyXG5cclxuICB0b2dnbGVEZXNjcmlwdGlvbigpIHtcclxuICAgIHRoaXMuaXNEZXNjcmlwdGlvbkNvbGxhcHNlZCA9ICF0aGlzLmlzRGVzY3JpcHRpb25Db2xsYXBzZWQ7XHJcbiAgfVxyXG4gIGlzUHJpY2VCcmVha3VwID0gZmFsc2VcclxuICB0b2dnbGVQcmljZUJyZWFrRG93bigpIHtcclxuICAgIHRoaXMuaXNQcmljZUJyZWFrdXAgPSAhdGhpcy5pc1ByaWNlQnJlYWt1cDtcclxuICB9XHJcbiAgZ2V0RGlmZmVyZW5jZShzZWxsaW5nUHJpY2U6IGFueSwgbXJwOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKCFzZWxsaW5nUHJpY2UgfHwgIW1ycClcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICByZXR1cm4gbXJwIC0gc2VsbGluZ1ByaWNlO1xyXG4gIH1cclxuICBnZXRCYWNrZ3JvdW5kQ29sb3IodHlwZTogc3RyaW5nKSB7XHJcbiAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIC8vICAgY2FzZSBcIkdPTERcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCIjRkZGNEQxXCJcclxuICAgIC8vICAgY2FzZSBcIkRJQU1PTkRcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCIjRUZFMUY0XCJcclxuICAgIC8vICAgY2FzZSBcIlNJTFZFUlwiOlxyXG4gICAgLy8gICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxODBkZWcsICNGQUZBRkEgMCUsICNGRkZGRkYgMTAwJSlcIlxyXG4gICAgLy8gICBkZWZhdWx0OlxyXG4gICAgLy8gICAgIHJldHVybiBcIiNlMmY2ZmZcIlxyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIFwiI0ZGRjlGNVwiXHJcbiAgfVxyXG4gIGdldEhlYWRlckNvbG9yKHR5cGU6IHN0cmluZykge1xyXG4gICAgLy8gc3dpdGNoICh0eXBlKSB7XHJcbiAgICAvLyAgIGNhc2UgXCJHT0xEXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwiI0ZGRjNFOVwiXHJcbiAgICAvLyAgIGNhc2UgXCJESUFNT05EXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwiIzlENDNCOFwiXHJcbiAgICAvLyAgIGNhc2UgXCJTSUxWRVJcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjQkRCREJEIDAlLCAjRTJFMkUyIDEwMCUpXCJcclxuICAgIC8vICAgZGVmYXVsdDpcclxuICAgIC8vICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTU5ZGVnLCByZ2JhKDY1LDEwNSwyMjUsMSkgMCUsIHJnYmEoMTM3LDIwNywyNDAsMSkgMTAwJSlcIlxyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIFwiI0ZGRjNFOVwiXHJcbiAgfVxyXG4gIGdldFRleHRDb2xvcihjb2xvcjogYW55KSB7XHJcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChjb2xvci5zbGljZSgzLCA1KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xyXG4gIH1cclxuICBsYW5ndWFnZXM6IHN0cmluZ1tdID0gW1wiRW5nbGlzaFwiLCBcIlRlbHVndVwiLCBcIkhpbmRpXCIsIFwiVGFtaWxcIiwgXCJLYW5uYWRhXCIsIFwiTWFsYXlhbGFtXCIsIFwiT3RoZXJzXCJdXHJcbiAgc2VsZWN0ZWRMYW5nOiBzdHJpbmcgPSB0aGlzLmxhbmd1YWdlc1swXVxyXG5cclxuICBnZXRDbGFzcyhtYXA6IGFueSkge1xyXG4gICAgaWYgKG1hcC5zaXplID09IDEpXHJcbiAgICAgIHJldHVybiAnY29sLTYnXHJcbiAgICBlbHNlIGlmIChtYXAuc2l6ZSA9PSAyKVxyXG4gICAgICByZXR1cm4gJ2NvbC00J1xyXG4gICAgZWxzZSBpZiAobWFwLnNpemUgPT0gMylcclxuICAgICAgcmV0dXJuICdjb2wtMydcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuICd3aWR0aC1tYXgnO1xyXG4gIH1cclxuICBvbkZpbmRJblN0b3JlKGlkOiBzdHJpbmcpIHtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlJ10sIHsgcXVlcnlQYXJhbXM6IHsgc3RvcmVJZDogaWQgfSB9KTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlLWxpc3QnXSk7XHJcbiAgfVxyXG5cclxuICBvbkJvb2tBcHBvaW50bWVudCgpIHtcclxuXHJcbiAgfVxyXG4gIGlzRGV0YWlsczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBpbmNvZGU6IGFueTtcclxuICBzdG9yZURldGFpbHM6IGFueTtcclxuICBnZXRTdG9yZURldGFpbHMoKSB7XHJcbiAgICBpZiAodGhpcy5waW5jb2RlID09IG51bGwgfHwgdGhpcy5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9IDYpIHtcclxuICAgICAgdGhpcy5pc1BpbkNvZGUgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRTdG9yZUxvY2F0b3JEZXRhaWxzKHRoaXMucGluY29kZS50b1N0cmluZygpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEZXRhaWxzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zdG9yZURldGFpbHMgPSByZXM/LmRhdGE7XHJcbiAgICAgIHRoaXMuaXNQaW5Db2RlID0gdHJ1ZTtcclxuICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ1N0b3JlIExvY2F0b3InIH0pO1xyXG4gICAgICB9KVxyXG4gIH1cclxuICBicmFuZFByb21pc2VzOiBhbnlbXSA9IFtdO1xyXG4gIGVjb21Db25maWdzOiBhbnk7XHJcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RWNvbW1lcmNlQ29uZmlncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5icmFuZFByb21pc2VzID0gcmVzPy5kYXRhPy5icmFuZFByb21pc2VzXHJcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcclxuICAgIH0pXHJcbiAgfVxyXG4gIGxvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG90aGVyTGFuZ3VhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8/IFwiXCIsXHJcbiAgICBtb2JpbGVOdW1iZXI6IFwiXCIsXHJcbiAgICBwaW5jb2RlOiBcIlwiLFxyXG4gICAgdXNlcm5hbWU6IFwiXCIsXHJcbiAgICBlbWFpbDogXCJcIixcclxuICAgIG1lc3NhZ2U6IGBgLFxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGlvbkVycm9yczogYW55ID0ge1xyXG4gICAgdXNlcm5hbWU6IGZhbHNlLFxyXG4gICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgIHBpbmNvZGU6IGZhbHNlLFxyXG4gICAgZW1haWw6IGZhbHNlXHJcbiAgfTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZVZpZGVvQ2FsbCgpIHtcclxuICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWU/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXIgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyID0gdHJ1ZTtcclxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XHJcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWw/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZW1haWwgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICghL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvLnRlc3QodGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZW1haWwgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGhhc0Vycm9ycykge1xyXG4gICAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZT8udHJpbSgpIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZSkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZmlsbCBhbGwgdGhlIHJlcXVpcmVkIGRldGFpbHMnLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCAxMC1kaWdpdCBtb2JpbGUgbnVtYmVyJyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgNi1kaWdpdCBwaW5jb2RlJyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbD8udHJpbSgpIHx8ICEvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC8udGVzdCh0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWwpKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcclxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1lc3NhZ2UgPSB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSArIGBIaSwgSSd2ZSBqdXN0IHNjaGVkdWxlZCBhIHZpZGVvIGNhbGwgd2l0aCB5b3UgZm9yIHRoaXMgcHJvZHVjdCAke3RoaXMucmVzcG9uc2VEYXRhPy5uYW1lfS4gSXQncyBpbXBvcnRhbnQgYW5kIEknZCBhcHByZWNpYXRlIHlvdXIgdGltZSDigJQgbG9va2luZyBmb3J3YXJkIHRvIGNvbm5lY3RpbmcgYXMgc29vbiBhcyBwb3NzaWJsZSAgaW4gJHt0aGlzLnNlbGVjdGVkTGFuZyA9PSAnT3RoZXJzJyA/IHRoaXMub3RoZXJMYW5ndWFnZSA6IHRoaXMuc2VsZWN0ZWRMYW5nfSBsYW5ndWFnZWA7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnBvc3RWaWRlb0NhbGxEZXRhaWxzKHRoaXMudmlkZW9DYWxsUGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnWW91ciBWaWRlbyBDYWxsIGlzIFNjaGVkdWxlZCBTdWNjZXNzZnVsbHknLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gU2NoZWR1bGluZydcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKClcclxuICAgICAgfSxcclxuICAgICAgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdFcnJvcicsXHJcbiAgICAgICAgICBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsXHJcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICByZXNldFZhbGlkYXRpb25FcnJvcnMoKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiBmYWxzZSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgICAgcGluY29kZTogZmFsc2VcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXNldEZvcm0oKSB7XHJcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiAnJyxcclxuICAgICAgbW9iaWxlTnVtYmVyOiAnJyxcclxuICAgICAgcGluY29kZTogJycsXHJcbiAgICAgIG1lc3NhZ2U6ICcnXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZXNldFZhbGlkYXRpb25FcnJvcnMoKTtcclxuICB9XHJcbiAgb25JbnB1dENoYW5nZShmaWVsZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3JzW2ZpZWxkXSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsb3NlTW9kYWwoKSB7XHJcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZU1vZGFsQ2VudGVyJyk7XHJcbiAgICBpZiAobW9kYWxFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1vZGFsRWxlbWVudCwgJ2RhdGEtYnMtZGlzbWlzcycsICdtb2RhbCcpO1xyXG4gICAgICBtb2RhbEVsZW1lbnQuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LmlkID8/IFwiXCI7XHJcbiAgfVxyXG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LnN0eWxlcztcclxuICB9XHJcbiAgb3BlbkRpYWxvZ0JveCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maWc6IE1hdERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgcGFuZWxDbGFzczogJycsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNjcmVlbldpZHRoID4gNDc1KSB7XHJcbiAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gJ3ZpZGVvLWNhbGwtZGlhbG9nJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbmZpZy53aWR0aCA9ICcxMDB2dyc7XHJcbiAgICAgIGNvbmZpZy5oZWlnaHQgPSAnMTAwdmgnO1xyXG4gICAgICBjb25maWcubWF4V2lkdGggPSAnMTAwdncnO1xyXG4gICAgICBjb25maWcucGFuZWxDbGFzcyA9ICdhcHBvaW50bWVudC1mb3JtJztcclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsIGNvbmZpZyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG1hdENsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIGdldFJhdGluZ3Mobm9vZnJhdGluZ3M6IGFueSkge1xyXG4gICAgaWYgKG5vb2ZyYXRpbmdzID49IDEwMDApIHtcclxuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDApLnRvRml4ZWQoMSkgKyBcIksrXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChub29mcmF0aW5ncyA+IDEwMDAwMDApIHtcclxuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDAwMDApLnRvRml4ZWQoMSkgKyBcIk1cIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbm9vZnJhdGluZ3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUb1RyaWFsQ2FydCgpIHtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvVHJpYWwodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9UcmlhbCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNJdGVtQWRkZWRBc1RyaWFsID0gdHJ1ZTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgdHJhaWwgY2FydCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuXHJcbiAgfVxyXG4gIHJldmlld3NEYXRhOiBhbnlbXSA9IFtdXHJcbiAgcmF0aW5nQ291bnRzOiBhbnlcclxuICBwYWdlTnVtYmVyOiBudW1iZXIgPSAwXHJcbiAgbG9hZE1vcmVSZXZpZXdzKCkge1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyKys7XHJcbiAgICB0aGlzLmdldFJldmlld3ModGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JZCk7XHJcbiAgfVxyXG4gIGdldFJldmlld3MocHJvZHVjdElkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmV2aWV3c0J5UHJvZHVjdElkKHByb2R1Y3RJZCwgdGhpcy5wYWdlTnVtYmVyKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXZpZXdzRGF0YSA9IFsuLi50aGlzLnJldmlld3NEYXRhLCAuLi5yZXNwb25zZT8uZGF0YT8udXNlclJldmlld3NdO1xyXG4gICAgICB0aGlzLnJhdGluZ0NvdW50cyA9IHJlc3BvbnNlPy5kYXRhPy5vdmVyYWxsUmF0aW5nQ291bnRcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycm9yPy5lcnJvcj8ubWVzc2FnZSwga2V5OiAnUmV2aWV3cycgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0UGVyY2VudGFnZShyYXRpbmc6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMucmF0aW5nQ291bnRzICYmIHRoaXMucmF0aW5nQ291bnRzW3JhdGluZ10pIHtcclxuICAgICAgbGV0IHBlcmNlbnQgPSAodGhpcy5yYXRpbmdDb3VudHNbcmF0aW5nXSAvIHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50KSAqIDEwMFxyXG4gICAgICByZXR1cm4gcGVyY2VudC50b0ZpeGVkKDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcwJztcclxuICB9XHJcblxyXG4gIGdldFJHQkEoYmdDb2xvcjogYW55LCBvcGFjaXR5OiBudW1iZXIpOiBhbnkge1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGJnQ29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChiZ0NvbG9yLnNsaWNlKDMsIDUpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoYmdDb2xvci5zbGljZSg1LCA3KSwgMTYpO1xyXG4gICAgcmV0dXJuIGByZ2JhKCR7cn0sICR7Z30sICR7Yn0sICR7b3BhY2l0eSAvIDEwMH0pYDtcclxuICB9XHJcblxyXG4gIHNob3dEZXRhaWxSZXZpZXcocmV2aWV3OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRSZXZpZXcgPSByZXZpZXdcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuUmV2aWV3RGV0YWlsJyk/LmNsaWNrKClcclxuICB9XHJcbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuc3R5bGVzPy5sYXlvdXQgfSBhcyBMYXlPdXRNb2RlbDtcclxuICB9XHJcblxyXG4gIGdldERhdGVBZnRlcnhEYXlzKCk6IERhdGUge1xyXG4gICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY3VycmVudERhdGUuc2V0RGF0ZShjdXJyZW50RGF0ZS5nZXREYXRlKCkgKyAodGhpcy5lY29tQ29uZmlncz8uZXhwZWN0ZWREZWxpdmVyeURhdGUgPz8gNykpO1xyXG4gICAgcmV0dXJuIGN1cnJlbnREYXRlO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwid2lzaGxpc3RcIlxyXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIlZpZGVvIENhbGwgU2NoZWR1bGVcIlxyXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gU2NoZWR1bGluZ1wiXHJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJ0b3RhbC1jb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIHNpbXBvSG92ZXJcclxuICAgIChob3ZlcmluZyk9XCJzaG93RWRpdFRhYnMoJGV2ZW50KVwiIFthdHRyLnN0eWxlXT1cImN1c3RvbUNsYXNzXCI+XHJcblxyXG4gICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cclxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCIgW2J1dHRvblN0eWxlXT1cInsnYm9yZGVyLXJhZGl1cyc6ICc1MCUnLCAnaGVpZ2h0JzogJzMwcHgnfVwiIC8+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImNvbnRhaW5lclwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiIFtzcGFjaW5nSG9yaXpvbnRhbF09XCJzdHlsZXNMYXlvdXRcIlxyXG4gICAgICBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiAjY29udGFpbmVyPlxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXNwbGF5LW5vbmVcIj48YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiAjMDI2N0MxXCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3V0ZVRvSG9tZSgpXCI+SG9tZTwvYT4gL1xyXG4gICAgICAgIDxzcGFuPnt7IHJlc3BvbnNlRGF0YT8ubmFtZSB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG0tMCB3LTEwMCBtdC1sZy00IGgtYXV0byBvdmVyZmxvdy12aXNpYmxlXCIgI2Fib3ZlSGVpZ2h0PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wtc20tMTIgaW1hZ2Utc2VjdGlvbi1tb2Rlcm5cIiAjaW1hZ2VTZWN0aW9uPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImgtMTAwIGQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWxnLWNvbHVtbi1yZXZlcnNlIGp1c3RpZnktY29udGVudC1zdGFydCBnYXAtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiSW1hZ2VTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLXNtLTEyIGRldGFpbC1zZWN0aW9uLW1vZGVybiBcIiAjZGV0YWlsU2VjdGlvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWhlcm8tY2FyZC1tb2Rlcm5cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhcmlhbnRzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlByb2R1Y3REZXNjXCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhcmlhbnRzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc01vYmlsZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJBY3Rpb25CdG5cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy5kZWxpdmVyeUVuYWJsZWRcIiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkRlbGl2ZXJ5U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy5zdG9yZXNFbmFibGVkXCIgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJTdG9yZVNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8uYXBwb2ludG1lbnRCb29raW5nRW5hYmxlZFwiIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVHJ5QXRIb21lXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpZGVvQ2FsbFNjaGVkdWxlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnJhbmRpbmdcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBNb3ZlZCBkZXNjcmlwdG9ycyB0byBEZXRhaWxzIHRhYiBiZWxvdyAtLT5cclxuXHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2MgYm9keS1sYXJnZSBkLWJsb2NrXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8IS0tIE1vdmVkIHRhZ3MgdG8gRGV0YWlscyB0YWIgYmVsb3cgLS0+XHJcbiAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJTb2NpYWxJY29uc1wiPjwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlJldmlld1NlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gVGFicyBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC10YWJzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cInRhYnMtbGlzdFwiPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwidGFiLWl0ZW1cIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PSAnRGV0YWlscydcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJyA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJhY3RpdmVUYWIgPT0gJ0RldGFpbHMnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICd0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdEZXRhaWxzJylcIj5EZXRhaWxzPC9saT5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cInRhYi1pdGVtXCIgKm5nSWY9XCJyZXZpZXdzRGF0YVwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09ICdSZXZpZXdzJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJhY3RpdmVUYWIgPT0gJ1Jldmlld3MnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWIoJ1Jldmlld3MnKVwiPlJldmlld3M8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBUYWIgQ29udGVudCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50LXBhbmVcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uYnJpZWYgfCBzYW5pdGl6ZUh0bWxcIiBjbGFzcz1cIm10LTIgdGV4dC1qdXN0aWZ5IGxpbmUtaGVpZ2h0LTI0IGZvbnQtMTRcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIEludGVncmF0ZWQgZGVzY3JpcHRvcnMgYW5kIHRhZ3MgaGVyZSAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZXNjcmlwdG9yc1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT0gJ1Jldmlld3MnXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUmV2aWV3c1NlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVsYXRlZFByb2R1Y3REYXRhPy5sZW5ndGhcIj5cclxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwiZmVhdHVyZVByb2R1Y3REYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWxhdGVkUHJvZHVjdERhdGFcIlxyXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIiAoY2hhbmdlRGV0YWlsUHJvZHVjdCk9XCJjaGFuZ2VQcm9kdWN0KCRldmVudClcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNlbnRWaWV3SXRlbUxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICA8c2ltcG8tZmVhdHVyZWQtcHJvZHVjdHMgW2VkaXRdPVwiZmFsc2VcIiBbZGF0YV09XCJyZWNlbnRWaWV3ZWREYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWNlbnRWaWV3SXRlbUxpc3RcIlxyXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgPCEtLSA8bmctY29udGFpbmVyPlxyXG4gICAgICA8c2ltcG8tY3VzdG9tZXItcmV2aWV3IFtkYXRhXT1cImRhdGFcIj48L3NpbXBvLWN1c3RvbWVyLXJldmlldz5cclxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy5kZXZpZGVyPy5kaXNwbGF5XCI+XHJcbiAgICAgIDxzaW1wby1zdmctZGl2aWRlciBbZGl2aWRlclR5cGVdPVwic3R5bGVzPy5kZXZpZGVyPy5kZXZpZGVyVHlwZVwiXHJcbiAgICAgICAgW2NvbG9yXT1cIm5leHRDb21wb25lbnRDb2xvcj8uY29sb3JcIj48L3NpbXBvLXN2Zy1kaXZpZGVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XHJcbiAgICAgIDxzaW1wby1ob3Zlci1lbGVtZW50cyBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCIgW2VkaXRPcHRpb25zXT1cImVkaXRcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxyXG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbjxuZ3gtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgY291bnQ9XCIxXCIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XHJcbiAgd2lkdGg6ICcxMDAlJyxcclxuICBoZWlnaHQ6ICc0MHZoJyxcclxuICAnYm9yZGVyLXJhZGl1cyc6ICcxMHB4JyxcclxuICAncG9zaXRpb24nOiAncmVsYXRpdmUnLFxyXG4gICdyaWdodCc6ICc1cHgnXHJcbn1cIj5cclxuPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2JpbGUtZm9vdGVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImljb25zXCI+XHJcbiAgICA8ZGl2IChjbGljayk9XCJnb1RvQ2FydCgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cImFkZFRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiIWlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZV9ib3JkZXI8L21hdC1pY29uPlxyXG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwicmVtb3ZlVG9GYXZvdXJpdGUoKVwiXHJcbiAgICAgICAgKm5nSWY9XCJpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiBjbGFzcz1cIm91dC1vZi1zdG9jayB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgwKVwiPk91dCBvZlxyXG4gICAgU3RvY2s8L2J1dHRvbj5cclxuICA8ZGl2IGNsYXNzPVwicXVhbnRpdHlcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCJcclxuICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XHJcbiAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwcHg7XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBmY1wiXHJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+e3tyZXNwb25zZURhdGE/LnF1YW50aXR5fX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCJcclxuICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiXHJcbiAgICBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCIgKGNsaWNrKT1cIiFlZGl0ID8gb3BlbkRpYWxvZ0JveChkaWFsb2dCb3gpIDogJydcIj5cclxuICAgIDxtYXQtaWNvbj52aWRlb2NhbTwvbWF0LWljb24+TElWRSBWSURFTyBDQUxMPC9idXR0b24+XHJcbiAgPGRpdiAqbmdJZj1cIiFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrXCIgY2xhc3M9XCJ3LTc1XCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxyXG4gICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCJcclxuICAgICAgKGNsaWNrKT1cIiFlZGl0ID8gYWRkVG9DYXJ0KCkgOiAnJ1wiPjxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbH19PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNSZXZpZXdTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5DdXN0b21lciBSZXZpZXc8L2Rpdj5cclxuICAgIDxwLXJhdGluZyBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRvdGFsUmV2aWV3XCIgLz5cclxuICAgIDxzcGFuPkJlIHRoZSBmaXJzdCB0byB3cml0ZSBhIHJldmlldzwvc3Bhbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJtdC0zXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9ICFzaG93UmV2aWV3XCI+e3sgIXNob3dSZXZpZXcgPyAnQWRkXHJcbiAgICAgIFJldmlldycgOiAnQ2FuY2VsIFJldmlldyd9fTwvYnV0dG9uPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZXZpZXdcIj5cclxuICAgICAgPGhyIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXJldmlld1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPldyaXRlIGEgcmV2aWV3PC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJBVElORzwvc3Bhbj5cclxuICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJwcm9kdWN0UmV2aWV3XCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJmYWxzZVwiIC8+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXcgVGl0bGU8L3NwYW4+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkdpdmUgeW91ciByZXZpZXcgYSB0aXRsZVwiIFsobmdNb2RlbCldPVwicmV2aWV3VGl0bGVcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldzwvc3Bhbj5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgY29tbWVudHMgaGVyZVwiIFsobmdNb2RlbCldPVwicmV2aWV3RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctYWN0aW9uLWJ0blwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInNob3dSZXZpZXcgPSBmYWxzZVwiPkNhbmNlbCByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZFByb2R1Y3RSZXZpZXcoKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcm9kdWN0UmV2aWV3ID09IDAgJiYgcmV2aWV3VGl0bGU/Lmxlbmd0aCA9PSAwICYmIHJldmlld0Rlc2NyaXB0aW9uPy5sZW5ndGggPT0gMFwiPlN1Ym1pdFxyXG4gICAgICAgICAgICByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU29jaWFsSWNvbnM+XHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBhbGlnbi1pdGVtcy1sZy1jZW50ZXIgZmxleC1jb2x1bW4gZmxleC1sZy1yb3cgZ2FwLWxnLTAgZ2FwLTNcIlxyXG4gICAgICBbbmdDbGFzc109XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheSA/ICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbicgOiAnanVzdGlmeS1jb250ZW50LWVuZCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0wXCIgKm5nSWY9XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmNoYW5uZWxzXCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO21hcmdpbi1yaWdodDogMTBweDtcIj5cclxuICAgICAgICAgICAgPHNpbXBvLXNvY2lhLWljb25zIFtzb2NpYWxJY29uRGF0YV09XCJpdGVtXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIj48L3NpbXBvLXNvY2lhLWljb25zPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0FjdGlvbkJ0bj5cclxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXBhcmVudFwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm91dC1vZi1zdG9jayB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIj5PdXQgb2ZcclxuICAgICAgU3RvY2s8L2J1dHRvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIlxyXG4gICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZjXCJcclxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7cmVzcG9uc2VEYXRhPy5xdWFudGl0eX19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmIGVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiXHJcbiAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiXHJcbiAgICAgIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAoY2xpY2spPVwiIWVkaXQgPyBvcGVuRGlhbG9nQm94KGRpYWxvZ0JveCkgOiAnJ1wiPlxyXG4gICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxyXG4gICAgPGRpdiAqbmdJZj1cIighcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jaykgJiYgSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAgIChjbGljayk9XCIhZWRpdCA/IGFkZFRvQ2FydCgpIDogJydcIj48bWF0LWljb24+c2hvcHBpbmdfY2FydDwvbWF0LWljb24+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKCFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKSAmJiAhSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIiAoY2xpY2spPVwicmFpc2VMZWFkKClcIj48bWF0LWljb24gc3R5bGU9XCJoZWlnaHQ6MTRweCAhaW1wb3J0YW50XCI+XHJcbiAgICAgICAgICBtZXNzYWdlPC9tYXQtaWNvbj5Ob3RpZnkgTWU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZhdm91cml0ZVwiICpuZ0lmPVwiSXNFY29tbWVyY2VcIiAoY2xpY2spPVwiaXNJdGVtQXNGYXZvcml0ZSA/IHJlbW92ZVRvRmF2b3VyaXRlKCkgOiBhZGRUb0Zhdm91cml0ZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoYXJlLWljb25cIiAoY2xpY2spPVwic2hhcmVQcm9kdWN0KClcIj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+c2hhcmU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3ZhcmlhbnRzPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5zdHlsZXM/LmN1c3RvbWl6YXRpb24gPT0gJ1N0eWxlMSdcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWtleVwiPnt7dmFyaWVudC5rZXl9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFyaWVudFZhbHVlIG9mIHZhcmllbnQudmFsdWVcIiBjbGFzcz1cInZhcmllbnQtdGFnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/ICd3aGl0ZScgOiBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmFyaWVudCh2YXJpZW50LmtleSwgdmFyaWVudFZhbHVlKVwiPnt7dmFyaWVudFZhbHVlIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uc3R5bGVzPy5jdXN0b21pemF0aW9uID09ICdTdHlsZTInICYmIHNlbGVjdGVkVmFyaWVudC5zaXplID4gMFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIHN0eWxlMi1jb250YWluZXIgdy0xMDBcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRWYXJpZW50IHwga2V5dmFsdWVcIiBjbGFzcz1cInB4LTMgcHktMiB2YXJpZW50LWl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzXT1cImdldENsYXNzKHNlbGVjdGVkVmFyaWVudClcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtaGVhZFwiPnt7aXRlbS5rZXkgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtdmFsdWUgdGV4dC1zdGFydCBmdy1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0udmFsdWUgfFxyXG4gICAgICAgICAgICB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBwLTBcIiBbY2xhc3NdPVwiZ2V0Q2xhc3Moc2VsZWN0ZWRWYXJpZW50KVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10ZXh0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMCBwLTJcIiBkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXHJcbiAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI29mZmNhbnZhc1JpZ2h0VmFyaWFudFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+Q1VTVE9NSVNFXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjUHJvZHVjdERlc2M+XHJcbiAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5mby1taW5pbWFsXCI+XHJcbiAgICA8IS0tIFRpdGxlIGFuZCBQcmljZSBSb3cgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGUtcHJpY2Utcm93LW1vZGVyblwiPlxyXG4gICAgICA8aDEgY2xhc3M9XCJwcm9kdWN0LXRpdGxlLW1vZGVyblwiPnt7cmVzcG9uc2VEYXRhPy5uYW1lfX08L2gxPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1wcmljZS1tb2Rlcm5cIj5cclxuICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImN1cnJlbmN5XCI+PC9zcGFuPiB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZX19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSYXRpbmcgUm93IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1yb3ctbW9kZXJuXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmF2ZXJhZ2VSYXRpbmdcIj5cclxuICAgICAgPHAtcmF0aW5nIFsobmdNb2RlbCldPVwicmVzcG9uc2VEYXRhLmF2ZXJhZ2VSYXRpbmdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtcmF0aW5nPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJhdGluZy1zY29yZVwiPnt7cmVzcG9uc2VEYXRhPy5hdmVyYWdlUmF0aW5nIHwgbnVtYmVyOicxLjEtMSd9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj58PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJldmlld3MtbGlua1wiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgICAge3tyZXNwb25zZURhdGE/LnRvdGFsUmV2aWV3Q291bnR9fSByZXZpZXdzPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBCcmllZiBEZXNjcmlwdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWJyaWVmLW1vZGVyblwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5icmllZlwiIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5icmllZiB8IHNhbml0aXplSHRtbFwiPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Rlc2NyaXB0b3JzPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgcHJvZC1kZXNjIG10LTJcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGV4dFwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yIHx8IHJlc3BvbnNlRGF0YT8ubWF0ZXJpYWxzXCI+UHJvZHVjdCBEZXRhaWxzPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZWJyZWFrdXAtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAqbmdJZj1cInN1YkluZHVzdHJ5TmFtZSA9PSAnRWNvbW1lcmNlIEpld2VsbGVyeSdcIiBkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXHJcbiAgICAgICAgICBkYXRhLWJzLXRhcmdldD1cIiNvZmZjYW52YXNSaWdodFByaWNlQnJlYWt1cFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+IFBSSUNFIEJSRUFLVVBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiIGNsYXNzPVwiYm9keS1sYXJnZSBicmllZi1kZXNjXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3JcIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3I/Lm5hbWUgfCBzYW5pdGl6ZUh0bWxcIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5jb2xvclwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YkluZHVzdHJ5TmFtZSA9PSAnRWNvbW1lcmNlIEpld2VsbGVyeSdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWxsZXJ5LXRhYmxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIHJlc3BvbnNlRGF0YT8ubWF0ZXJpYWxzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqZXdlbC1jb250YWluZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqZXdlbC1oZWFkZXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRIZWFkZXJDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxyXG4gICAgICAgICAgICAgICAge3tlbGU/Lm1hdGVyaWFsTmFtZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1ldGFsLXB1cml0eVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIE5ldCBXZWlnaHQve3tlbGU/LnVuaXQgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tlbGUucXVhbnRpdHkgKyBcIiBcIiArIChlbGU/LnVuaXQgfCB0aXRsZWNhc2UpfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtZXRhbC1wdXJpdHlcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICBQdXJpdHlcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZWxlLnB1cml0eSB8XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVjYXNlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJpY2UvR3JhbVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5e3sgZ2V0UHJpY2VQZXJHcmFtKGVsZS5wcmltYXJ5TWF0ZXJpYWxXZWlnaHQsZWxlLm1hdGVyaWFsUHJpY2UpIHxcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICBWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5e3tlbGUubWF0ZXJpYWxQcmljZSB8IG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJqZXdlbC1jb250YWluZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtaGVhZGVyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0SGVhZGVyQ29sb3IoJ01ha2luZyBDaGFyZ2VzJylcIj5cclxuICAgICAgICAgICAgICBNYWtpbmcgQ2hhcmdlc1xyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcignTWFraW5nIENoYXJnZXMnKVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgTmV0IFdlaWdodFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZXNwb25zZURhdGE/LmJhc2VXZWlnaHR9fSA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIE1ha2luZyBDaGFyZ2UgJVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZXNwb25zZURhdGE/Lm1ha2luZ0NoYXJnZVBlcmNlbnRhZ2V9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICBWYWx1ZVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAg4oK5e3tyZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwidGFiLWdyb3VwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGhyZWY9XCIjY29sbGFwc2VFeGFtcGxlXCIgPkRlc2NyaXB0aW9uPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgY2xhc3M9XCJib2R5LWxhcmdlIGNvbGxhcHNlXCIgaWQ9XCJjb2xsYXBzZUV4YW1wbGVcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvclwiXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZVwiPjwvZGl2PiAtLT5cclxuICA8L2Rpdj5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0ltYWdlU2VjdGlvbj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXZhcmllbnRMb2FkaW5nICYmIChpc01vYmlsZSB8fCBkYXRhPy5zdHlsZXM/LmdyaWRTdHlsZSA9PSAnU3R5bGUxJylcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdHlsZS0xLXZlcnRpY2FsIGQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWFpbi1pbWFnZS1jb250YWluZXIgcC0wXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taW1nIHJvdW5kZWQtM1wiPlxyXG4gICAgICAgICAgPGxpYi1uZ3gtaW1hZ2Utem9vbSAqbmdJZj1cImN1cnJlbnRJbWdcIiBbdGh1bWJJbWFnZV09XCJjdXJyZW50SW1nXCIgW2Z1bGxJbWFnZV09XCJjdXJyZW50SW1nXCIgW3pvb21Nb2RlXT1cIidob3ZlcidcIlxyXG4gICAgICAgICAgICBbbWFnbmlmaWNhdGlvbl09XCIyXCIgW2VuYWJsZVNjcm9sbFpvb21dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPC9saWItbmd4LWltYWdlLXpvb20+XHJcbiAgICAgICAgICA8aW1nICpuZ0lmPVwiIWN1cnJlbnRJbWdcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMCBvYmplY3QtZml0LWNvdmVyXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsLXJvdyBweS0zIGQtZmxleCBnYXAtMiBvdmVyZmxvdy1hdXRvIGhpZGUtc2Nyb2xsXCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImltZyB0aHVtYm5haWwtaW1nXCIgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzXCIgW3NyY109XCJpbWcuaW1nVXJsXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiXHJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlLXRodW1iXT1cImN1cnJlbnRJbWcgPT0gaW1nLmltZ1VybFwiXHJcbiAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWluLXdpZHRoOiA4MHB4OyB3aWR0aDogODBweDsgaGVpZ2h0OiA4MHB4OyBvYmplY3QtZml0OiBjb3ZlcjsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFyaWVudExvYWRpbmcgJiYgKCFpc01vYmlsZSAmJiBkYXRhPy5zdHlsZXM/LmdyaWRTdHlsZSA9PSAnU3R5bGUyJylcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJiZW50by1tYXNvbnJ5LWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiYmVudG8taXRlbS1tb2Rlcm5cIiBbY2xhc3MuZmVhdHVyZWRdPVwiaSA9PT0gMFwiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJpbWcuaW1nVXJsXCIgY2xhc3M9XCJiZW50by1pbWctbW9kZXJuXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAqbmdJZj1cInZhcmllbnRMb2FkaW5nXCI+XHJcbiAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzEwcHgnXHJcbiAgICB9XCI+XHJcbiAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2JyYW5kaW5nPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5kIG9mIGJyYW5kUHJvbWlzZXNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZy0yXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxyXG4gICAgICAgICAgW3NyY109XCJicmFuZD8ubG9nb1VybFwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTQwIHAtMCByb3VuZGVkLWNpcmNsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC10ZXh0IHctMTAwIHRleHQtY2VudGVyIHB5LTJcIj5cclxuICAgICAgICAgIHt7YnJhbmQ/LnRpdGxlIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdmlkZW9DYWxsU2NoZWR1bGU+XHJcbiAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgLS0+XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgdmlkZW8tY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCB2aWRlby1jYWxsLWltZ1wiPlxyXG4gICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNTUwMDdjMTc1MzYyMDc3MjY2NjExMjg5LTIyOTIyMTAyM19zbWFsbC5naWZcIlxyXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBoLTEwMCBcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBhbGlnbi1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1oZWFkLXRleHRcIj5cclxuICAgICAgICAgIExpdmUgVmlkZW8gQ2FsbFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dFwiPlxyXG4gICAgICAgICAgSm9pbiBhIGxpdmUgdmlkZW8gY2FsbCB3aXRoIG91ciBjb25zdWx0YW50cyB0byBzZWUgeW91ciBmYXZvdXJpdGUgZGVzaWducyB1cCBjbG9zZSFcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2NoLWJ0biB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMilcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMilcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgyKVwiIChjbGljayk9XCIhZWRpdCA/IG9wZW5EaWFsb2dCb3goZGlhbG9nQm94KSA6ICcnXCI+XHJcbiAgICAgICAgICBTY2hlZHVsZSBhIFZpZGVvIENhbGxcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjRGVsaXZlcnlTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1jb250YWluZXJcIj5cclxuICAgIDxoMiBjbGFzcz1cImRlbGl2ZXJ5LXRpdGxlXCI+RGVsaXZlcnksIFN0b3JlcyAmIFRyaWFsPC9oMj5cclxuXHJcbiAgICA8IS0tIExvY2F0aW9uIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tc2VjdGlvbiBtYi0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWdyb3ctMSBtZS0yXCIgc3R5bGU9XCJ3aWR0aDogY2FsYygxMDAlIC0gMTAwcHgpO1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBteC0xXCI+PG1hdC1pY29uXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJncHMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInBvc3RhbC1jb2RlLWlucHV0IGZsZXgtZ3Jvdy0xXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW5Db2RlXCIgWyhuZ01vZGVsKV09XCJwaW5jb2RlXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGxvY2F0ZS1idG5cIiAoY2xpY2spPVwiZ2V0U3RvcmVEZXRhaWxzKClcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNQaW5Db2RlXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiPlBpbiBjb2RlIG11c3QgYmUgNiBkaWdpdHMuPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHBpbmNvZGU/LnRvU3RyaW5nKCkubGVuZ3RoID8/IDApID09IDZcIj5cclxuICAgICAgPCEtLSBGcmVlIERlbGl2ZXJ5IFNlY3Rpb24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktaWNvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci1naWZ0XCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjIwIDEyIDIwIDIyIDQgMjIgNCAxMlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiN1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCI1XCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjIyXCIgeDI9XCIxMlwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDdINy41YTIuNSAyLjUgMCAwIDEgMC01QzExIDIgMTIgNyAxMiA3elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDdoNC41YTIuNSAyLjUgMCAwIDAgMC01QzEzIDIgMTIgNyAxMiA3elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlDaGFyZ2VzID09IDBcIj5FeHBlY3RlZFxyXG4gICAgICAgICAgICBEZWxpdmVyeSBieSB7eyBnZXREYXRlQWZ0ZXJ4RGF5cygpIHwgZGF0ZTonZCBNTU0nIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktdGV4dFwiICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyA+IDBcIj5Zb3VyXHJcbiAgICAgICAgICAgIGV4cGVjdGVkIE9yZGVyIHdpbGxcclxuICAgICAgICAgICAgRGVsaXZlciBieSB7eyBnZXREYXRlQWZ0ZXJ4RGF5cygpIHwgZGF0ZTonZCBNTU0nIH19IHdpdGggYSBEZWxpdmVyeSBDaGFyZ2Ugb2ZcclxuICAgICAgICAgICAg4oK5IHt7ZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyB8IG51bWJlcjonMS4yLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNUcnlBdEhvbWU+XHJcbiAgPCEtLSBUcnkgQXQgSG9tZSBTZWN0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1zZWN0aW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IHRyeS1ob21lLWl0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJob21lLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItaG9tZVwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0zIDlsOS03IDkgN3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiOSAyMiA5IDEyIDE1IDEyIDE1IDIyXCI+PC9wb2x5bGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJ5LWhvbWUtZGV0YWlsc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJ5LWhvbWUtdGV4dFwiPlRyeSBBdCBIb21lPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcmVlLXRleHRcIj4gKEl0J3MgRnJlZSk8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtYXBwb2ludG1lbnQtdGV4dFwiPkhvbWUgQXBwb2ludG1lbnQgPHNwYW4+QXZhaWxhYmxlIHRvIHRyeSBmcm9tIDI5IEp1bDwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgSG9tZSBBcHBvaW50bWVudCA8c3BhbiBjbGFzcz1cImFwcG9pbnRtZW50LWF2YWlsYWJsZVwiPkF2YWlsYWJsZSB0byB0cnkgZnJvbSAyOCBKdW48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgtYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJvb2stYXBwb2ludG1lbnQtYnRuXCIgKGNsaWNrKT1cImFkZFRvVHJpYWxDYXJ0KClcIiAqbmdJZj1cIiFpc0l0ZW1BZGRlZEFzVHJpYWxcIj5UcnkgYXRcclxuICAgICAgICBIT01FPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJib29rLWFwcG9pbnRtZW50LWJ0blwiICpuZ0lmPVwiaXNJdGVtQWRkZWRBc1RyaWFsXCI+SE9NRSBBUFBPSU5UTUVOVCBCT09LRUQ8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU3RvcmVTZWN0aW9uPlxyXG4gIDwhLS0gTmVhcmVzdCBTdG9yZSBTZWN0aW9uIC0tPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0lmPVwic3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVOYW1lICYmIHN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LnN0b3JlTmFtZT8ubGVuZ3RoID4gMDtlbHNlIGVtcHR5U3RvcmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1zZWN0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHN0b3JlLWl0ZW1cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgPHN2ZyBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItc2hvcHBpbmctYmFnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAyTDMgNnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJWNmwtMy00elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIzXCIgeTE9XCI2XCIgeDI9XCIyMVwiIHkyPVwiNlwiPjwvbGluZT5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNiAxMGE0IDQgMCAwIDEtOCAwXCI+PC9wYXRoPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1kZXRhaWxzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtdGV4dFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWxhYmVsXCI+TmVhcmVzdCBTdG9yZSAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdG9yZS1uYW1lXCI+e3sgc3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVOYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJzdG9yZS1kaXN0YW5jZVwiPiAoNGttKTwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImF2YWlsYWJpbGl0eS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmFpbGFiaWxpdHktYmFkZ2VcIj7ij7AgQVZBSUxBQkxFIEJZIDI4IEpVTjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwib3RoZXItc3RvcmVzLXRleHRcIj5cclxuICAgICAgICAgICAgICBBbHNvIEF2YWlsYWJsZSBpbiA8c3BhbiBjbGFzcz1cIm90aGVyLXN0b3Jlcy1saW5rXCI+MTggb3RoZXIgc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZmluZC1zdG9yZS1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxyXG4gICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIiAoY2xpY2spPVwib25GaW5kSW5TdG9yZShzdG9yZURldGFpbHM/Lm5lYXJieVN0b3JlPy5pZClcIj5GSU5EIElOXHJcbiAgICAgICAgICBTVE9SRTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy10ZW1wbGF0ZSAjZW1wdHlTdG9yZT5cclxuICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1zZWN0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS1pY29uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwiZmVhdGhlciBmZWF0aGVyLXNob3BwaW5nLWJhZ1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTYgMkwzIDZ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yVjZsLTMtNHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiM1wiIHkxPVwiNlwiIHgyPVwiMjFcIiB5Mj1cIjZcIj48L2xpbmU+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYgMTBhNCA0IDAgMCAxLTggMFwiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LXRleHRcIj5ObyBTdG9yZXMgYXJlIGF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cIm9mZmNhbnZhcyBvZmZjYW52YXMtZW5kIG9mZmNhbnZhcy12YXJpYW50XCIgdGFiaW5kZXg9XCItMVwiIGlkPVwib2ZmY2FudmFzUmlnaHRWYXJpYW50XCJcclxuICBhcmlhLWxhYmVsbGVkYnk9XCJvZmZjYW52YXNSaWdodExhYmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmcy01XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHB4LTMgcGItMlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInByaWNlLXRleHRcIj5QcmljZTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCAgZy0zIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIiBbbmdDbGFzc109XCJ7J2Rpc2NvdW50LXByaWNlJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiXHJcbiAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgJiYgcmVzcG9uc2VEYXRhLnByaWNlLmRpc2NvdW50ZWRQcmljZSA+IDBcIj48c3BhblxyXG4gICAgICAgICAgW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9fTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIlxyXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlICYmIGdldERpZmZlcmVuY2UocmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlLCByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UpID4gMlwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LWRlY29yYXRpb24tbGluZS10aHJvdWdoJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiPjxzcGFuXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4wLTAnfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWNvbnRhaW5lciBoLTEwMCBwLTNcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidmFyaWVudC1kYXRhXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQta2V5XCI+e3t2YXJpZW50LmtleX19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YXJpZW50VmFsdWUgb2YgdmFyaWVudC52YWx1ZVwiIGNsYXNzPVwidmFyaWVudC10YWdcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gJ3doaXRlJyA6IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWYXJpZW50KHZhcmllbnQua2V5LCB2YXJpZW50VmFsdWUpXCI+e3t2YXJpZW50VmFsdWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb25maXJtLWJ0biB3LTEwMCBwLTMgdGV4dC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIHN0eWxlPVwiY29sb3I6IHdoaXRlO1wiPkNvbmZpcm1cclxuICAgIEN1c3RvbWl6YXRpb248L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2RpYWxvZ0JveD5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbS1jZW50ZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmctdmlkZW8gdy0xMDAgcHktMiB0ZXh0LWNlbnRlclwiPkxpdmUgVmlkZW8gY2FsbCBhdCB5b3VyIGNvbnZlbmllbmNlITwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2NoZWR1bGUtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cIm1hdENsb3NlRGlhbG9nKClcIlxyXG4gICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZnMtNVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGgtMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaC0xMDAgdy0xMDAgdmlkZW8tY2FsbC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgaC0xMDBcIiAqbmdJZj1cIiFpc01vYmlsZVwiPlxyXG4gICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzU1NzY5OWMxNzUzNzc5NTAzOTEzZnJlZXBpay1vdmVyaGVhZC1zaG90LWEtcGVyc29uLWhvbGRpbmctYS1zbWFydHBob25lLXdpdGgtYS0xMDI5X3ZtZzhHcUhqIChvbmxpbmUtdmlkZW8tY3V0dGVyLmNvbSkuZ2lmXCJcclxuICAgICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiIHN0eWxlPVwib2JqZWN0LWZpdDogY292ZXI7XCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHBvc2l0aW9uLXJlbGF0aXZlIGgtMTAwIGNhbGwtZGV0YWlsc1wiPlxyXG4gICAgICAgICAgPCEtLSBOYW1lIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnVzZXJuYW1lXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgTmFtZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWVcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCd1c2VybmFtZScpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5lbWFpbFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBFbWFpbCpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQuZW1haWxcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCdlbWFpbCcpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBOdW1iZXIgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsXCI+SU4gKzkxPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBNb2JpbGUqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlclwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ21vYmlsZU51bWJlcicpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBQaW5jb2RlIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0LWNhbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMiBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImYtMTggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW4gQ29kZSpcIiBjbGFzcz1cInctODhcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQucGluY29kZVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ3BpbmNvZGUnKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10ZXh0IG1iLTJcIj5MYW5ndWFnZSBQcmVmZXJlbmNlPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1jb250YWluZXIgZC1mbGV4IGdhcC0yIGZsZXgtd3JhcCBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5nIHB4LTIgcHktMSByb3VuZGVkIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGFuZyA9PSBzZWxlY3RlZExhbmcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRMYW5nID0gbGFuZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJsYW5nID09IHNlbGVjdGVkTGFuZyA/IGdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKSA6ICcjMDAwMDAwJ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7e2xhbmd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPdGhlciBMYW5ndWFnZVwiIFsobmdNb2RlbCldPVwib3RoZXJMYW5ndWFnZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInZpZGVvLWJ0biBtdC0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIFtkaXNhYmxlZF09XCJpc1N1Ym1pdHRpbmdcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3VibWl0dGluZ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFNDSEVEVUxJTkcuLi5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNTdWJtaXR0aW5nICYmICFzY2hlZHVsZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJzY2hlZHVsZVZpZGVvQ2FsbCgpXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+dmlkZW9fY2FsbDwvbWF0LWljb24+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICBTQ0hFRFVMRSBBIFZJREVPIENBTExcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzY2hlZHVsZWRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj4mbmJzcDtcclxuICAgICAgICAgICAgICBTQ0hFRFVMRUQgU1VDQ0VTU0ZVTExZXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwib2ZmY2FudmFzIG9mZmNhbnZhcy1lbmQgb2ZmY2FudmFzLXNtYWxsIG92ZXJmbG93LXNjcm9sbFwiIHRhYmluZGV4PVwiLTFcIiBpZD1cIm9mZmNhbnZhc1JpZ2h0UHJpY2VCcmVha3VwXCI+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmcy01XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHAtMTAtMjBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwcmljZS1icmVhay1oZWFkZXJcIj57e3Jlc3BvbnNlRGF0YT8ubmFtZX19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInByaWNlLWJyZWFrdXAgaC0xMDAgdy0xMDBcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtY29udGFpbmVyIG1iLTMgcC0xMC0yMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICB7eyBlbGUubWF0ZXJpYWxUeXBlICsgXCIgQlJFQUtVUFwiIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBoZWFkZXItcm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj5DT01QT05FTlQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPlJBVEU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPldFSUdIVDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+RklOQUwgVkFMVUU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHZhbHVlLXJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+e3sgZWxlLnB1cml0eSB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+4oK5e3sgZ2V0UHJpY2VQZXJHcmFtKGVsZS5wcmljZVBlclVuaXQsZWxlLm1hdGVyaWFsVHlwZSkgfFxyXG4gICAgICAgICAgICBudW1iZXI6JzEuMi0yJyB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+e3tlbGUucXVhbnRpdHkgKyAnICcgKyAoZWxlLnVuaXQgfCB0aXRsZWNhc2UpfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlciB0b3RhbFwiPuKCuXt7IGVsZS5wcmljZVBlclVuaXQgKiBlbGUucXVhbnRpdHkgfCBudW1iZXIgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtY29udGFpbmVyIG1iLTMgcC0xMC0zMCBweS0wIGJvcmRlci11bnNldFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5NYWtpbmcgQ2hhcmdlczwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LWVuZCB0b3RhbFwiPuKCuXt7IHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ubWFraW5nQ2hhcmdlQW1vdW50IHwgbnVtYmVyOicxLjItMicgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgc3VtbWFyeS1yb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1zdGFydFwiPlRheCBBbW91bnQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnRheEFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5Ub3RhbCBBbW91bnQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj5cclxuICAgICAgICAgIOKCuXt7KHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ucHJpY2VXaXRob3V0VGF4ICsgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQpIHxcclxuICAgICAgICAgIG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNSZXZpZXdzU2VjdGlvbj5cclxuICA8ZGl2IGNsYXNzPVwicnYtc2VjdGlvblwiICpuZ0lmPVwicmV2aWV3c0RhdGFcIj5cclxuXHJcbiAgICA8IS0tIEhlYWRlcjogVGl0bGUgKyBBdmVyYWdlIHwgQmFyIENoYXJ0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ2LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtaGVhZGVyLWxlZnRcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJydi10aXRsZVwiPlJldmlld3MgJmFtcDsgUmF0aW5nczwvaDI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWF2ZXJhZ2Utcm93XCI+XHJcbiAgICAgICAgICA8IS0tIGZpbGxlZCBzdGFycyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1zdGFyc1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDIsMyw0LDVdXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWF2Zy1udW1cIj57e3Jlc3BvbnNlRGF0YT8uYXZlcmFnZVJhdGluZyB8IG51bWJlcjonMS4xLTEnfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWF2Zy1sYWJlbFwiPmF2ZXJhZ2U8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWNvdW50XCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgfHwgJyMxMGI5ODEnXCI+XHJcbiAgICAgICAgICB7e3Jlc3BvbnNlRGF0YT8udG90YWxSZXZpZXdDb3VudCB8IG51bWJlcn19IFJldmlld3NcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiBbNSw0LDMsMiwxXVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWJhci1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1iYXItbGFiZWxcIj57e3JhdGluZ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xMy45NzE4IDUuMzY0NTNDMTMuOTM5OCA1LjI2Mjk4IDEzLjg3OTggNS4xNzI1MiAxMy43OTg2IDUuMTAzNTZDMTMuNzE3NSA1LjAzNDYgMTMuNjE4NiA0Ljk4OTk0IDEzLjUxMzIgNC45NzQ3Mkw5LjM3MDQzIDQuMzcwODhMNy41MTMwNyAwLjYxNzk1NUM3LjQ2MDIxIDAuNTI5MjcxIDcuMzg1MjIgMC40NTU4MzQgNy4yOTU0NSAwLjQwNDgzNkM3LjIwNTY4IDAuMzUzODM4IDcuMTA0MiAwLjMyNzAyNiA3LjAwMDk2IDAuMzI3MDI2QzYuODk3NzEgMC4zMjcwMjYgNi43OTYyNCAwLjM1MzgzOCA2LjcwNjQ3IDAuNDA0ODM2QzYuNjE2NyAwLjQ1NTgzNCA2LjU0MTcxIDAuNTI5MjcxIDYuNDg4ODUgMC42MTc5NTVMNC42MzE0OSA0LjM3MDg4TDAuNDg4NzQ2IDQuOTc0NzJDMC4zODMzNjMgNC45ODk5NCAwLjI4NDQxNiA1LjAzNDYgMC4yMDMyODYgNS4xMDM1NkMwLjEyMjE1NyA1LjE3MjUyIDAuMDYyMTQwNyA1LjI2Mjk4IDAuMDMwMTQgNS4zNjQ1M0MtMC4wMDQwMjI4NiA1LjQ2NTcxIC0wLjAwOTI0NDI4IDUuNTc0NDIgMC4wMTUwNjQ1IDUuNjc4NDFDMC4wMzkzNzMzIDUuNzgyNCAwLjA5MjI0NTcgNS44Nzc1MyAwLjE2NzcyMiA1Ljk1MzA4TDMuMTc5MjQgOC44NzI4N0wyLjQ2ODQgMTMuMDAwM0MyLjQ1MDM4IDEzLjEwNjYgMi40NjIyOSAxMy4yMTU4IDIuNTAyNzggMTMuMzE1N0MyLjU0MzI4IDEzLjQxNTYgMi42MTA3NyAxMy41MDIyIDIuNjk3NyAxMy41NjU5QzIuNzg0NzcgMTMuNjI4IDIuODg3NDYgMTMuNjY0NCAyLjk5NDE2IDEzLjY3MTJDMy4xMDA4NyAxMy42NzggMy4yMDczMyAxMy42NTQ3IDMuMzAxNTMgMTMuNjA0Mkw3LjAwMDk2IDExLjY1NTFMMTAuNzA4IDEzLjYwNDJDMTAuNzkgMTMuNjQ5MSAxMC44ODIgMTMuNjcyOCAxMC45NzU1IDEzLjY3M0MxMS4wOTU4IDEzLjY3MTYgMTEuMjEyOSAxMy42MzQzIDExLjMxMTkgMTMuNTY1OUMxMS4zOTg4IDEzLjUwMjIgMTEuNDY2MyAxMy40MTU2IDExLjUwNjggMTMuMzE1N0MxMS41NDczIDEzLjIxNTggMTEuNTU5MiAxMy4xMDY2IDExLjU0MTIgMTMuMDAwM0wxMC44MjI3IDguODcyODdMMTMuODI2NiA1Ljk1MzA4QzEzLjkwMzMgNS44NzgzNSAxMy45NTc3IDUuNzgzNiAxMy45ODMzIDUuNjc5NTdDMTQuMDA5IDUuNTc1NTQgMTQuMDA1IDUuNDY2NCAxMy45NzE4IDUuMzY0NTNaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjZWFiMzA4XCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1iYXItdHJhY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyLWZpbGxcIiBbc3R5bGUud2lkdGguJV09XCJnZXRQZXJjZW50YWdlKHJhdGluZylcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJldmlldyBDYXJkcyBHcmlkIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ2LWdyaWRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmV2aWV3IG9mIHJldmlld3NEYXRhXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJldmlldy5yZXZpZXdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkLXRvcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1yZXZpZXdlclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIidodHRwczovL3VpLWF2YXRhcnMuY29tL2FwaS8/bmFtZT0nICsgKHJldmlldz8udXNlck5hbWUgPz8gJ1UnKSArICcmYmFja2dyb3VuZD1yYW5kb20nXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJydi1hdmF0YXJcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1uYW1lLWRhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1uYW1lXCI+e3tyZXZpZXc/LnVzZXJOYW1lID8/ICdBbm9ueW1vdXMnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnYtZGF0ZVwiPnt7cmV2aWV3Py5jcmVhdGVkQXQgfCBkYXRlOidkIE1NTSB5J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSBTdGFyIHJhdGluZyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtY2FyZC1zdGFyc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwyLDMsNCw1XVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicyA8PSByZXZpZXcucmF0aW5nXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuOTcxOCA1LjM2NDUzQzEzLjkzOTggNS4yNjI5OCAxMy44Nzk4IDUuMTcyNTIgMTMuNzk4NiA1LjEwMzU2QzEzLjcxNzUgNS4wMzQ2IDEzLjYxODYgNC45ODk5NCAxMy41MTMyIDQuOTc0NzJMOS4zNzA0MyA0LjM3MDg4TDcuNTEzMDcgMC42MTc5NTVDNy40NjAyMSAwLjUyOTI3MSA3LjM4NTIyIDAuNDU1ODM0IDcuMjk1NDUgMC40MDQ4MzZDNy4yMDU2OCAwLjM1MzgzOCA3LjEwNDIgMC4zMjcwMjYgNy4wMDA5NiAwLjMyNzAyNkM2Ljg5NzcxIDAuMzI3MDI2IDYuNzk2MjQgMC4zNTM4MzggNi43MDY0NyAwLjQwNDgzNkM2LjYxNjcgMC40NTU4MzQgNi41NDE3MSAwLjUyOTI3MSA2LjQ4ODg1IDAuNjE3OTU1TDQuNjMxNDkgNC4zNzA4OEwwLjQ4ODc0NiA0Ljk3NDcyQzAuMzgzMzYzIDQuOTg5OTQgMC4yODQ0MTYgNS4wMzQ2IDAuMjAzMjg2IDUuMTAzNTZDMC4xMjIxNTcgNS4xNzI1MiAwLjA2MjE0MDcgNS4yNjI5OCAwLjAzMDE0IDUuMzY0NTNDLTAuMDA0MDIyODYgNS40NjU3MSAtMC4wMDkyNDQyOCA1LjU3NDQyIDAuMDE1MDY0NSA1LjY3ODQxQzAuMDM5MzczMyA1Ljc4MjQgMC4wOTIyNDU3IDUuODc3NTMgMC4xNjc3MjIgNS45NTMwOEwzLjE3OTI0IDguODcyODdMMi40Njg0IDEzLjAwMDNDMi40NTAzOCAxMy4xMDY2IDIuNDYyMjkgMTMuMjE1OCAyLjUwMjc4IDEzLjMxNTdDMi41NDMyOCAxMy40MTU2IDIuNjEwNzcgMTMuNTAyMiAyLjY5NzcgMTMuNTY1OUMyLjc4NDc3IDEzLjYyOCAyLjg4NzQ2IDEzLjY2NDQgMi45OTQxNiAxMy42NzEyQzMuMTAwODcgMTMuNjc4IDMuMjA3MzMgMTMuNjU0NyAzLjMwMTUzIDEzLjYwNDJMNy4wMDA5NiAxMS42NTUxTDEwLjcwOCAxMy42MDQyQzEwLjc5IDEzLjY0OTEgMTAuODgyIDEzLjY3MjggMTAuOTc1NSAxMy42NzNDMTEuMDk1OCAxMy42NzE2IDExLjIxMjkgMTMuNjM0MyAxMS4zMTE5IDEzLjU2NTlDMTEuMzk4OCAxMy41MDIyIDExLjQ2NjMgMTMuNDE1NiAxMS41MDY4IDEzLjMxNTdDMTEuNTQ3MyAxMy4yMTU4IDExLjU1OTIgMTMuMTA2NiAxMS41NDEyIDEzLjAwMDNMMTAuODIyNyA4Ljg3Mjg3TDEzLjgyNjYgNS45NTMwOEMxMy45MDMzIDUuODc4MzUgMTMuOTU3NyA1Ljc4MzYgMTMuOTgzMyA1LjY3OTU3QzE0LjAwOSA1LjU3NTU0IDE0LjAwNSA1LjQ2NjQgMTMuOTcxOCA1LjM2NDUzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicyA+IHJldmlldy5yYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cIm9wYWNpdHk6MC4yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNlYWIzMDhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJydi10ZXh0XCI+e3tyZXZpZXc/LnJldmlldyA/PyAnTm8gY29tbWVudCBwcm92aWRlZC4nfX08L3A+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFJldmlldyBJbWFnZXMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1pbWFnZXNcIiAqbmdJZj1cInJldmlldz8ucmV2aWV3SW1hZ2VzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8YSAqbmdGb3I9XCJsZXQgaW1nIG9mIHJldmlldy5yZXZpZXdJbWFnZXNcIiBbaHJlZl09XCJpbWcuaW1nVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJydi1pbWctbGlua1wiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJSZXZpZXcgaW1hZ2VcIiBjbGFzcz1cInJ2LWltZy10aHVtYlwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC00XCIgKm5nSWY9XCIocmV2aWV3c0RhdGE/Lmxlbmd0aCA/PyAwKSA+IDNcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIndyaXRlLXJldmlldy1idG5cIiAoY2xpY2spPVwibG9hZE1vcmVSZXZpZXdzKClcIj5Mb2FkIE1vcmUgUmV2aWV3czwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiZXhhbXBsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCIgcm9sZT1cImRpYWxvZ1wiXHJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgdmlkZW8tbW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgPHZpZGVvIGNvbnRyb2xzIG11dGVkIHBsYXlzaW5saW5lIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgIDxzb3VyY2VcclxuICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNzE2NDdjMTc1Mzk2MjA4NDI2NWNsaWRlb19lZGl0b3JfNDhiYzkzYzI0ZTE4NDcwODg4YzY2MWJiMDllNDM3ZGEgKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5tcDRcIlxyXG4gICAgICAgICAgICB0eXBlPVwidmlkZW8vbXA0XCI+XHJcbiAgICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxyXG4gICAgICAgIDwvdmlkZW8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInJldmlld01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInJldmlld01vZGFsTGFiZWxcIiByb2xlPVwiZGlhbG9nXCJcclxuICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHJldmlldy1tb2RhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1vZGFsLXRpdGxlIGZzLTVcIj48L2gxPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yZXZpZXctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utc2VjdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWNrd2FyZC1hcnJvdyBhcnJvd1wiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGN1cnJlbnRJbWFnZUluZGV4LTFcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50SW1hZ2VJbmRleCA+IDBcIj7ilrw8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic2VsZWN0ZWRSZXZpZXc/LnJldmlld0ltYWdlcz8uW2N1cnJlbnRJbWFnZUluZGV4XT8uaW1nVXJsXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcndhcmQtYXJyb3cgYXJyb3dcIiAoY2xpY2spPVwiY3VycmVudEltYWdlSW5kZXggPSBjdXJyZW50SW1hZ2VJbmRleCsxXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEltYWdlSW5kZXggPCBzZWxlY3RlZFJldmlldz8uaW1hZ2VzPy5sZW5ndGggLSAxXCI+4payPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZWFyYnVkcy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFyZ2luZy1jYXNlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFyYnVkIGxlZnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJidWQgcmlnaHRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uLWFycm93c1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXdlci1hdmF0YXJcIj7wn5GkPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLW5hbWVcIj57e3NlbGVjdGVkUmV2aWV3Py51c2VyTmFtZSA/PyBcIi1cIn19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yYXRpbmdcIiAqbmdJZj1cInNlbGVjdGVkUmV2aWV3Py5yYXRpbmdcIj5cclxuICAgICAgICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFJldmlldy5yYXRpbmdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtcmF0aW5nPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctZGF0ZVwiPlxyXG4gICAgICAgICAgICAgIFJldmlld2VkIGluIEluZGlhIG9uIDI0IEp1bHkgMjAyNVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctdGV4dFwiPlxyXG4gICAgICAgICAgICAgIHt7c2VsZWN0ZWRSZXZpZXc/LnJldmlldyA/PyBcIi1cIn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlcy1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPGgzPkltYWdlcyBpbiB0aGlzIHJldmlldzwvaDM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy1pbWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctaW1hZ2VcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogY3VycmVudEltYWdlSW5kZXggPT0gaX1cIlxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1nIG9mIHNlbGVjdGVkUmV2aWV3Py5yZXZpZXdJbWFnZXMgPz8gW107bGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGlcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
989
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBMEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxxQkFBcUIsRUFBbUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXpGLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU1qRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQs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WCxtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQiwwQkFBMEI7d0JBQzFCLGdCQUFnQjt3QkFDaEIsdUJBQXVCO3FCQUN4QixhQUNVLENBQUMsY0FBYyxDQUFDOzswQkFrQ3hCLE1BQU07MkJBQUMsV0FBVztnWUE3QmtDLGVBQWU7c0JBQXJFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUUzQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0EsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBRWpCLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQWdXTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgUExBVEZPUk1fSUQsIFJlbmRlcmVyMiwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9kdWN0RGVzY01vZGFsLCBQcm9kdWN0RGVzY1N0eWxlc01vZGFsIH0gZnJvbSAnLi9wcm9kdWN0LWRlc2MubW9kYWwnO1xyXG5pbXBvcnQgeyBjaGVja0l0ZW1BbHJlYWR5QWRkZWQsIEl0ZW1JbWFnZSwgSXRlbVZhcmlhbnQsIFByb2R1Y3QgfSBmcm9tICcuLi8uLi9zdHlsZXMvcHJvZHVjdC5tb2RhbCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1kaXJlY3RpdmUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZE1vZGVsLCBCdXR0b25Nb2RlbCwgTGF5T3V0TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xyXG5pbXBvcnQgQmFzZVNlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc2VjdGlvbnMvQmFzZVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTmd4SW1hZ2Vab29tTW9kdWxlIH0gZnJvbSAnbmd4LWltYWdlLXpvb20nO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RzQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RNb2RhbCB9IGZyb20gJy4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLm1vZGFsJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vLi4vc3R5bGVzL09yZGVyZWRJdGVtcy5tb2RhbCc7XHJcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBJdGVtVmFyaWVudENvbXBvbmVudCB9IGZyb20gJy4uL2l0ZW0tdmFyaWVudC9pdGVtLXZhcmllbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcclxuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNpbXBvV3JhcENvbW50YWluZXIgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvd3JhcC1jb250YWluZXJzLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNvY2lhSWNvbnNDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9lbGVtZW50cy9zb2NpYS1pY29ucy9zb2NpYS1pY29ucy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSYXRpbmdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhdGluZyc7XHJcbmltcG9ydCB7IFJldmlldyB9IGZyb20gJy4uLy4uL3N0eWxlcy9yZXZpZXcubW9kYWwnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vc3R5bGVzL3VzZXIubW9kYWwnO1xyXG5pbXBvcnQgeyBTcGVlZERpYWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NwZWVkZGlhbCc7XHJcbmltcG9ydCB7IEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VjdGlvbnMvY3VzdG9tZXItcmV2aWV3L2N1c3RvbWVyLXJldmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYW5lbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcGFuZWwnO1xyXG5pbXBvcnQgeyBTdmdEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc3ZnLWRpdmlkZXIvc3ZnLWRpdmlkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29ybmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2Nvcm5lci1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBCdXR0b25FZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWVkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9zcGFjaW5nLWhvcml6b250YWwuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2FuaXRpemVIdG1sUGlwZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Nhbml0aXplSHRtbCc7XHJcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE5neFNrZWxldG9uTG9hZGVyTW9kdWxlIH0gZnJvbSAnbmd4LXNrZWxldG9uLWxvYWRlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXByb2R1Y3QtZGVzYycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIENvbG9yRGlyZWN0aXZlLFxyXG4gICAgLy9ESVJFQ1RJVkVcclxuICAgIFNpbXBvV3JhcENvbW50YWluZXIsXHJcbiAgICBCYWNrZ3JvdW5kRGlyZWN0aXZlLFxyXG4gICAgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlLFxyXG4gICAgQW5pbWF0aW9uRGlyZWN0aXZlLFxyXG4gICAgQ29udGVudEZpdERpcmVjdGl2ZSxcclxuICAgIEhvdmVyRGlyZWN0aXZlLFxyXG4gICAgTmd4SW1hZ2Vab29tTW9kdWxlLFxyXG4gICAgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCxcclxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxyXG4gICAgU29jaWFJY29uc0NvbXBvbmVudCxcclxuICAgIFJhdGluZ01vZHVsZSxcclxuICAgIFNwZWVkRGlhbE1vZHVsZSxcclxuICAgIFRvYXN0TW9kdWxlLFxyXG4gICAgQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsXHJcbiAgICBQYW5lbE1vZHVsZSxcclxuICAgIFN2Z0RpdmlkZXJDb21wb25lbnQsXHJcbiAgICBDb3JuZXJEaXJlY3RpdmUsXHJcbiAgICBCdXR0b25FZGl0b3JEaXJlY3RpdmUsXHJcbiAgICBTcGFjaW5nSG9yaXpvbnRhbERpcmVjdGl2ZSxcclxuICAgIFNhbml0aXplSHRtbFBpcGUsXHJcbiAgICBOZ3hTa2VsZXRvbkxvYWRlck1vZHVsZVxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXNjQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24ge1xyXG4gIEBWaWV3Q2hpbGQoQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSByZXZpZXdDb21wb25lbnQhOiBDdXN0b21lclJldmlld0NvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYWJvdmVIZWlnaHQnKSBhYm92ZUhlaWdodCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlU2VjdGlvbicpIGltYWdlU2VjdGlvbiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2RldGFpbFNlY3Rpb24nKSBkZXRhaWxTZWN0aW9uITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIEBJbnB1dCgpIGRhdGE/OiBQcm9kdWN0RGVzY01vZGFsO1xyXG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YSE6IFByb2R1Y3Q7XHJcbiAgQElucHV0KCkgaW5kZXg/OiBudW1iZXI7XHJcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjdXN0b21DbGFzcz86IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgbmV4dENvbXBvbmVudENvbG9yPzogQmFja2dyb3VuZE1vZGVsO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmZWF0dXJlUHJvZHVjdERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIHJlY2VudFZpZXdlZERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIHZhcmllbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XHJcbiAgcHVibGljIHNlbGVjdGVkVmFyaWVudDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG4gIHB1YmxpYyByZWxhdGVkUHJvZHVjdERhdGE6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIHB1YmxpYyBwcm9kdWN0UmV2aWV3OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyB0b3RhbFJldmlldzogbnVtYmVyID0gNTtcclxuICBwdWJsaWMgc2hvd1JldmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFJldmlldzogYW55O1xyXG4gIHB1YmxpYyBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YVRhZ1NlcnZpY2U6IE1ldGEsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU2VydmljZTogVGl0bGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldCxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICBzdXBlcigpXHJcblxyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IFwiVGVzdGluZ1wiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp0aXRsZVwiLCBjb250ZW50OiBcIlRpdGxlXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOmltYWdlXCIsIGNvbnRlbnQ6IFwiaHR0cHM6Ly9kZXYtYmVlb3MuczMuYW1hem9uYXdzLmNvbS9saWJyYXJ5LW1lZGlhLzg0ODcyOGMxNzI2MDg2MDA5NjU2aW1hZ2VzLnBuZ1wiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzpkZXNjcmlwdGlvblwiLCBjb250ZW50OiBcIkRlc2NyaXB0aW9uXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnNpdGVfbmFtZVwiLCBjb250ZW50OiBcIm5hdHVyYWxzXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnR5cGVcIiwgY29udGVudDogXCJ3ZWJzaXRlXCIgfSk7XHJcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnVybFwiLCBjb250ZW50OiBcImh0dHBzOi8vbmF0dXJhbHMuZGV2LnNpbXBvLmFpL1wiIH0pO1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGJ1dHRvbklkPzogc3RyaW5nO1xyXG4gIGJ1dHRvbj86IEJ1dHRvbk1vZGVsXHJcbiAgc3R5bGVzPzogUHJvZHVjdERlc2NTdHlsZXNNb2RhbDtcclxuICBzdWJJbmR1c3RyeU5hbWU6IHN0cmluZyA9ICcnXHJcbiAgaXNJdGVtQXNGYXZvcml0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSXRlbUFkZGVkQXNUcmlhbDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBpdGVtSW1hZ2VzOiBJdGVtSW1hZ2VbXSA9IFtdO1xyXG4gIGl0ZW1zOiBNZW51SXRlbVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgYnVzaW5lc3NEZXRhaWxzOiBhbnk7XHJcbiAgdHJpYWxDYXJ0SXRlbTogYW55W10gPSBbXVxyXG5cclxuICBpc1BpbkNvZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHRvU2hvd0luSmV3ZWxsZXJ5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNFY29tbWVyY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdEZXRhaWxzJztcclxuXHJcbiAgY2hhbmdlVGFiKHRhYjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLmJ1c2luZXNzRGV0YWlscyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiRGV0YWlscycpXHJcbiAgICAvLyBpZih0aGlzLmJ1c2luZXNzRGV0YWlscyAhPSBudWxsKSB7XHJcbiAgICAvLyAgIHRoaXMuYnVzaW5lc3NEZXRhaWxzID0gSlNPTi5wYXJzZSh0aGlzLmJ1c2luZXNzRGV0YWlscyk7XHJcbiAgICAvLyAgIHRoaXMuc3ViSW5kdXN0cnlOYW1lID0gdGhpcy5idXNpbmVzc0RldGFpbHMuc3ViSW5kdXN0cnlOYW1lO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdjYXJhdGxhbmUnKSB8fCB3aW5kb3c/LmxvY2F0aW9uPy5vcmlnaW4/LmluY2x1ZGVzKCdvcnJhJykpIHtcclxuICAgICAgdGhpcy50b1Nob3dJbkpld2VsbGVyeSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRFY29tbWVyY2VDb25maWdzKCk7XHJcbiAgICB0aGlzLnN1YkluZHVzdHJ5TmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdWJJbmR1c3RyeU5hbWUnKSA/PyBcIlwiO1xyXG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcclxuICAgIHRoaXMucmVjZW50Vmlld2VkRGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEsIHRydWUpO1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlcyAmJiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlc1swXSAmJiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUltYWdlc1swXT8uaW1nVXJsKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmwgPz8gXCJcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1swXTtcclxuICAgIHRoaXMuYnV0dG9uSWQgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmlkIDogJycpICsgKHRoaXMuYnV0dG9uID8gdGhpcy5idXR0b24uaWQgOiAnJyk7XHJcblxyXG4gICAgdGhpcy5waW5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BpbmNvZGUnKTtcclxuICAgIGlmICh0aGlzLnBpbmNvZGUpIHtcclxuICAgICAgdGhpcy5nZXRTdG9yZURldGFpbHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgIC8vIHtcclxuICAgICAgLy8gICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXHJcbiAgICAgIC8vICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvd2lzaGxpc3QnXSk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlUHJvZHVjdCgpO1xyXG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICAgICAgLy8gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnQ29waWVkJywgZGV0YWlsOiAnWW91IGNhbiBzaGFyZSB0aGUgdXJsJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5Jc0Vjb21tZXJjZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwid2Vic2l0ZVR5cGVcIikgIT0gJ1NUQVRJQycgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RJZCA9IHFQYXJhbVtcImlkXCJdO1xyXG4gICAgICBpZiAocHJvZHVjdElkKSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBUcmFja2luZyBBbmFseXRpY3NcclxuICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc3RhcnROZXdDb250ZXh0KHtcclxuICAgICAgICAgICdQUk9EVUNUX0lEJzogcHJvZHVjdElkXHJcbiAgICAgICAgfSwgJ1BST0RVQ1RfVklFVycpXHJcblxyXG4gICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdERldGFpbHMocHJvZHVjdElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEgPSByZXNwb25zZVswXTtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudC5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCwgaWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgdmFyaWVudC5xdWFudGl0eSA9IDA7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgodmFyaWVudEtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KHZhcmllbnRLZXksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XSk7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KT8uaW5jbHVkZXModmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWVudHMuc2V0KHZhcmllbnRLZXksIFsuLi4odGhpcy52YXJpZW50cy5nZXQodmFyaWVudEtleSkgPz8gW10pLCB2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV1dKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5nZXRSZWxhdGVkUHJvZHVjdHMoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBpdGVtVmFyaWFudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICAgICAgaWYgKGl0ZW1WYXJpYW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWFudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSBpdGVtVmFyaWFudC52YXJpYW50SWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSh0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXM7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UmV2aWV3cyh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUlkKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJDYXJ0KCkudGhlbigoY2FydFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgY2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9IChjYXJ0RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWFudCAmJiBpdGVtLnZhcmllbnRJZCA9PSBpdGVtVmFyaWFudC52YXJpYW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgd2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAod2hpc2xpc3REYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHdoaXNsaXN0RGF0YS50YXJnZXQucmVzdWx0IGFzIHVua25vd24gYXMgT3JkZXJlZEl0ZW1zW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmlhbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFyaWFudCAmJiBpdGVtVmFyaWFudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhcmlhbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrSXRlbUFscmVhZHlBZGRlZEluVHJpYWwoKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsO1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb2R1Y3RCeUNhdGVnb3J5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIE9ubHkgYXR0YWNoIGN1c3RvbSBzY3JvbGwgbGlzdGVuZXJzIG9uIGRlc2t0b3Ag4oCUIG9uIG1vYmlsZSB0aGVzZSBjYW5cclxuICAgIC8vIGNhbGwgZS5wcmV2ZW50RGVmYXVsdCgpIGFuZCBibG9jayB0b3VjaC9jbGljayBldmVudHMgb24gdGhlIHRhYnMuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgYWJvdmUgPSB0aGlzLmFib3ZlSGVpZ2h0Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgaW1nRGl2ID0gdGhpcy5pbWFnZVNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkZXRhaWxEaXYgPSB0aGlzLmRldGFpbFNlY3Rpb24/Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgLy8gU3RlcCAxOiBzY3JvbGwgYmV0d2VlbiBpbWFnZSBhbmQgZGV0YWlsXHJcbiAgICBpbWdEaXY/LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgKGU6IFdoZWVsRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgYXRCb3R0b20gPSBpbWdEaXYuc2Nyb2xsVG9wICsgaW1nRGl2LmNsaWVudEhlaWdodCA+PSBpbWdEaXYuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICBjb25zdCBhdFRvcCA9IGltZ0Rpdi5zY3JvbGxUb3AgPT09IDA7XHJcblxyXG4gICAgICBpZiAoZS5kZWx0YVkgPiAwICYmIGF0Qm90dG9tKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGRldGFpbERpdi5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZS5kZWx0YVkgPCAwICYmIGF0VG9wKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGRldGFpbERpdi5zY3JvbGxUb3AgKz0gZS5kZWx0YVk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN0ZXAgMjogYWZ0ZXIgZGV0YWlsIHNlY3Rpb24sIGNvbnRpbnVlIHRvIFJldmlld3NcclxuICAgIGRldGFpbERpdj8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCAoZTogV2hlZWxFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBhdEJvdHRvbSA9IGRldGFpbERpdi5zY3JvbGxUb3AgKyBkZXRhaWxEaXYuY2xpZW50SGVpZ2h0ID49IGRldGFpbERpdi5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGF0VG9wID0gZGV0YWlsRGl2LnNjcm9sbFRvcCA9PT0gMDtcclxuXHJcbiAgICAgIGlmIChlLmRlbHRhWSA+IDAgJiYgYXRCb3R0b20pIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgfSBlbHNlIGlmIChlLmRlbHRhWSA8IDAgJiYgYXRUb3ApIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaW1nRGl2LnNjcm9sbFRvcCArPSBlLmRlbHRhWTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHZhcmllbnRMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVjZW50Vmlld0l0ZW1MaXN0OiBQcm9kdWN0W10gPSBbXTtcclxuICBnZXRSZWxhdGVkUHJvZHVjdHMoKSB7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcclxuICAgIGlmICghIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVjZW50Vmlld1Byb2R1Y3QodXNlckRldGFpbHMudXNlcklkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWNlbnRWaWV3SXRlbUxpc3QgPSByZXNwb25zZTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0VmFyaWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy52YXJpZW50TG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFyaWVudC5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KSA9PiB7XHJcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xyXG4gICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChmb3VuZFZhcmllbnQpIHtcclxuICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB2YXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmw7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucHJpY2UgPSB2YXJpZW50Lml0ZW1WYXJpYW50UHJpY2U7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IHZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQgPSB2YXJpZW50LnZhcmlhbnRJZDtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IHRoaXMuZ2V0VmFyaWVudFF1YW50aXR5KHZhcmllbnQpO1xyXG4gICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRoaXMuaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHZhcmllbnQpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tJdGVtQWxyZWFkeUFkZGVkSW5UcmlhbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG4gIHJhaXNlTGVhZCgpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSxcclxuICAgICAgZW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgbWVzc2FnZTogXCJcIixcclxuICAgICAgbW9iaWxlTm86IFwiXCIsXHJcbiAgICAgIG1vcmVJbmZvOiB7XHJcbiAgICAgICAgTmFtZTogdXNlckRldGFpbHM/LmNvbnRhY3Q/Lm5hbWUsXHJcbiAgICAgICAgXCJNb2JpbGUgTnVtYmVyXCI6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5tb2JpbGUsXHJcbiAgICAgICAgRW1haWw6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5lbWFpbCxcclxuICAgICAgICBcIkxlYWQgU291cmNlXCI6IFwiV2Vic2l0ZVwiLFxyXG4gICAgICAgIFwiTGVhZCBTdGF0dXNcIjogXCJORVdcIlxyXG4gICAgICB9LFxyXG4gICAgICBuYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jcmVhdGVMZWFkKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1RoYW5rIHlvdScsIGRldGFpbDogJ091ciB0ZWFtIHdpbGwgY29udGFjdCB5b3Ugc29vbicgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igb2NjdXJlZCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIGdldEl0ZW1WYXJpZW50KCk6IEl0ZW1WYXJpYW50IHwgbnVsbCB7XHJcbiAgICBsZXQgc2VsZWN0ZWRWYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCkgPT4ge1xyXG4gICAgICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgZm91bmRWYXJpZW50ID0gKHRoaXMuc2VsZWN0ZWRWYXJpZW50LmdldChwcm9wZXJ0eSkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xyXG4gICAgICB9KVxyXG4gICAgICBpZiAoZm91bmRWYXJpZW50KVxyXG4gICAgICAgIHNlbGVjdGVkVmFyaWVudCA9IHZhcmllbnQ7XHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBzZWxlY3RlZFZhcmllbnQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0l0ZW1BbHJlYWR5QWRkZWRJblRyaWFsKCkge1xyXG4gICAgbGV0IHVzZXI6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKClcclxuICAgIGlmICh1c2VyKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0OiBjaGVja0l0ZW1BbHJlYWR5QWRkZWQgPSBuZXcgY2hlY2tJdGVtQWxyZWFkeUFkZGVkKHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkLCB1c2VyLnVzZXJJZCwgJ1RSSUFMX0NBUlQnKVxyXG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmNoZWNrSXRlbUFscmVhZHlBZGRlZChyZXF1ZXN0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1BZGRlZEFzVHJpYWwgPSByZXMuZGF0YVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRUcmlhbENhcnRJbmRleERCRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VHJpYWxDYXJ0SW5kZXhEQkRhdGEoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFRyaWFsQ2FydCgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHJlc3BvbnNlLm9uc3VjY2VzcyA9ICh1c2VyVHJpYWxDYXJ0UmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB0cmlhbENhcnRJdGVtOiBPcmRlcmVkSXRlbXNbXSA9IHVzZXJUcmlhbENhcnRSZXNwb25zZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdHJpYWxDYXJ0SXRlbSkge1xyXG4gICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09PSB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgJiYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID09IDAgfHwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkID09PSBpdGVtLnZhcmllbnRJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0l0ZW1BZGRlZEFzVHJpYWwgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNoYXJlUHJvZHVjdCgpIHtcclxuICAgIG5hdmlnYXRvci5zaGFyZSh7XHJcbiAgICAgIHRpdGxlOiAnQnV5ICcgKyB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSxcclxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxyXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnUHJvZHVjdCBzaGFyZWQnLCBrZXk6ICd3aXNobGlzdCcgfSkpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdTaGFyZWQnLCBkZXRhaWw6ICdGYWlsZWQgdG8gc2hhcmUgcHJvZHVjdC4gVHJ5IEFnYWluLicsIGtleTogJ3dpc2hsaXN0JyB9KSk7XHJcblxyXG4gIH1cclxuICByb3V0ZVRvSG9tZSgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcclxuICB9XHJcblxyXG4gIHNjcmVlbldpZHRoOiBhbnk7XHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuXHJcbiAgY3VycmVudEltZzogYW55O1xyXG4gIGNoYW5nZUltZyh1cmw6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50SW1nID0gdXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0S2V5cyh2YXJpZW50OiBPYmplY3QpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFyaWVudCk7XHJcbiAgfVxyXG5cclxuICBnb1RvQ2FydCgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XHJcbiAgfVxyXG5cclxuICBhZGRUb0NhcnQodHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJyA9ICdBREQnKSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1PdXRPZlN0b2NrKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgc3VtbWFyeTogJ0NhcnQnLCBkZXRhaWw6ICdJdGVtIGlzIG5vdCBhdmFpbGFibGUgYXMgb2Ygbm93LiBXZSB3aWxsIG5vdGlmeSB5b3Ugb25jZSBhdmFpbGFibGUnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICBpdGVtVmFyaWVudC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtVmFyaWVudC5xdWFudGl0eTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5KSB7XHJcbiAgICAgICAgbGV0IGlzUHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLnZhcmllbnRJZCA9PSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpIHtcclxuICAgICAgICAgICAgaXRlbS5xdWFudGl0eSA9IHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5O1xyXG4gICAgICAgICAgICBpc1ByZXNlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQpXHJcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IHRoaXMuVVNFUl9DQVJUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSA/PyBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50Py52YXJpYW50SWQpO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5yZXNwb25zZURhdGE/LnF1YW50aXR5KVxyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcclxuICAgICAgaWYgKHR5cGUgPT0gJ0FERCcpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5IC09IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvQ2FydCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9GaWx0ZXIoY2F0ZWdvcnk6IHN0cmluZykge1xyXG4gICAgY2F0ZWdvcnkgPSBjYXRlZ29yeS5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIilcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbGlzdCddLCB7IHF1ZXJ5UGFyYW1zOiB7IGNhdGVnb3J5OiBjYXRlZ29yeSB9IH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9GYXZvdXJpdGUoKSB7XHJcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gYWRkZWQgdG8geW91ciB3aXNobGlzdCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QsIGl0ZW1WYXJpZW50LnZhcmlhbnRJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNJdGVtQXNGYXZvcml0ZSkge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LnB1c2gobmV3IE9yZGVyZWRJdGVtcyh0aGlzLnJlc3BvbnNlRGF0YSwgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLlVTRVJfV0lTSExJU1QgPSB0aGlzLlVTRVJfV0lTSExJU1Q/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVUb0Zhdm91cml0ZSgpIHtcclxuICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gcmVtb3ZlZCBmcm9tIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5yZW1vdmVJdGVtRnJvbUZhdm91cml0ZSh0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0QnlDYXRlZ29yeSgpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnlJZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcz8uWzBdPy5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICAgIGlmICh0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YT8ubGVuZ3RoID09IDApXHJcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXRQcm9kdWN0QnlDb2xsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0QnlDb2xsZWN0aW9uSWQodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNvbGxlY3Rpb24/LlswXS5yZWZJZCA/PyBcIlwiKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdERhdGEgPSByZXNwb25zZS5kYXRhPy5maWx0ZXIoKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JZCAhPSBwcm9kdWN0Lml0ZW1JZCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBjaGFuZ2VQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnXSwgeyBxdWVyeVBhcmFtczogeyBpZDogcHJvZHVjdC5pdGVtSWQgfSB9KTtcclxuICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcclxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gIH1cclxuICBnZXRLZXlCeUlkeChwcm9wZXJ0eTogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydHkpW2luZGV4XTtcclxuICB9XHJcbiAgaXNWYXJpZW50QXZhaWxhYmxlKHZhcmllbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIC8vIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpPT4ge1xyXG4gICAgLy8gICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgIC8vICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcclxuICAgIC8vICAgICAvLyBmb3VuZFZhcmllbnQgPSAodmFyaWVudEtleSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9KVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV2aWV3VGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgcmV2aWV3RGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgYWRkUHJvZHVjdFJldmlldygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLnJldmlld1RpdGxlLmxlbmd0aCA9PSAwICYmIHRoaXMucmV2aWV3RGVzY3JpcHRpb24ubGVuZ3RoID09IDAgJiYgdGhpcy5wcm9kdWN0UmV2aWV3ID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0xvZ2luJywgZGV0YWlsOiAnUGxlYXNlIGxvZ2luIHRvIHBvc3QgcmV2aWV3Jywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXlsb2FkOiBSZXZpZXcgPSB7XHJcbiAgICAgIHByb2R1Y3RJZDogdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkLFxyXG4gICAgICB1c2VySWQ6IHVzZXJEZXRhaWxzLnVzZXJJZCxcclxuICAgICAgcmF0aW5nOiB0aGlzLnByb2R1Y3RSZXZpZXcsXHJcbiAgICAgIHJldmlldzogdGhpcy5yZXZpZXdEZXNjcmlwdGlvbixcclxuICAgICAgdXNlck5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5yZXZpZXdUaXRsZSxcclxuICAgICAgcHJvZHVjdEltYWdlczogW11cclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuYWRkUmV2aWV3KHBheWxvYWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5zaG93UmV2aWV3ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnJhdGluZyArPSAxO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdSZXZpZXcnLCBkZXRhaWw6ICdUaGFua3MgZm9yIGdpdmluZyB5b3VyIGZlZWRiYWNrJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICBpZiAodGhpcy5yZXZpZXdDb21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLnJldmlld0NvbXBvbmVudC5nZXRBbGxSZXZpZXdzKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFZhcmllbnRRdWFudGl0eShwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IGl0ZW1RdWFudGl0eTogbnVtYmVyID0gMDtcclxuICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IHtcclxuICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcclxuICAgICAgICBpdGVtUXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgfSlcclxuICAgIHJldHVybiBpdGVtUXVhbnRpdHk7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHRoaXMuVVNFUl9XSVNITElTVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXHJcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByZXNlbnQ7XHJcbiAgfVxyXG5cclxuICBlZGl0U2VjdGlvbigpIHtcclxuXHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNDc1KVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnRvZ2dsZUVkaXRvckV2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5lZGl0U2VjdGlvbi5lbWl0KHsgZGF0YTogdGhpcy5kYXRhIH0pO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0l0ZW1PdXRPZlN0b2NrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPT0gMDtcclxuICB9XHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQlVTSU5FU1NfQ09OU1RBTlRTLkNVUlJFTkNZO1xyXG4gIH1cclxuICBnZXQgaXNJdGVtTG93U3RvY2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA8IDU7XHJcbiAgfVxyXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzU7XHJcbiAgfVxyXG5cclxuICBnZXRDYXJhdChjYXJhdDogYW55KSB7XHJcbiAgICBzd2l0Y2ggKGNhcmF0KSB7XHJcbiAgICAgIGNhc2UgJ0syNCc6XHJcbiAgICAgICAgcmV0dXJuIFwiMjQgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzIyJzpcclxuICAgICAgICByZXR1cm4gXCIyMiBDYXJhdHNcIlxyXG4gICAgICBjYXNlICdLMTgnOlxyXG4gICAgICAgIHJldHVybiBcIjE4IENhcmF0c1wiXHJcbiAgICAgIGNhc2UgJ0sxNCc6XHJcbiAgICAgICAgcmV0dXJuIFwiMTQgQ2FyYXRzXCJcclxuICAgICAgY2FzZSAnSzEwJzpcclxuICAgICAgICByZXR1cm4gXCIxMCBDYXJhdHNcIlxyXG4gICAgICBjYXNlICdLOTk5JzpcclxuICAgICAgICByZXR1cm4gXCI5OS45JSBQdXJlXCJcclxuICAgICAgY2FzZSAnSzkyNSc6XHJcbiAgICAgICAgcmV0dXJuIFwiOTIuNSUgUHVyZVwiXHJcbiAgICAgIGNhc2UgJ0s5MDAnOlxyXG4gICAgICAgIHJldHVybiBcIjkwJSBQdXJlXCJcclxuICAgICAgY2FzZSAnVlMnOlxyXG4gICAgICAgIHJldHVybiBcIlZlcnkgU2xpZ2h0bHkgSW5jbHVkZWRcIlxyXG4gICAgICBjYXNlICdTSSc6XHJcbiAgICAgICAgcmV0dXJuIFwiU2xpZ2h0bHkgSW5jbHVkZWRcIlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIjI0IENhcmF0c1wiXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFByaWNlUGVyR3JhbShwcmljZTogYW55LCBtYXRlcmlhbFR5cGU6IHN0cmluZykge1xyXG4gICAgaWYgKG1hdGVyaWFsVHlwZSA9PT0gJ0RJQU1PTkQnIHx8IG1hdGVyaWFsVHlwZSA9PT0gJ0dPTEQnKSB7XHJcbiAgICAgIHJldHVybiBwcmljZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcbiAgaXNEZXNjcmlwdGlvbkNvbGxhcHNlZCA9IGZhbHNlO1xyXG5cclxuICB0b2dnbGVEZXNjcmlwdGlvbigpIHtcclxuICAgIHRoaXMuaXNEZXNjcmlwdGlvbkNvbGxhcHNlZCA9ICF0aGlzLmlzRGVzY3JpcHRpb25Db2xsYXBzZWQ7XHJcbiAgfVxyXG4gIGlzUHJpY2VCcmVha3VwID0gZmFsc2VcclxuICB0b2dnbGVQcmljZUJyZWFrRG93bigpIHtcclxuICAgIHRoaXMuaXNQcmljZUJyZWFrdXAgPSAhdGhpcy5pc1ByaWNlQnJlYWt1cDtcclxuICB9XHJcbiAgZ2V0RGlmZmVyZW5jZShzZWxsaW5nUHJpY2U6IGFueSwgbXJwOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKCFzZWxsaW5nUHJpY2UgfHwgIW1ycClcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICByZXR1cm4gbXJwIC0gc2VsbGluZ1ByaWNlO1xyXG4gIH1cclxuICBnZXRCYWNrZ3JvdW5kQ29sb3IodHlwZTogc3RyaW5nKSB7XHJcbiAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIC8vICAgY2FzZSBcIkdPTERcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCIjRkZGNEQxXCJcclxuICAgIC8vICAgY2FzZSBcIkRJQU1PTkRcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCIjRUZFMUY0XCJcclxuICAgIC8vICAgY2FzZSBcIlNJTFZFUlwiOlxyXG4gICAgLy8gICAgIHJldHVybiBcImxpbmVhci1ncmFkaWVudCgxODBkZWcsICNGQUZBRkEgMCUsICNGRkZGRkYgMTAwJSlcIlxyXG4gICAgLy8gICBkZWZhdWx0OlxyXG4gICAgLy8gICAgIHJldHVybiBcIiNlMmY2ZmZcIlxyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIFwiI0ZGRjlGNVwiXHJcbiAgfVxyXG4gIGdldEhlYWRlckNvbG9yKHR5cGU6IHN0cmluZykge1xyXG4gICAgLy8gc3dpdGNoICh0eXBlKSB7XHJcbiAgICAvLyAgIGNhc2UgXCJHT0xEXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwiI0ZGRjNFOVwiXHJcbiAgICAvLyAgIGNhc2UgXCJESUFNT05EXCI6XHJcbiAgICAvLyAgICAgcmV0dXJuIFwiIzlENDNCOFwiXHJcbiAgICAvLyAgIGNhc2UgXCJTSUxWRVJcIjpcclxuICAgIC8vICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjQkRCREJEIDAlLCAjRTJFMkUyIDEwMCUpXCJcclxuICAgIC8vICAgZGVmYXVsdDpcclxuICAgIC8vICAgICByZXR1cm4gXCJsaW5lYXItZ3JhZGllbnQoMTU5ZGVnLCByZ2JhKDY1LDEwNSwyMjUsMSkgMCUsIHJnYmEoMTM3LDIwNywyNDAsMSkgMTAwJSlcIlxyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIFwiI0ZGRjNFOVwiXHJcbiAgfVxyXG4gIGdldFRleHRDb2xvcihjb2xvcjogYW55KSB7XHJcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxMzA7XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChjb2xvci5zbGljZSgzLCA1KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDUsIDcpLCAxNik7XHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gdGhyZXNob2xkID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xyXG4gIH1cclxuICBsYW5ndWFnZXM6IHN0cmluZ1tdID0gW1wiRW5nbGlzaFwiLCBcIlRlbHVndVwiLCBcIkhpbmRpXCIsIFwiVGFtaWxcIiwgXCJLYW5uYWRhXCIsIFwiTWFsYXlhbGFtXCIsIFwiT3RoZXJzXCJdXHJcbiAgc2VsZWN0ZWRMYW5nOiBzdHJpbmcgPSB0aGlzLmxhbmd1YWdlc1swXVxyXG5cclxuICBnZXRDbGFzcyhtYXA6IGFueSkge1xyXG4gICAgaWYgKG1hcC5zaXplID09IDEpXHJcbiAgICAgIHJldHVybiAnY29sLTYnXHJcbiAgICBlbHNlIGlmIChtYXAuc2l6ZSA9PSAyKVxyXG4gICAgICByZXR1cm4gJ2NvbC00J1xyXG4gICAgZWxzZSBpZiAobWFwLnNpemUgPT0gMylcclxuICAgICAgcmV0dXJuICdjb2wtMydcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuICd3aWR0aC1tYXgnO1xyXG4gIH1cclxuICBvbkZpbmRJblN0b3JlKGlkOiBzdHJpbmcpIHtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlJ10sIHsgcXVlcnlQYXJhbXM6IHsgc3RvcmVJZDogaWQgfSB9KTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3N0b3JlLWxpc3QnXSk7XHJcbiAgfVxyXG5cclxuICBvbkJvb2tBcHBvaW50bWVudCgpIHtcclxuXHJcbiAgfVxyXG4gIGlzRGV0YWlsczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBpbmNvZGU6IGFueTtcclxuICBzdG9yZURldGFpbHM6IGFueTtcclxuICBnZXRTdG9yZURldGFpbHMoKSB7XHJcbiAgICBpZiAodGhpcy5waW5jb2RlID09IG51bGwgfHwgdGhpcy5waW5jb2RlLnRvU3RyaW5nKCkubGVuZ3RoICE9IDYpIHtcclxuICAgICAgdGhpcy5pc1BpbkNvZGUgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRTdG9yZUxvY2F0b3JEZXRhaWxzKHRoaXMucGluY29kZS50b1N0cmluZygpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEZXRhaWxzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zdG9yZURldGFpbHMgPSByZXM/LmRhdGE7XHJcbiAgICAgIHRoaXMuaXNQaW5Db2RlID0gdHJ1ZTtcclxuICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ1N0b3JlIExvY2F0b3InIH0pO1xyXG4gICAgICB9KVxyXG4gIH1cclxuICBicmFuZFByb21pc2VzOiBhbnlbXSA9IFtdO1xyXG4gIGVjb21Db25maWdzOiBhbnk7XHJcbiAgZ2V0RWNvbW1lcmNlQ29uZmlncygpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0RWNvbW1lcmNlQ29uZmlncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5icmFuZFByb21pc2VzID0gcmVzPy5kYXRhPy5icmFuZFByb21pc2VzXHJcbiAgICAgIHRoaXMuZWNvbUNvbmZpZ3MgPSByZXM/LmRhdGFcclxuICAgIH0pXHJcbiAgfVxyXG4gIGxvY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG90aGVyTGFuZ3VhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICB2aWRlb0NhbGxQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8/IFwiXCIsXHJcbiAgICBtb2JpbGVOdW1iZXI6IFwiXCIsXHJcbiAgICBwaW5jb2RlOiBcIlwiLFxyXG4gICAgdXNlcm5hbWU6IFwiXCIsXHJcbiAgICBlbWFpbDogXCJcIixcclxuICAgIG1lc3NhZ2U6IGBgLFxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGlvbkVycm9yczogYW55ID0ge1xyXG4gICAgdXNlcm5hbWU6IGZhbHNlLFxyXG4gICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgIHBpbmNvZGU6IGZhbHNlLFxyXG4gICAgZW1haWw6IGZhbHNlXHJcbiAgfTtcclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzY2hlZHVsZVZpZGVvQ2FsbCgpIHtcclxuICAgIGlmICh0aGlzLmlzU3VibWl0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWU/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMudXNlcm5hbWUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5tb2JpbGVOdW1iZXIgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyID0gdHJ1ZTtcclxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGUgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZS50b1N0cmluZygpLmxlbmd0aCAhPT0gNikge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucGluY29kZSA9IHRydWU7XHJcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWw/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZW1haWwgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICghL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvLnRlc3QodGhpcy52aWRlb0NhbGxQYXlsb2FkLmVtYWlsKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZW1haWwgPSB0cnVlO1xyXG4gICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGhhc0Vycm9ycykge1xyXG4gICAgICBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC51c2VybmFtZT8udHJpbSgpIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyIHx8ICF0aGlzLnZpZGVvQ2FsbFBheWxvYWQucGluY29kZSkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZmlsbCBhbGwgdGhlIHJlcXVpcmVkIGRldGFpbHMnLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvQ2FsbFBheWxvYWQubW9iaWxlTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXHJcbiAgICAgICAgICBzdW1tYXJ5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZScsXHJcbiAgICAgICAgICBkZXRhaWw6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCAxMC1kaWdpdCBtb2JpbGUgbnVtYmVyJyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52aWRlb0NhbGxQYXlsb2FkLnBpbmNvZGUudG9TdHJpbmcoKS5sZW5ndGggIT09IDYpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgNi1kaWdpdCBwaW5jb2RlJyxcclxuICAgICAgICAgIGtleTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoIXRoaXMudmlkZW9DYWxsUGF5bG9hZC5lbWFpbD8udHJpbSgpIHx8ICEvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC8udGVzdCh0aGlzLnZpZGVvQ2FsbFBheWxvYWQuZW1haWwpKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJyxcclxuICAgICAgICAgIGRldGFpbDogJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gQ2FsbCBTY2hlZHVsZSdcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy52aWRlb0NhbGxQYXlsb2FkLm1lc3NhZ2UgPSB0aGlzLnZpZGVvQ2FsbFBheWxvYWQubWVzc2FnZSArIGBIaSwgSSd2ZSBqdXN0IHNjaGVkdWxlZCBhIHZpZGVvIGNhbGwgd2l0aCB5b3UgZm9yIHRoaXMgcHJvZHVjdCAke3RoaXMucmVzcG9uc2VEYXRhPy5uYW1lfS4gSXQncyBpbXBvcnRhbnQgYW5kIEknZCBhcHByZWNpYXRlIHlvdXIgdGltZSDigJQgbG9va2luZyBmb3J3YXJkIHRvIGNvbm5lY3RpbmcgYXMgc29vbiBhcyBwb3NzaWJsZSAgaW4gJHt0aGlzLnNlbGVjdGVkTGFuZyA9PSAnT3RoZXJzJyA/IHRoaXMub3RoZXJMYW5ndWFnZSA6IHRoaXMuc2VsZWN0ZWRMYW5nfSBsYW5ndWFnZWA7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnBvc3RWaWRlb0NhbGxEZXRhaWxzKHRoaXMudmlkZW9DYWxsUGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgc3VtbWFyeTogJ1ZpZGVvIENhbGwgU2NoZWR1bGUnLFxyXG4gICAgICAgICAgZGV0YWlsOiAnWW91ciBWaWRlbyBDYWxsIGlzIFNjaGVkdWxlZCBTdWNjZXNzZnVsbHknLFxyXG4gICAgICAgICAga2V5OiAnVmlkZW8gU2NoZWR1bGluZydcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKClcclxuICAgICAgfSxcclxuICAgICAgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICAgIHN1bW1hcnk6ICdFcnJvcicsXHJcbiAgICAgICAgICBkZXRhaWw6IGVycj8uZXJyb3I/Lm1lc3NhZ2UsXHJcbiAgICAgICAgICBrZXk6ICdWaWRlbyBDYWxsIFNjaGVkdWxlJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICByZXNldFZhbGlkYXRpb25FcnJvcnMoKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiBmYWxzZSxcclxuICAgICAgbW9iaWxlTnVtYmVyOiBmYWxzZSxcclxuICAgICAgcGluY29kZTogZmFsc2VcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXNldEZvcm0oKSB7XHJcbiAgICB0aGlzLnZpZGVvQ2FsbFBheWxvYWQgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiAnJyxcclxuICAgICAgbW9iaWxlTnVtYmVyOiAnJyxcclxuICAgICAgcGluY29kZTogJycsXHJcbiAgICAgIG1lc3NhZ2U6ICcnXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZXNldFZhbGlkYXRpb25FcnJvcnMoKTtcclxuICB9XHJcbiAgb25JbnB1dENoYW5nZShmaWVsZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3JzW2ZpZWxkXSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnNbZmllbGRdID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsb3NlTW9kYWwoKSB7XHJcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZU1vZGFsQ2VudGVyJyk7XHJcbiAgICBpZiAobW9kYWxFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1vZGFsRWxlbWVudCwgJ2RhdGEtYnMtZGlzbWlzcycsICdtb2RhbCcpO1xyXG4gICAgICBtb2RhbEVsZW1lbnQuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbklkKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LmlkID8/IFwiXCI7XHJcbiAgfVxyXG4gIGdldEJ1dHRvblN0eWxlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmFjdGlvbj8uYnV0dG9uc1tpbmRleF0/LnN0eWxlcztcclxuICB9XHJcbiAgb3BlbkRpYWxvZ0JveCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maWc6IE1hdERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgcGFuZWxDbGFzczogJycsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNjcmVlbldpZHRoID4gNDc1KSB7XHJcbiAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gJ3ZpZGVvLWNhbGwtZGlhbG9nJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbmZpZy53aWR0aCA9ICcxMDB2dyc7XHJcbiAgICAgIGNvbmZpZy5oZWlnaHQgPSAnMTAwdmgnO1xyXG4gICAgICBjb25maWcubWF4V2lkdGggPSAnMTAwdncnO1xyXG4gICAgICBjb25maWcucGFuZWxDbGFzcyA9ICdhcHBvaW50bWVudC1mb3JtJztcclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGUsIGNvbmZpZyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG1hdENsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIGdldFJhdGluZ3Mobm9vZnJhdGluZ3M6IGFueSkge1xyXG4gICAgaWYgKG5vb2ZyYXRpbmdzID49IDEwMDApIHtcclxuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDApLnRvRml4ZWQoMSkgKyBcIksrXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChub29mcmF0aW5ncyA+IDEwMDAwMDApIHtcclxuICAgICAgcmV0dXJuIChub29mcmF0aW5ncyAvIDEwMDAwMDApLnRvRml4ZWQoMSkgKyBcIk1cIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbm9vZnJhdGluZ3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUb1RyaWFsQ2FydCgpIHtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IGl0ZW1WYXJpZW50Lml0ZW1JbnZlbnRvcnk7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkSXRlbVRvVHJpYWwodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9UcmlhbCh0aGlzLnJlc3BvbnNlRGF0YSBhcyBQcm9kdWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNJdGVtQWRkZWRBc1RyaWFsID0gdHJ1ZTtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgdHJhaWwgY2FydCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuXHJcbiAgfVxyXG4gIHJldmlld3NEYXRhOiBhbnlbXSA9IFtdXHJcbiAgcmF0aW5nQ291bnRzOiBhbnlcclxuICBwYWdlTnVtYmVyOiBudW1iZXIgPSAwXHJcbiAgbG9hZE1vcmVSZXZpZXdzKCkge1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyKys7XHJcbiAgICB0aGlzLmdldFJldmlld3ModGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JZCk7XHJcbiAgfVxyXG4gIGdldFJldmlld3MocHJvZHVjdElkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmV2aWV3c0J5UHJvZHVjdElkKHByb2R1Y3RJZCwgdGhpcy5wYWdlTnVtYmVyKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXZpZXdzRGF0YSA9IFsuLi50aGlzLnJldmlld3NEYXRhLCAuLi5yZXNwb25zZT8uZGF0YT8udXNlclJldmlld3NdO1xyXG4gICAgICB0aGlzLnJhdGluZ0NvdW50cyA9IHJlc3BvbnNlPy5kYXRhPy5vdmVyYWxsUmF0aW5nQ291bnRcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycm9yPy5lcnJvcj8ubWVzc2FnZSwga2V5OiAnUmV2aWV3cycgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0UGVyY2VudGFnZShyYXRpbmc6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMucmF0aW5nQ291bnRzICYmIHRoaXMucmF0aW5nQ291bnRzW3JhdGluZ10pIHtcclxuICAgICAgbGV0IHBlcmNlbnQgPSAodGhpcy5yYXRpbmdDb3VudHNbcmF0aW5nXSAvIHRoaXMucmVzcG9uc2VEYXRhPy50b3RhbFJldmlld0NvdW50KSAqIDEwMFxyXG4gICAgICByZXR1cm4gcGVyY2VudC50b0ZpeGVkKDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcwJztcclxuICB9XHJcblxyXG4gIGdldFJHQkEoYmdDb2xvcjogYW55LCBvcGFjaXR5OiBudW1iZXIpOiBhbnkge1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGJnQ29sb3Iuc2xpY2UoMSwgMyksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChiZ0NvbG9yLnNsaWNlKDMsIDUpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoYmdDb2xvci5zbGljZSg1LCA3KSwgMTYpO1xyXG4gICAgcmV0dXJuIGByZ2JhKCR7cn0sICR7Z30sICR7Yn0sICR7b3BhY2l0eSAvIDEwMH0pYDtcclxuICB9XHJcblxyXG4gIHNob3dEZXRhaWxSZXZpZXcocmV2aWV3OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRSZXZpZXcgPSByZXZpZXdcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuUmV2aWV3RGV0YWlsJyk/LmNsaWNrKClcclxuICB9XHJcbiAgZ2V0IHN0eWxlc0xheW91dCgpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuc3R5bGVzPy5sYXlvdXQgfSBhcyBMYXlPdXRNb2RlbDtcclxuICB9XHJcblxyXG4gIGdldERhdGVBZnRlcnhEYXlzKCk6IERhdGUge1xyXG4gICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY3VycmVudERhdGUuc2V0RGF0ZShjdXJyZW50RGF0ZS5nZXREYXRlKCkgKyAodGhpcy5lY29tQ29uZmlncz8uZXhwZWN0ZWREZWxpdmVyeURhdGUgPz8gNykpO1xyXG4gICAgcmV0dXJuIGN1cnJlbnREYXRlO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwid2lzaGxpc3RcIlxyXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJpc01vYmlsZSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIlZpZGVvIENhbGwgU2NoZWR1bGVcIlxyXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cImlzTW9iaWxlID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxyXG4gIDxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCIga2V5PVwiVmlkZW8gU2NoZWR1bGluZ1wiXHJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJ0b3RhbC1jb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIHNpbXBvSG92ZXJcclxuICAgIChob3ZlcmluZyk9XCJzaG93RWRpdFRhYnMoJGV2ZW50KVwiIFthdHRyLnN0eWxlXT1cImN1c3RvbUNsYXNzXCI+XHJcblxyXG4gICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cclxuICAgICAgPHAtc3BlZWREaWFsIFttb2RlbF09XCJpdGVtc1wiIGRpcmVjdGlvbj1cInVwXCIgW2J1dHRvblN0eWxlXT1cInsnYm9yZGVyLXJhZGl1cyc6ICc1MCUnLCAnaGVpZ2h0JzogJzMwcHgnfVwiIC8+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImNvbnRhaW5lclwiIFtpZF09XCJkYXRhPy5pZFwiIFtzaW1wb0FuaW1hdGlvbl09XCJzdHlsZXM/LmFuaW1hdGlvblwiIFtzcGFjaW5nSG9yaXpvbnRhbF09XCJzdHlsZXNMYXlvdXRcIlxyXG4gICAgICBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiAjY29udGFpbmVyPlxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXNwbGF5LW5vbmVcIj48YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiAjMDI2N0MxXCJcclxuICAgICAgICAgIChjbGljayk9XCJyb3V0ZVRvSG9tZSgpXCI+SG9tZTwvYT4gL1xyXG4gICAgICAgIDxzcGFuPnt7IHJlc3BvbnNlRGF0YT8ubmFtZSB8IHRpdGxlY2FzZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG0tMCB3LTEwMCBtdC1sZy00IGgtYXV0byBvdmVyZmxvdy12aXNpYmxlXCIgI2Fib3ZlSGVpZ2h0PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wtc20tMTIgaW1hZ2Utc2VjdGlvbi1tb2Rlcm5cIiAjaW1hZ2VTZWN0aW9uPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImgtMTAwIGQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWxnLWNvbHVtbi1yZXZlcnNlIGp1c3RpZnktY29udGVudC1zdGFydCBnYXAtMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiSW1hZ2VTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLXNtLTEyIGRldGFpbC1zZWN0aW9uLW1vZGVybiBcIiAjZGV0YWlsU2VjdGlvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWhlcm8tY2FyZC1tb2Rlcm5cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhcmlhbnRzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlByb2R1Y3REZXNjXCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZhcmlhbnRzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc01vYmlsZVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJBY3Rpb25CdG5cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVjb21Db25maWdzPy5kZWxpdmVyeUVuYWJsZWRcIj5cclxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy5kZWxpdmVyeUVuYWJsZWRcIiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkRlbGl2ZXJ5U2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVjb21Db25maWdzPy5zdG9yZXNFbmFibGVkXCI+XHJcbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJlY29tQ29uZmlncz8uc3RvcmVzRW5hYmxlZFwiIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiU3RvcmVTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmFwcG9pbnRtZW50Qm9va2luZ0VuYWJsZWRcIj5cclxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy5hcHBvaW50bWVudEJvb2tpbmdFbmFibGVkXCIgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJUcnlBdEhvbWVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlY29tQ29uZmlncz8udmlkZW9DYWxsRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInZpZGVvQ2FsbFNjaGVkdWxlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmJyYW5kRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnJhbmRpbmdcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBNb3ZlZCBkZXNjcmlwdG9ycyB0byBEZXRhaWxzIHRhYiBiZWxvdyAtLT5cclxuXHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWRlc2MgYm9keS1sYXJnZSBkLWJsb2NrXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8IS0tIE1vdmVkIHRhZ3MgdG8gRGV0YWlscyB0YWIgYmVsb3cgLS0+XHJcbiAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJTb2NpYWxJY29uc1wiPjwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlJldmlld1NlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gVGFicyBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC10YWJzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cInRhYnMtbGlzdFwiPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwidGFiLWl0ZW1cIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PSAnRGV0YWlscydcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJyA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJhY3RpdmVUYWIgPT0gJ0RldGFpbHMnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICd0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFiKCdEZXRhaWxzJylcIj5EZXRhaWxzPC9saT5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cInRhYi1pdGVtXCIgKm5nSWY9XCJyZXZpZXdzRGF0YVwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09ICdSZXZpZXdzJ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJhY3RpdmVUYWIgPT0gJ1Jldmlld3MnID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImFjdGl2ZVRhYiA9PSAnUmV2aWV3cycgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWIoJ1Jldmlld3MnKVwiPlJldmlld3M8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBUYWIgQ29udGVudCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50LXBhbmVcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09ICdEZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uYnJpZWYgfCBzYW5pdGl6ZUh0bWxcIiBjbGFzcz1cIm10LTIgdGV4dC1qdXN0aWZ5IGxpbmUtaGVpZ2h0LTI0IGZvbnQtMTRcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIEludGVncmF0ZWQgZGVzY3JpcHRvcnMgYW5kIHRhZ3MgaGVyZSAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZXNjcmlwdG9yc1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT0gJ1Jldmlld3MnXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUmV2aWV3c1NlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVsYXRlZFByb2R1Y3REYXRhPy5sZW5ndGhcIj5cclxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwiZmVhdHVyZVByb2R1Y3REYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWxhdGVkUHJvZHVjdERhdGFcIlxyXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIiAoY2hhbmdlRGV0YWlsUHJvZHVjdCk9XCJjaGFuZ2VQcm9kdWN0KCRldmVudClcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNlbnRWaWV3SXRlbUxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICA8c2ltcG8tZmVhdHVyZWQtcHJvZHVjdHMgW2VkaXRdPVwiZmFsc2VcIiBbZGF0YV09XCJyZWNlbnRWaWV3ZWREYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWNlbnRWaWV3SXRlbUxpc3RcIlxyXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgPCEtLSA8bmctY29udGFpbmVyPlxyXG4gICAgICA8c2ltcG8tY3VzdG9tZXItcmV2aWV3IFtkYXRhXT1cImRhdGFcIj48L3NpbXBvLWN1c3RvbWVyLXJldmlldz5cclxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGVzPy5kZXZpZGVyPy5kaXNwbGF5XCI+XHJcbiAgICAgIDxzaW1wby1zdmctZGl2aWRlciBbZGl2aWRlclR5cGVdPVwic3R5bGVzPy5kZXZpZGVyPy5kZXZpZGVyVHlwZVwiXHJcbiAgICAgICAgW2NvbG9yXT1cIm5leHRDb21wb25lbnRDb2xvcj8uY29sb3JcIj48L3NpbXBvLXN2Zy1kaXZpZGVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XHJcbiAgICAgIDxzaW1wby1ob3Zlci1lbGVtZW50cyBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCIgW2VkaXRPcHRpb25zXT1cImVkaXRcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxyXG4gICAgICA8c2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiPjwvc2ltcG8tZGVsZXRlLWhvdmVyLWVsZW1lbnQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L3NlY3Rpb24+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbjxuZ3gtc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgY291bnQ9XCIxXCIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XHJcbiAgd2lkdGg6ICcxMDAlJyxcclxuICBoZWlnaHQ6ICc0MHZoJyxcclxuICAnYm9yZGVyLXJhZGl1cyc6ICcxMHB4JyxcclxuICAncG9zaXRpb24nOiAncmVsYXRpdmUnLFxyXG4gICdyaWdodCc6ICc1cHgnXHJcbn1cIj5cclxuPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2JpbGUtZm9vdGVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImljb25zXCI+XHJcbiAgICA8ZGl2IChjbGljayk9XCJnb1RvQ2FydCgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cImFkZFRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiIWlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZV9ib3JkZXI8L21hdC1pY29uPlxyXG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwicmVtb3ZlVG9GYXZvdXJpdGUoKVwiXHJcbiAgICAgICAgKm5nSWY9XCJpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiBjbGFzcz1cIm91dC1vZi1zdG9jayB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgwKVwiPk91dCBvZlxyXG4gICAgU3RvY2s8L2J1dHRvbj5cclxuICA8ZGl2IGNsYXNzPVwicXVhbnRpdHlcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCJcclxuICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XHJcbiAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwcHg7XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBmY1wiXHJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+e3tyZXNwb25zZURhdGE/LnF1YW50aXR5fX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCJcclxuICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiXHJcbiAgICBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCIgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCIgKGNsaWNrKT1cIiFlZGl0ID8gb3BlbkRpYWxvZ0JveChkaWFsb2dCb3gpIDogJydcIj5cclxuICAgIDxtYXQtaWNvbj52aWRlb2NhbTwvbWF0LWljb24+TElWRSBWSURFTyBDQUxMPC9idXR0b24+XHJcbiAgPGRpdiAqbmdJZj1cIiFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrXCIgY2xhc3M9XCJ3LTc1XCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxyXG4gICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgW2lkXT1cImRhdGE/LmlkK2dldEJ1dHRvbklkKDApXCJcclxuICAgICAgKGNsaWNrKT1cIiFlZGl0ID8gYWRkVG9DYXJ0KCkgOiAnJ1wiPjxtYXQtaWNvbj5zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbH19PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNSZXZpZXdTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJyZXZpZXctc2VjXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5DdXN0b21lciBSZXZpZXc8L2Rpdj5cclxuICAgIDxwLXJhdGluZyBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRvdGFsUmV2aWV3XCIgLz5cclxuICAgIDxzcGFuPkJlIHRoZSBmaXJzdCB0byB3cml0ZSBhIHJldmlldzwvc3Bhbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJtdC0zXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9ICFzaG93UmV2aWV3XCI+e3sgIXNob3dSZXZpZXcgPyAnQWRkXHJcbiAgICAgIFJldmlldycgOiAnQ2FuY2VsIFJldmlldyd9fTwvYnV0dG9uPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZXZpZXdcIj5cclxuICAgICAgPGhyIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXJldmlld1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPldyaXRlIGEgcmV2aWV3PC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJBVElORzwvc3Bhbj5cclxuICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJwcm9kdWN0UmV2aWV3XCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJmYWxzZVwiIC8+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXcgVGl0bGU8L3NwYW4+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkdpdmUgeW91ciByZXZpZXcgYSB0aXRsZVwiIFsobmdNb2RlbCldPVwicmV2aWV3VGl0bGVcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldzwvc3Bhbj5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgY29tbWVudHMgaGVyZVwiIFsobmdNb2RlbCldPVwicmV2aWV3RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctYWN0aW9uLWJ0blwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInNob3dSZXZpZXcgPSBmYWxzZVwiPkNhbmNlbCByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgICAgICAgW2JhY2tncm91bmRJbmZvXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZFByb2R1Y3RSZXZpZXcoKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcm9kdWN0UmV2aWV3ID09IDAgJiYgcmV2aWV3VGl0bGU/Lmxlbmd0aCA9PSAwICYmIHJldmlld0Rlc2NyaXB0aW9uPy5sZW5ndGggPT0gMFwiPlN1Ym1pdFxyXG4gICAgICAgICAgICByZXZpZXc8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU29jaWFsSWNvbnM+XHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBhbGlnbi1pdGVtcy1sZy1jZW50ZXIgZmxleC1jb2x1bW4gZmxleC1sZy1yb3cgZ2FwLWxnLTAgZ2FwLTNcIlxyXG4gICAgICBbbmdDbGFzc109XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheSA/ICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbicgOiAnanVzdGlmeS1jb250ZW50LWVuZCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0wXCIgKm5nSWY9XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmNoYW5uZWxzXCI+XHJcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO21hcmdpbi1yaWdodDogMTBweDtcIj5cclxuICAgICAgICAgICAgPHNpbXBvLXNvY2lhLWljb25zIFtzb2NpYWxJY29uRGF0YV09XCJpdGVtXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIj48L3NpbXBvLXNvY2lhLWljb25zPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0FjdGlvbkJ0bj5cclxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXBhcmVudFwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm91dC1vZi1zdG9jayB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiXHJcbiAgICAgIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIlxyXG4gICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIj5PdXQgb2ZcclxuICAgICAgU3RvY2s8L2J1dHRvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhZWNvbUNvbmZpZ3M/LnZpZGVvQ2FsbEVuYWJsZWRcIlxyXG4gICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4tPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZjXCJcclxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPnt7cmVzcG9uc2VEYXRhPy5xdWFudGl0eX19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj4rPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmIGVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgY2xhc3M9XCJzZW5kLWJ0biB3LTEwMFwiXHJcbiAgICAgIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtidXR0b25TdHlsZV09XCJnZXRCdXR0b25TdHlsZSgwKVwiXHJcbiAgICAgIFtidXR0b25JZF09XCJnZXRCdXR0b25JZCgwKVwiIFtzZWN0aW9uSWRdPVwiZGF0YT8uaWRcIiBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAoY2xpY2spPVwiIWVkaXQgPyBvcGVuRGlhbG9nQm94KGRpYWxvZ0JveCkgOiAnJ1wiPlxyXG4gICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPkxJVkUgVklERU8gQ0FMTDwvYnV0dG9uPlxyXG4gICAgPGRpdiAqbmdJZj1cIighcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9jaykgJiYgSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIlxyXG4gICAgICAgIChjbGljayk9XCIhZWRpdCA/IGFkZFRvQ2FydCgpIDogJydcIj48bWF0LWljb24+c2hvcHBpbmdfY2FydDwvbWF0LWljb24+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKCFyZXNwb25zZURhdGE/LnF1YW50aXR5ICYmICFpc0l0ZW1PdXRPZlN0b2NrKSAmJiAhSXNFY29tbWVyY2VcIiBjbGFzcz1cInctNzVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuIHctMTAwXCIgW2FwcEJ1dHRvbkVkaXRvcl09XCJlZGl0ID8/IGZhbHNlXCIgc2ltcG9CdXR0b25EaXJlY3RpdmVcclxuICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMClcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMClcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMClcIiAoY2xpY2spPVwicmFpc2VMZWFkKClcIj48bWF0LWljb24gc3R5bGU9XCJoZWlnaHQ6MTRweCAhaW1wb3J0YW50XCI+XHJcbiAgICAgICAgICBtZXNzYWdlPC9tYXQtaWNvbj5Ob3RpZnkgTWU8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZhdm91cml0ZVwiICpuZ0lmPVwiSXNFY29tbWVyY2VcIiAoY2xpY2spPVwiaXNJdGVtQXNGYXZvcml0ZSA/IHJlbW92ZVRvRmF2b3VyaXRlKCkgOiBhZGRUb0Zhdm91cml0ZSgpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoYXJlLWljb25cIiAoY2xpY2spPVwic2hhcmVQcm9kdWN0KClcIj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+c2hhcmU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3ZhcmlhbnRzPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5zdHlsZXM/LmN1c3RvbWl6YXRpb24gPT0gJ1N0eWxlMSdcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWtleVwiPnt7dmFyaWVudC5rZXl9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFyaWVudFZhbHVlIG9mIHZhcmllbnQudmFsdWVcIiBjbGFzcz1cInZhcmllbnQtdGFnXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/ICd3aGl0ZScgOiBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VmFyaWVudCh2YXJpZW50LmtleSwgdmFyaWVudFZhbHVlKVwiPnt7dmFyaWVudFZhbHVlIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uc3R5bGVzPy5jdXN0b21pemF0aW9uID09ICdTdHlsZTInICYmIHNlbGVjdGVkVmFyaWVudC5zaXplID4gMFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIHN0eWxlMi1jb250YWluZXIgdy0xMDBcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRWYXJpZW50IHwga2V5dmFsdWVcIiBjbGFzcz1cInB4LTMgcHktMiB2YXJpZW50LWl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzXT1cImdldENsYXNzKHNlbGVjdGVkVmFyaWVudClcIiBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtaGVhZFwiPnt7aXRlbS5rZXkgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmlhbnQtdmFsdWUgdGV4dC1zdGFydCBmdy1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0udmFsdWUgfFxyXG4gICAgICAgICAgICB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBwLTBcIiBbY2xhc3NdPVwiZ2V0Q2xhc3Moc2VsZWN0ZWRWYXJpZW50KVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10ZXh0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMCBwLTJcIiBkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXHJcbiAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI29mZmNhbnZhc1JpZ2h0VmFyaWFudFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0VGV4dENvbG9yKGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IpXCI+Q1VTVE9NSVNFXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjUHJvZHVjdERlc2M+XHJcbiAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5mby1taW5pbWFsXCI+XHJcbiAgICA8IS0tIFRpdGxlIGFuZCBQcmljZSBSb3cgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGl0bGUtcHJpY2Utcm93LW1vZGVyblwiPlxyXG4gICAgICA8aDEgY2xhc3M9XCJwcm9kdWN0LXRpdGxlLW1vZGVyblwiPnt7cmVzcG9uc2VEYXRhPy5uYW1lfX08L2gxPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1wcmljZS1tb2Rlcm5cIj5cclxuICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImN1cnJlbmN5XCI+PC9zcGFuPiB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZX19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSYXRpbmcgUm93IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJhdGluZy1yb3ctbW9kZXJuXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmF2ZXJhZ2VSYXRpbmdcIj5cclxuICAgICAgPHAtcmF0aW5nIFsobmdNb2RlbCldPVwicmVzcG9uc2VEYXRhLmF2ZXJhZ2VSYXRpbmdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtcmF0aW5nPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJhdGluZy1zY29yZVwiPnt7cmVzcG9uc2VEYXRhPy5hdmVyYWdlUmF0aW5nIHwgbnVtYmVyOicxLjEtMSd9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzZXBhcmF0b3JcIj58PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJldmlld3MtbGlua1wiIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCI+XHJcbiAgICAgICAge3tyZXNwb25zZURhdGE/LnRvdGFsUmV2aWV3Q291bnR9fSByZXZpZXdzPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBCcmllZiBEZXNjcmlwdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWJyaWVmLW1vZGVyblwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5icmllZlwiIFtpbm5lckhUTUxdPVwicmVzcG9uc2VEYXRhPy5icmllZiB8IHNhbml0aXplSHRtbFwiPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Rlc2NyaXB0b3JzPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgcHJvZC1kZXNjIG10LTJcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGV4dFwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yIHx8IHJlc3BvbnNlRGF0YT8ubWF0ZXJpYWxzXCI+UHJvZHVjdCBEZXRhaWxzPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZWJyZWFrdXAtYnRuIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAqbmdJZj1cInN1YkluZHVzdHJ5TmFtZSA9PSAnRWNvbW1lcmNlIEpld2VsbGVyeSdcIiBkYXRhLWJzLXRvZ2dsZT1cIm9mZmNhbnZhc1wiXHJcbiAgICAgICAgICBkYXRhLWJzLXRhcmdldD1cIiNvZmZjYW52YXNSaWdodFByaWNlQnJlYWt1cFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+IFBSSUNFIEJSRUFLVVBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMHB4O1wiIGNsYXNzPVwiYm9keS1sYXJnZSBicmllZi1kZXNjXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3JcIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGE/LmRlc2NyaXB0b3I/Lm5hbWUgfCBzYW5pdGl6ZUh0bWxcIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5jb2xvclwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YkluZHVzdHJ5TmFtZSA9PSAnRWNvbW1lcmNlIEpld2VsbGVyeSdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWxsZXJ5LXRhYmxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIHJlc3BvbnNlRGF0YT8ubWF0ZXJpYWxzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqZXdlbC1jb250YWluZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqZXdlbC1oZWFkZXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRIZWFkZXJDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxyXG4gICAgICAgICAgICAgICAge3tlbGU/Lm1hdGVyaWFsTmFtZSB8IHRpdGxlY2FzZX19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcihlbGUubWF0ZXJpYWxUeXBlKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1ldGFsLXB1cml0eVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIE5ldCBXZWlnaHQve3tlbGU/LnVuaXQgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tlbGUucXVhbnRpdHkgKyBcIiBcIiArIChlbGU/LnVuaXQgfCB0aXRsZWNhc2UpfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtZXRhbC1wdXJpdHlcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICBQdXJpdHlcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZWxlLnB1cml0eSB8XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVjYXNlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJpY2UvR3JhbVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5e3sgZ2V0UHJpY2VQZXJHcmFtKGVsZS5wcmltYXJ5TWF0ZXJpYWxXZWlnaHQsZWxlLm1hdGVyaWFsUHJpY2UpIHxcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXI6JzEuMi0yJ319XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICBWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5e3tlbGUubWF0ZXJpYWxQcmljZSB8IG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJqZXdlbC1jb250YWluZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiamV3ZWwtaGVhZGVyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0SGVhZGVyQ29sb3IoJ01ha2luZyBDaGFyZ2VzJylcIj5cclxuICAgICAgICAgICAgICBNYWtpbmcgQ2hhcmdlc1xyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgdy0xMDAgYnItcFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEJhY2tncm91bmRDb2xvcignTWFraW5nIENoYXJnZXMnKVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgTmV0IFdlaWdodFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZXNwb25zZURhdGE/LmJhc2VXZWlnaHR9fSA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIE1ha2luZyBDaGFyZ2UgJVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZXNwb25zZURhdGE/Lm1ha2luZ0NoYXJnZVBlcmNlbnRhZ2V9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICBWYWx1ZVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAg4oK5e3tyZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/Lm1ha2luZ0NoYXJnZUFtb3VudCB8IG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwidGFiLWdyb3VwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGhyZWY9XCIjY29sbGFwc2VFeGFtcGxlXCIgPkRlc2NyaXB0aW9uPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgY2xhc3M9XCJib2R5LWxhcmdlIGNvbGxhcHNlXCIgaWQ9XCJjb2xsYXBzZUV4YW1wbGVcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvclwiXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZVwiPjwvZGl2PiAtLT5cclxuICA8L2Rpdj5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI0ltYWdlU2VjdGlvbj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXZhcmllbnRMb2FkaW5nICYmIChpc01vYmlsZSB8fCBkYXRhPy5zdHlsZXM/LmdyaWRTdHlsZSA9PSAnU3R5bGUxJylcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdHlsZS0xLXZlcnRpY2FsIGQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWFpbi1pbWFnZS1jb250YWluZXIgcC0wXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taW1nIHJvdW5kZWQtM1wiPlxyXG4gICAgICAgICAgPGxpYi1uZ3gtaW1hZ2Utem9vbSAqbmdJZj1cImN1cnJlbnRJbWdcIiBbdGh1bWJJbWFnZV09XCJjdXJyZW50SW1nXCIgW2Z1bGxJbWFnZV09XCJjdXJyZW50SW1nXCIgW3pvb21Nb2RlXT1cIidob3ZlcidcIlxyXG4gICAgICAgICAgICBbbWFnbmlmaWNhdGlvbl09XCIyXCIgW2VuYWJsZVNjcm9sbFpvb21dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgPC9saWItbmd4LWltYWdlLXpvb20+XHJcbiAgICAgICAgICA8aW1nICpuZ0lmPVwiIWN1cnJlbnRJbWdcIiBzcmM9XCJodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMCBvYmplY3QtZml0LWNvdmVyXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsLXJvdyBweS0zIGQtZmxleCBnYXAtMiBvdmVyZmxvdy1hdXRvIGhpZGUtc2Nyb2xsXCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImltZyB0aHVtYm5haWwtaW1nXCIgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzXCIgW3NyY109XCJpbWcuaW1nVXJsXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiXHJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlLXRodW1iXT1cImN1cnJlbnRJbWcgPT0gaW1nLmltZ1VybFwiXHJcbiAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgbWluLXdpZHRoOiA4MHB4OyB3aWR0aDogODBweDsgaGVpZ2h0OiA4MHB4OyBvYmplY3QtZml0OiBjb3ZlcjsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImltZy5pbWdVcmwgPT0gY3VycmVudEltZyA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAndHJhbnNwYXJlbnQnXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFyaWVudExvYWRpbmcgJiYgKCFpc01vYmlsZSAmJiBkYXRhPy5zdHlsZXM/LmdyaWRTdHlsZSA9PSAnU3R5bGUyJylcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJiZW50by1tYXNvbnJ5LWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiYmVudG8taXRlbS1tb2Rlcm5cIiBbY2xhc3MuZmVhdHVyZWRdPVwiaSA9PT0gMFwiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJpbWcuaW1nVXJsXCIgY2xhc3M9XCJiZW50by1pbWctbW9kZXJuXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaXRlbS1pbWdcIiAqbmdJZj1cInZhcmllbnRMb2FkaW5nXCI+XHJcbiAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzEwcHgnXHJcbiAgICB9XCI+XHJcbiAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2JyYW5kaW5nPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5kIG9mIGJyYW5kUHJvbWlzZXNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00IGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZy0yXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIlxyXG4gICAgICAgICAgW3NyY109XCJicmFuZD8ubG9nb1VybFwiIGFsdD1cIlwiIGNsYXNzPVwidy1oLTQwIHAtMCByb3VuZGVkLWNpcmNsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC10ZXh0IHctMTAwIHRleHQtY2VudGVyIHB5LTJcIj5cclxuICAgICAgICAgIHt7YnJhbmQ/LnRpdGxlIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdmlkZW9DYWxsU2NoZWR1bGU+XHJcbiAgPCEtLSAqbmdJZj1cImVjb21Db25maWdzPy52aWRlb0NhbGxFbmFibGVkXCIgLS0+XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgdmlkZW8tY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCB2aWRlby1jYWxsLWltZ1wiPlxyXG4gICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNTUwMDdjMTc1MzYyMDc3MjY2NjExMjg5LTIyOTIyMTAyM19zbWFsbC5naWZcIlxyXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBoLTEwMCBcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBhbGlnbi1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1oZWFkLXRleHRcIj5cclxuICAgICAgICAgIExpdmUgVmlkZW8gQ2FsbFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dFwiPlxyXG4gICAgICAgICAgSm9pbiBhIGxpdmUgdmlkZW8gY2FsbCB3aXRoIG91ciBjb25zdWx0YW50cyB0byBzZWUgeW91ciBmYXZvdXJpdGUgZGVzaWducyB1cCBjbG9zZSFcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2NoLWJ0biB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIFthcHBCdXR0b25FZGl0b3JdPVwiZWRpdCA/PyBmYWxzZVwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlXHJcbiAgICAgICAgICBbYnV0dG9uU3R5bGVdPVwiZ2V0QnV0dG9uU3R5bGUoMilcIiBbYnV0dG9uSWRdPVwiZ2V0QnV0dG9uSWQoMilcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCJcclxuICAgICAgICAgIFtpZF09XCJkYXRhPy5pZCtnZXRCdXR0b25JZCgyKVwiIChjbGljayk9XCIhZWRpdCA/IG9wZW5EaWFsb2dCb3goZGlhbG9nQm94KSA6ICcnXCI+XHJcbiAgICAgICAgICBTY2hlZHVsZSBhIFZpZGVvIENhbGxcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjRGVsaXZlcnlTZWN0aW9uPlxyXG4gIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1jb250YWluZXJcIj5cclxuICAgIDxoMiBjbGFzcz1cImRlbGl2ZXJ5LXRpdGxlXCI+RGVsaXZlcnksIFN0b3JlcyAmIFRyaWFsPC9oMj5cclxuXHJcbiAgICA8IS0tIExvY2F0aW9uIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tc2VjdGlvbiBtYi0yXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWdyb3ctMSBtZS0yXCIgc3R5bGU9XCJ3aWR0aDogY2FsYygxMDAlIC0gMTAwcHgpO1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBteC0xXCI+PG1hdC1pY29uXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJncHMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInBvc3RhbC1jb2RlLWlucHV0IGZsZXgtZ3Jvdy0xXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW5Db2RlXCIgWyhuZ01vZGVsKV09XCJwaW5jb2RlXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGxvY2F0ZS1idG5cIiAoY2xpY2spPVwiZ2V0U3RvcmVEZXRhaWxzKClcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhaXNQaW5Db2RlXCIgc3R5bGU9XCJjb2xvcjogcmVkO1wiPlBpbiBjb2RlIG11c3QgYmUgNiBkaWdpdHMuPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHBpbmNvZGU/LnRvU3RyaW5nKCkubGVuZ3RoID8/IDApID09IDZcIj5cclxuICAgICAgPCEtLSBGcmVlIERlbGl2ZXJ5IFNlY3Rpb24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktaWNvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXHJcbiAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBjbGFzcz1cImZlYXRoZXIgZmVhdGhlci1naWZ0XCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjIwIDEyIDIwIDIyIDQgMjIgNCAxMlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiN1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCI1XCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjIyXCIgeDI9XCIxMlwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDdINy41YTIuNSAyLjUgMCAwIDEgMC01QzExIDIgMTIgNyAxMiA3elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDdoNC41YTIuNSAyLjUgMCAwIDAgMC01QzEzIDIgMTIgNyAxMiA3elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS10ZXh0XCIgKm5nSWY9XCJlY29tQ29uZmlncz8uZGVsaXZlcnlDaGFyZ2VzID09IDBcIj5FeHBlY3RlZFxyXG4gICAgICAgICAgICBEZWxpdmVyeSBieSB7eyBnZXREYXRlQWZ0ZXJ4RGF5cygpIHwgZGF0ZTonZCBNTU0nIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVsaXZlcnktdGV4dFwiICpuZ0lmPVwiZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyA+IDBcIj5Zb3VyXHJcbiAgICAgICAgICAgIGV4cGVjdGVkIE9yZGVyIHdpbGxcclxuICAgICAgICAgICAgRGVsaXZlciBieSB7eyBnZXREYXRlQWZ0ZXJ4RGF5cygpIHwgZGF0ZTonZCBNTU0nIH19IHdpdGggYSBEZWxpdmVyeSBDaGFyZ2Ugb2ZcclxuICAgICAgICAgICAg4oK5IHt7ZWNvbUNvbmZpZ3M/LmRlbGl2ZXJ5Q2hhcmdlcyB8IG51bWJlcjonMS4yLTInfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNUcnlBdEhvbWU+XHJcbiAgPCEtLSBUcnkgQXQgSG9tZSBTZWN0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1zZWN0aW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IHRyeS1ob21lLWl0ZW1cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJob21lLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItaG9tZVwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0zIDlsOS03IDkgN3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiOSAyMiA5IDEyIDE1IDEyIDE1IDIyXCI+PC9wb2x5bGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJ5LWhvbWUtZGV0YWlsc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0cnktaG9tZS1oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJ5LWhvbWUtdGV4dFwiPlRyeSBBdCBIb21lPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcmVlLXRleHRcIj4gKEl0J3MgRnJlZSk8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtYXBwb2ludG1lbnQtdGV4dFwiPkhvbWUgQXBwb2ludG1lbnQgPHNwYW4+QXZhaWxhYmxlIHRvIHRyeSBmcm9tIDI5IEp1bDwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgSG9tZSBBcHBvaW50bWVudCA8c3BhbiBjbGFzcz1cImFwcG9pbnRtZW50LWF2YWlsYWJsZVwiPkF2YWlsYWJsZSB0byB0cnkgZnJvbSAyOCBKdW48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgtYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJvb2stYXBwb2ludG1lbnQtYnRuXCIgKGNsaWNrKT1cImFkZFRvVHJpYWxDYXJ0KClcIiAqbmdJZj1cIiFpc0l0ZW1BZGRlZEFzVHJpYWxcIj5UcnkgYXRcclxuICAgICAgICBIT01FPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJib29rLWFwcG9pbnRtZW50LWJ0blwiICpuZ0lmPVwiaXNJdGVtQWRkZWRBc1RyaWFsXCI+SE9NRSBBUFBPSU5UTUVOVCBCT09LRUQ8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjU3RvcmVTZWN0aW9uPlxyXG4gIDwhLS0gTmVhcmVzdCBTdG9yZSBTZWN0aW9uIC0tPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0lmPVwic3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVOYW1lICYmIHN0b3JlRGV0YWlscz8ubmVhcmJ5U3RvcmU/LnN0b3JlTmFtZT8ubGVuZ3RoID4gMDtlbHNlIGVtcHR5U3RvcmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1zZWN0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHN0b3JlLWl0ZW1cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWljb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgPHN2ZyBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgY2xhc3M9XCJmZWF0aGVyIGZlYXRoZXItc2hvcHBpbmctYmFnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAyTDMgNnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJWNmwtMy00elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIzXCIgeTE9XCI2XCIgeDI9XCIyMVwiIHkyPVwiNlwiPjwvbGluZT5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNiAxMGE0IDQgMCAwIDEtOCAwXCI+PC9wYXRoPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1kZXRhaWxzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtdGV4dFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0b3JlLWxhYmVsXCI+TmVhcmVzdCBTdG9yZSAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdG9yZS1uYW1lXCI+e3sgc3RvcmVEZXRhaWxzPy5uZWFyYnlTdG9yZT8uc3RvcmVOYW1lIHwgdGl0bGVjYXNlfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJzdG9yZS1kaXN0YW5jZVwiPiAoNGttKTwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImF2YWlsYWJpbGl0eS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmFpbGFiaWxpdHktYmFkZ2VcIj7ij7AgQVZBSUxBQkxFIEJZIDI4IEpVTjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwib3RoZXItc3RvcmVzLXRleHRcIj5cclxuICAgICAgICAgICAgICBBbHNvIEF2YWlsYWJsZSBpbiA8c3BhbiBjbGFzcz1cIm90aGVyLXN0b3Jlcy1saW5rXCI+MTggb3RoZXIgc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZmluZC1zdG9yZS1idG4gdy0xMDBcIiBbYXBwQnV0dG9uRWRpdG9yXT1cImVkaXQgPz8gZmFsc2VcIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZVxyXG4gICAgICAgICAgW2J1dHRvblN0eWxlXT1cImdldEJ1dHRvblN0eWxlKDEpXCIgW2J1dHRvbklkXT1cImdldEJ1dHRvbklkKDEpXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiXHJcbiAgICAgICAgICBbaWRdPVwiZGF0YT8uaWQrZ2V0QnV0dG9uSWQoMSlcIiAoY2xpY2spPVwib25GaW5kSW5TdG9yZShzdG9yZURldGFpbHM/Lm5lYXJieVN0b3JlPy5pZClcIj5GSU5EIElOXHJcbiAgICAgICAgICBTVE9SRTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy10ZW1wbGF0ZSAjZW1wdHlTdG9yZT5cclxuICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1zZWN0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS1pY29uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzdmcgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwiZmVhdGhlciBmZWF0aGVyLXNob3BwaW5nLWJhZ1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTYgMkwzIDZ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yVjZsLTMtNHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiM1wiIHkxPVwiNlwiIHgyPVwiMjFcIiB5Mj1cIjZcIj48L2xpbmU+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYgMTBhNCA0IDAgMCAxLTggMFwiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LXRleHRcIj5ObyBTdG9yZXMgYXJlIGF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cIm9mZmNhbnZhcyBvZmZjYW52YXMtZW5kIG9mZmNhbnZhcy12YXJpYW50XCIgdGFiaW5kZXg9XCItMVwiIGlkPVwib2ZmY2FudmFzUmlnaHRWYXJpYW50XCJcclxuICBhcmlhLWxhYmVsbGVkYnk9XCJvZmZjYW52YXNSaWdodExhYmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmcy01XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHB4LTMgcGItMlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInByaWNlLXRleHRcIj5QcmljZTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCAgZy0zIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIiBbbmdDbGFzc109XCJ7J2Rpc2NvdW50LXByaWNlJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiXHJcbiAgICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgJiYgcmVzcG9uc2VEYXRhLnByaWNlLmRpc2NvdW50ZWRQcmljZSA+IDBcIj48c3BhblxyXG4gICAgICAgICAgW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9fTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIlxyXG4gICAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlICYmIGdldERpZmZlcmVuY2UocmVzcG9uc2VEYXRhPy5wcmljZT8uc2VsbGluZ1ByaWNlLCByZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UpID4gMlwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LWRlY29yYXRpb24tbGluZS10aHJvdWdoJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiPjxzcGFuXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAgICB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LnNlbGxpbmdQcmljZSB8IG51bWJlcjonMS4wLTAnfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWNvbnRhaW5lciBoLTEwMCBwLTNcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidmFyaWVudC1kYXRhXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQta2V5XCI+e3t2YXJpZW50LmtleX19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YXJpZW50VmFsdWUgb2YgdmFyaWVudC52YWx1ZVwiIGNsYXNzPVwidmFyaWVudC10YWdcIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gJ3doaXRlJyA6IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/IGRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiAnJ1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWYXJpZW50KHZhcmllbnQua2V5LCB2YXJpZW50VmFsdWUpXCI+e3t2YXJpZW50VmFsdWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb25maXJtLWJ0biB3LTEwMCBwLTMgdGV4dC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIHN0eWxlPVwiY29sb3I6IHdoaXRlO1wiPkNvbmZpcm1cclxuICAgIEN1c3RvbWl6YXRpb248L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2RpYWxvZ0JveD5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbS1jZW50ZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmctdmlkZW8gdy0xMDAgcHktMiB0ZXh0LWNlbnRlclwiPkxpdmUgVmlkZW8gY2FsbCBhdCB5b3VyIGNvbnZlbmllbmNlITwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2NoZWR1bGUtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cIm1hdENsb3NlRGlhbG9nKClcIlxyXG4gICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZnMtNVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGgtMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaC0xMDAgdy0xMDAgdmlkZW8tY2FsbC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgaC0xMDBcIiAqbmdJZj1cIiFpc01vYmlsZVwiPlxyXG4gICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzU1NzY5OWMxNzUzNzc5NTAzOTEzZnJlZXBpay1vdmVyaGVhZC1zaG90LWEtcGVyc29uLWhvbGRpbmctYS1zbWFydHBob25lLXdpdGgtYS0xMDI5X3ZtZzhHcUhqIChvbmxpbmUtdmlkZW8tY3V0dGVyLmNvbSkuZ2lmXCJcclxuICAgICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiIHN0eWxlPVwib2JqZWN0LWZpdDogY292ZXI7XCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHBvc2l0aW9uLXJlbGF0aXZlIGgtMTAwIGNhbGwtZGV0YWlsc1wiPlxyXG4gICAgICAgICAgPCEtLSBOYW1lIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnVzZXJuYW1lXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgTmFtZSpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQudXNlcm5hbWVcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCd1c2VybmFtZScpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZmllbGQgbXktM1wiIFtjbGFzcy5lcnJvci1ib3JkZXJdPVwidmFsaWRhdGlvbkVycm9ycy5lbWFpbFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBFbWFpbCpcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQuZW1haWxcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCdlbWFpbCcpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBOdW1iZXIgSW5wdXQgd2l0aCBWYWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkIG15LTNcIiBbY2xhc3MuZXJyb3ItYm9yZGVyXT1cInZhbGlkYXRpb25FcnJvcnMubW9iaWxlTnVtYmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dC1jYWxsXCI+SU4gKzkxPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBNb2JpbGUqXCIgWyhuZ01vZGVsKV09XCJ2aWRlb0NhbGxQYXlsb2FkLm1vYmlsZU51bWJlclwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ21vYmlsZU51bWJlcicpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBQaW5jb2RlIElucHV0IHdpdGggVmFsaWRhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCIgW2NsYXNzLmVycm9yLWJvcmRlcl09XCJ2YWxpZGF0aW9uRXJyb3JzLnBpbmNvZGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0LWNhbGwgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMiBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImYtMTggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+Z3BzX2ZpeGVkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBQaW4gQ29kZSpcIiBjbGFzcz1cInctODhcIiBbKG5nTW9kZWwpXT1cInZpZGVvQ2FsbFBheWxvYWQucGluY29kZVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJ3BpbmNvZGUnKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10ZXh0IG1iLTJcIj5MYW5ndWFnZSBQcmVmZXJlbmNlPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1jb250YWluZXIgZC1mbGV4IGdhcC0yIGZsZXgtd3JhcCBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5nIHB4LTIgcHktMSByb3VuZGVkIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwibGFuZyA9PSBzZWxlY3RlZExhbmcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRMYW5nID0gbGFuZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJsYW5nID09IHNlbGVjdGVkTGFuZyA/IGdldFRleHRDb2xvcihkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yKSA6ICcjMDAwMDAwJ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7e2xhbmd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMYW5nID09ICdPdGhlcnMnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1maWVsZCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBPdGhlciBMYW5ndWFnZVwiIFsobmdNb2RlbCldPVwib3RoZXJMYW5ndWFnZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInZpZGVvLWJ0biBtdC0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIFtkaXNhYmxlZF09XCJpc1N1Ym1pdHRpbmdcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3VibWl0dGluZ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFNDSEVEVUxJTkcuLi5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNTdWJtaXR0aW5nICYmICFzY2hlZHVsZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJzY2hlZHVsZVZpZGVvQ2FsbCgpXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+dmlkZW9fY2FsbDwvbWF0LWljb24+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICBTQ0hFRFVMRSBBIFZJREVPIENBTExcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzY2hlZHVsZWRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj4mbmJzcDtcclxuICAgICAgICAgICAgICBTQ0hFRFVMRUQgU1VDQ0VTU0ZVTExZXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwib2ZmY2FudmFzIG9mZmNhbnZhcy1lbmQgb2ZmY2FudmFzLXNtYWxsIG92ZXJmbG93LXNjcm9sbFwiIHRhYmluZGV4PVwiLTFcIiBpZD1cIm9mZmNhbnZhc1JpZ2h0UHJpY2VCcmVha3VwXCI+XHJcbiAgPGRpdiBjbGFzcz1cInZhcmllbnQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBwLTJcIj5cclxuICAgIDxtYXQtaWNvbiBkYXRhLWJzLWRpc21pc3M9XCJvZmZjYW52YXNcIlxyXG4gICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmcy01XCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ2YXJpZW50LXByaWNlIHAtMTAtMjBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwcmljZS1icmVhay1oZWFkZXJcIj57e3Jlc3BvbnNlRGF0YT8ubmFtZX19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInByaWNlLWJyZWFrdXAgaC0xMDAgdy0xMDBcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiByZXNwb25zZURhdGE/Lm1hdGVyaWFsc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJpY2UtY29udGFpbmVyIG1iLTMgcC0xMC0yMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZS1jb250YWluZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICB7eyBlbGUubWF0ZXJpYWxUeXBlICsgXCIgQlJFQUtVUFwiIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBoZWFkZXItcm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXJcIj5DT01QT05FTlQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPlJBVEU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlclwiPldFSUdIVDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+RklOQUwgVkFMVUU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHZhbHVlLXJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+e3sgZWxlLnB1cml0eSB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+4oK5e3sgZ2V0UHJpY2VQZXJHcmFtKGVsZS5wcmljZVBlclVuaXQsZWxlLm1hdGVyaWFsVHlwZSkgfFxyXG4gICAgICAgICAgICBudW1iZXI6JzEuMi0yJyB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyXCI+e3tlbGUucXVhbnRpdHkgKyAnICcgKyAoZWxlLnVuaXQgfCB0aXRsZWNhc2UpfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyB0ZXh0LWNlbnRlciB0b3RhbFwiPuKCuXt7IGVsZS5wcmljZVBlclVuaXQgKiBlbGUucXVhbnRpdHkgfCBudW1iZXIgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicHJpY2UtY29udGFpbmVyIG1iLTMgcC0xMC0zMCBweS0wIGJvcmRlci11bnNldFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5NYWtpbmcgQ2hhcmdlczwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiB0ZXh0LWVuZCB0b3RhbFwiPuKCuXt7IHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ubWFraW5nQ2hhcmdlQW1vdW50IHwgbnVtYmVyOicxLjItMicgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDAgc3VtbWFyeS1yb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1zdGFydFwiPlRheCBBbW91bnQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj7igrl7eyByZXNwb25zZURhdGE/Lmpld2VscnlQcmljZUJyZWFrdXA/LnRheEFtb3VudCB8IG51bWJlcjonMS4yLTInIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIHN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHRleHQtc3RhcnRcIj5Ub3RhbCBBbW91bnQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgdGV4dC1lbmQgdG90YWxcIj5cclxuICAgICAgICAgIOKCuXt7KHJlc3BvbnNlRGF0YT8uamV3ZWxyeVByaWNlQnJlYWt1cD8ucHJpY2VXaXRob3V0VGF4ICsgcmVzcG9uc2VEYXRhPy5qZXdlbHJ5UHJpY2VCcmVha3VwPy50YXhBbW91bnQpIHxcclxuICAgICAgICAgIG51bWJlcjonMS4yLTInfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNSZXZpZXdzU2VjdGlvbj5cclxuICA8ZGl2IGNsYXNzPVwicnYtc2VjdGlvblwiICpuZ0lmPVwicmV2aWV3c0RhdGFcIj5cclxuXHJcbiAgICA8IS0tIEhlYWRlcjogVGl0bGUgKyBBdmVyYWdlIHwgQmFyIENoYXJ0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ2LWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtaGVhZGVyLWxlZnRcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJydi10aXRsZVwiPlJldmlld3MgJmFtcDsgUmF0aW5nczwvaDI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWF2ZXJhZ2Utcm93XCI+XHJcbiAgICAgICAgICA8IS0tIGZpbGxlZCBzdGFycyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1zdGFyc1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDIsMyw0LDVdXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWF2Zy1udW1cIj57e3Jlc3BvbnNlRGF0YT8uYXZlcmFnZVJhdGluZyB8IG51bWJlcjonMS4xLTEnfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWF2Zy1sYWJlbFwiPmF2ZXJhZ2U8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWNvdW50XCIgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgfHwgJyMxMGI5ODEnXCI+XHJcbiAgICAgICAgICB7e3Jlc3BvbnNlRGF0YT8udG90YWxSZXZpZXdDb3VudCB8IG51bWJlcn19IFJldmlld3NcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJhdGluZyBvZiBbNSw0LDMsMiwxXVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWJhci1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1iYXItbGFiZWxcIj57e3JhdGluZ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xMy45NzE4IDUuMzY0NTNDMTMuOTM5OCA1LjI2Mjk4IDEzLjg3OTggNS4xNzI1MiAxMy43OTg2IDUuMTAzNTZDMTMuNzE3NSA1LjAzNDYgMTMuNjE4NiA0Ljk4OTk0IDEzLjUxMzIgNC45NzQ3Mkw5LjM3MDQzIDQuMzcwODhMNy41MTMwNyAwLjYxNzk1NUM3LjQ2MDIxIDAuNTI5MjcxIDcuMzg1MjIgMC40NTU4MzQgNy4yOTU0NSAwLjQwNDgzNkM3LjIwNTY4IDAuMzUzODM4IDcuMTA0MiAwLjMyNzAyNiA3LjAwMDk2IDAuMzI3MDI2QzYuODk3NzEgMC4zMjcwMjYgNi43OTYyNCAwLjM1MzgzOCA2LjcwNjQ3IDAuNDA0ODM2QzYuNjE2NyAwLjQ1NTgzNCA2LjU0MTcxIDAuNTI5MjcxIDYuNDg4ODUgMC42MTc5NTVMNC42MzE0OSA0LjM3MDg4TDAuNDg4NzQ2IDQuOTc0NzJDMC4zODMzNjMgNC45ODk5NCAwLjI4NDQxNiA1LjAzNDYgMC4yMDMyODYgNS4xMDM1NkMwLjEyMjE1NyA1LjE3MjUyIDAuMDYyMTQwNyA1LjI2Mjk4IDAuMDMwMTQgNS4zNjQ1M0MtMC4wMDQwMjI4NiA1LjQ2NTcxIC0wLjAwOTI0NDI4IDUuNTc0NDIgMC4wMTUwNjQ1IDUuNjc4NDFDMC4wMzkzNzMzIDUuNzgyNCAwLjA5MjI0NTcgNS44Nzc1MyAwLjE2NzcyMiA1Ljk1MzA4TDMuMTc5MjQgOC44NzI4N0wyLjQ2ODQgMTMuMDAwM0MyLjQ1MDM4IDEzLjEwNjYgMi40NjIyOSAxMy4yMTU4IDIuNTAyNzggMTMuMzE1N0MyLjU0MzI4IDEzLjQxNTYgMi42MTA3NyAxMy41MDIyIDIuNjk3NyAxMy41NjU5QzIuNzg0NzcgMTMuNjI4IDIuODg3NDYgMTMuNjY0NCAyLjk5NDE2IDEzLjY3MTJDMy4xMDA4NyAxMy42NzggMy4yMDczMyAxMy42NTQ3IDMuMzAxNTMgMTMuNjA0Mkw3LjAwMDk2IDExLjY1NTFMMTAuNzA4IDEzLjYwNDJDMTAuNzkgMTMuNjQ5MSAxMC44ODIgMTMuNjcyOCAxMC45NzU1IDEzLjY3M0MxMS4wOTU4IDEzLjY3MTYgMTEuMjEyOSAxMy42MzQzIDExLjMxMTkgMTMuNTY1OUMxMS4zOTg4IDEzLjUwMjIgMTEuNDY2MyAxMy40MTU2IDExLjUwNjggMTMuMzE1N0MxMS41NDczIDEzLjIxNTggMTEuNTU5MiAxMy4xMDY2IDExLjU0MTIgMTMuMDAwM0wxMC44MjI3IDguODcyODdMMTMuODI2NiA1Ljk1MzA4QzEzLjkwMzMgNS44NzgzNSAxMy45NTc3IDUuNzgzNiAxMy45ODMzIDUuNjc5NTdDMTQuMDA5IDUuNTc1NTQgMTQuMDA1IDUuNDY2NCAxMy45NzE4IDUuMzY0NTNaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjZWFiMzA4XCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1iYXItdHJhY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtYmFyLWZpbGxcIiBbc3R5bGUud2lkdGguJV09XCJnZXRQZXJjZW50YWdlKHJhdGluZylcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJldmlldyBDYXJkcyBHcmlkIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJ2LWdyaWRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmV2aWV3IG9mIHJldmlld3NEYXRhXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJldmlldy5yZXZpZXdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1jYXJkLXRvcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1yZXZpZXdlclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIidodHRwczovL3VpLWF2YXRhcnMuY29tL2FwaS8/bmFtZT0nICsgKHJldmlldz8udXNlck5hbWUgPz8gJ1UnKSArICcmYmFja2dyb3VuZD1yYW5kb20nXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJydi1hdmF0YXJcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1uYW1lLWRhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1uYW1lXCI+e3tyZXZpZXc/LnVzZXJOYW1lID8/ICdBbm9ueW1vdXMnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnYtZGF0ZVwiPnt7cmV2aWV3Py5jcmVhdGVkQXQgfCBkYXRlOidkIE1NTSB5J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSBTdGFyIHJhdGluZyAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnYtY2FyZC1zdGFyc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwyLDMsNCw1XVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicyA8PSByZXZpZXcucmF0aW5nXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuOTcxOCA1LjM2NDUzQzEzLjkzOTggNS4yNjI5OCAxMy44Nzk4IDUuMTcyNTIgMTMuNzk4NiA1LjEwMzU2QzEzLjcxNzUgNS4wMzQ2IDEzLjYxODYgNC45ODk5NCAxMy41MTMyIDQuOTc0NzJMOS4zNzA0MyA0LjM3MDg4TDcuNTEzMDcgMC42MTc5NTVDNy40NjAyMSAwLjUyOTI3MSA3LjM4NTIyIDAuNDU1ODM0IDcuMjk1NDUgMC40MDQ4MzZDNy4yMDU2OCAwLjM1MzgzOCA3LjEwNDIgMC4zMjcwMjYgNy4wMDA5NiAwLjMyNzAyNkM2Ljg5NzcxIDAuMzI3MDI2IDYuNzk2MjQgMC4zNTM4MzggNi43MDY0NyAwLjQwNDgzNkM2LjYxNjcgMC40NTU4MzQgNi41NDE3MSAwLjUyOTI3MSA2LjQ4ODg1IDAuNjE3OTU1TDQuNjMxNDkgNC4zNzA4OEwwLjQ4ODc0NiA0Ljk3NDcyQzAuMzgzMzYzIDQuOTg5OTQgMC4yODQ0MTYgNS4wMzQ2IDAuMjAzMjg2IDUuMTAzNTZDMC4xMjIxNTcgNS4xNzI1MiAwLjA2MjE0MDcgNS4yNjI5OCAwLjAzMDE0IDUuMzY0NTNDLTAuMDA0MDIyODYgNS40NjU3MSAtMC4wMDkyNDQyOCA1LjU3NDQyIDAuMDE1MDY0NSA1LjY3ODQxQzAuMDM5MzczMyA1Ljc4MjQgMC4wOTIyNDU3IDUuODc3NTMgMC4xNjc3MjIgNS45NTMwOEwzLjE3OTI0IDguODcyODdMMi40Njg0IDEzLjAwMDNDMi40NTAzOCAxMy4xMDY2IDIuNDYyMjkgMTMuMjE1OCAyLjUwMjc4IDEzLjMxNTdDMi41NDMyOCAxMy40MTU2IDIuNjEwNzcgMTMuNTAyMiAyLjY5NzcgMTMuNTY1OUMyLjc4NDc3IDEzLjYyOCAyLjg4NzQ2IDEzLjY2NDQgMi45OTQxNiAxMy42NzEyQzMuMTAwODcgMTMuNjc4IDMuMjA3MzMgMTMuNjU0NyAzLjMwMTUzIDEzLjYwNDJMNy4wMDA5NiAxMS42NTUxTDEwLjcwOCAxMy42MDQyQzEwLjc5IDEzLjY0OTEgMTAuODgyIDEzLjY3MjggMTAuOTc1NSAxMy42NzNDMTEuMDk1OCAxMy42NzE2IDExLjIxMjkgMTMuNjM0MyAxMS4zMTE5IDEzLjU2NTlDMTEuMzk4OCAxMy41MDIyIDExLjQ2NjMgMTMuNDE1NiAxMS41MDY4IDEzLjMxNTdDMTEuNTQ3MyAxMy4yMTU4IDExLjU1OTIgMTMuMTA2NiAxMS41NDEyIDEzLjAwMDNMMTAuODIyNyA4Ljg3Mjg3TDEzLjgyNjYgNS45NTMwOEMxMy45MDMzIDUuODc4MzUgMTMuOTU3NyA1Ljc4MzYgMTMuOTgzMyA1LjY3OTU3QzE0LjAwOSA1LjU3NTU0IDE0LjAwNSA1LjQ2NjQgMTMuOTcxOCA1LjM2NDUzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2VhYjMwOFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicyA+IHJldmlldy5yYXRpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cIm9wYWNpdHk6MC4yNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjk3MTggNS4zNjQ1M0MxMy45Mzk4IDUuMjYyOTggMTMuODc5OCA1LjE3MjUyIDEzLjc5ODYgNS4xMDM1NkMxMy43MTc1IDUuMDM0NiAxMy42MTg2IDQuOTg5OTQgMTMuNTEzMiA0Ljk3NDcyTDkuMzcwNDMgNC4zNzA4OEw3LjUxMzA3IDAuNjE3OTU1QzcuNDYwMjEgMC41MjkyNzEgNy4zODUyMiAwLjQ1NTgzNCA3LjI5NTQ1IDAuNDA0ODM2QzcuMjA1NjggMC4zNTM4MzggNy4xMDQyIDAuMzI3MDI2IDcuMDAwOTYgMC4zMjcwMjZDNi44OTc3MSAwLjMyNzAyNiA2Ljc5NjI0IDAuMzUzODM4IDYuNzA2NDcgMC40MDQ4MzZDNi42MTY3IDAuNDU1ODM0IDYuNTQxNzEgMC41MjkyNzEgNi40ODg4NSAwLjYxNzk1NUw0LjYzMTQ5IDQuMzcwODhMMC40ODg3NDYgNC45NzQ3MkMwLjM4MzM2MyA0Ljk4OTk0IDAuMjg0NDE2IDUuMDM0NiAwLjIwMzI4NiA1LjEwMzU2QzAuMTIyMTU3IDUuMTcyNTIgMC4wNjIxNDA3IDUuMjYyOTggMC4wMzAxNCA1LjM2NDUzQy0wLjAwNDAyMjg2IDUuNDY1NzEgLTAuMDA5MjQ0MjggNS41NzQ0MiAwLjAxNTA2NDUgNS42Nzg0MUMwLjAzOTM3MzMgNS43ODI0IDAuMDkyMjQ1NyA1Ljg3NzUzIDAuMTY3NzIyIDUuOTUzMDhMMy4xNzkyNCA4Ljg3Mjg3TDIuNDY4NCAxMy4wMDAzQzIuNDUwMzggMTMuMTA2NiAyLjQ2MjI5IDEzLjIxNTggMi41MDI3OCAxMy4zMTU3QzIuNTQzMjggMTMuNDE1NiAyLjYxMDc3IDEzLjUwMjIgMi42OTc3IDEzLjU2NTlDMi43ODQ3NyAxMy42MjggMi44ODc0NiAxMy42NjQ0IDIuOTk0MTYgMTMuNjcxMkMzLjEwMDg3IDEzLjY3OCAzLjIwNzMzIDEzLjY1NDcgMy4zMDE1MyAxMy42MDQyTDcuMDAwOTYgMTEuNjU1MUwxMC43MDggMTMuNjA0MkMxMC43OSAxMy42NDkxIDEwLjg4MiAxMy42NzI4IDEwLjk3NTUgMTMuNjczQzExLjA5NTggMTMuNjcxNiAxMS4yMTI5IDEzLjYzNDMgMTEuMzExOSAxMy41NjU5QzExLjM5ODggMTMuNTAyMiAxMS40NjYzIDEzLjQxNTYgMTEuNTA2OCAxMy4zMTU3QzExLjU0NzMgMTMuMjE1OCAxMS41NTkyIDEzLjEwNjYgMTEuNTQxMiAxMy4wMDAzTDEwLjgyMjcgOC44NzI4N0wxMy44MjY2IDUuOTUzMDhDMTMuOTAzMyA1Ljg3ODM1IDEzLjk1NzcgNS43ODM2IDEzLjk4MzMgNS42Nzk1N0MxNC4wMDkgNS41NzU1NCAxNC4wMDUgNS40NjY0IDEzLjk3MTggNS4zNjQ1M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNlYWIzMDhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJydi10ZXh0XCI+e3tyZXZpZXc/LnJldmlldyA/PyAnTm8gY29tbWVudCBwcm92aWRlZC4nfX08L3A+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFJldmlldyBJbWFnZXMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1pbWFnZXNcIiAqbmdJZj1cInJldmlldz8ucmV2aWV3SW1hZ2VzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8YSAqbmdGb3I9XCJsZXQgaW1nIG9mIHJldmlldy5yZXZpZXdJbWFnZXNcIiBbaHJlZl09XCJpbWcuaW1nVXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJydi1pbWctbGlua1wiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJSZXZpZXcgaW1hZ2VcIiBjbGFzcz1cInJ2LWltZy10aHVtYlwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC00XCIgKm5nSWY9XCIocmV2aWV3c0RhdGE/Lmxlbmd0aCA/PyAwKSA+IDNcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIndyaXRlLXJldmlldy1idG5cIiAoY2xpY2spPVwibG9hZE1vcmVSZXZpZXdzKClcIj5Mb2FkIE1vcmUgUmV2aWV3czwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiZXhhbXBsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCIgcm9sZT1cImRpYWxvZ1wiXHJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgdmlkZW8tbW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgPHZpZGVvIGNvbnRyb2xzIG11dGVkIHBsYXlzaW5saW5lIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgIDxzb3VyY2VcclxuICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zNzE2NDdjMTc1Mzk2MjA4NDI2NWNsaWRlb19lZGl0b3JfNDhiYzkzYzI0ZTE4NDcwODg4YzY2MWJiMDllNDM3ZGEgKG9ubGluZS12aWRlby1jdXR0ZXIuY29tKS5tcDRcIlxyXG4gICAgICAgICAgICB0eXBlPVwidmlkZW8vbXA0XCI+XHJcbiAgICAgICAgICBZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxyXG4gICAgICAgIDwvdmlkZW8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInJldmlld01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInJldmlld01vZGFsTGFiZWxcIiByb2xlPVwiZGlhbG9nXCJcclxuICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHJldmlldy1tb2RhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1vZGFsLXRpdGxlIGZzLTVcIj48L2gxPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yZXZpZXctY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utc2VjdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbWFnZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWNrd2FyZC1hcnJvdyBhcnJvd1wiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGN1cnJlbnRJbWFnZUluZGV4LTFcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50SW1hZ2VJbmRleCA+IDBcIj7ilrw8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic2VsZWN0ZWRSZXZpZXc/LnJldmlld0ltYWdlcz8uW2N1cnJlbnRJbWFnZUluZGV4XT8uaW1nVXJsXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcndhcmQtYXJyb3cgYXJyb3dcIiAoY2xpY2spPVwiY3VycmVudEltYWdlSW5kZXggPSBjdXJyZW50SW1hZ2VJbmRleCsxXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEltYWdlSW5kZXggPCBzZWxlY3RlZFJldmlldz8uaW1hZ2VzPy5sZW5ndGggLSAxXCI+4payPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZWFyYnVkcy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFyZ2luZy1jYXNlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFyYnVkIGxlZnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJidWQgcmlnaHRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uLWFycm93c1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXdlci1hdmF0YXJcIj7wn5GkPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlld2VyLW5hbWVcIj57e3NlbGVjdGVkUmV2aWV3Py51c2VyTmFtZSA/PyBcIi1cIn19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yYXRpbmdcIiAqbmdJZj1cInNlbGVjdGVkUmV2aWV3Py5yYXRpbmdcIj5cclxuICAgICAgICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFJldmlldy5yYXRpbmdcIiBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtcmF0aW5nPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctZGF0ZVwiPlxyXG4gICAgICAgICAgICAgIFJldmlld2VkIGluIEluZGlhIG9uIDI0IEp1bHkgMjAyNVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctdGV4dFwiPlxyXG4gICAgICAgICAgICAgIHt7c2VsZWN0ZWRSZXZpZXc/LnJldmlldyA/PyBcIi1cIn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlcy1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPGgzPkltYWdlcyBpbiB0aGlzIHJldmlldzwvaDM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy1pbWFnZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctaW1hZ2VcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogY3VycmVudEltYWdlSW5kZXggPT0gaX1cIlxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1nIG9mIHNlbGVjdGVkUmV2aWV3Py5yZXZpZXdJbWFnZXMgPz8gW107bGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJjdXJyZW50SW1hZ2VJbmRleCA9IGlcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZy5pbWdVcmxcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19