simpo-component-library 3.6.965 → 3.6.968
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
- package/esm2022/lib/components/deprecated-section/deprecated-section.component.mjs +1 -1
- package/esm2022/lib/components/document/document.component.mjs +3 -3
- package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
- package/esm2022/lib/components/payment-details/payment-details.component.mjs +3 -3
- package/esm2022/lib/constants/business.constant.mjs +1 -1
- package/esm2022/lib/directive/alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
- package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
- package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/button-editor.directive.mjs +1 -1
- package/esm2022/lib/directive/color.directive.mjs +1 -1
- package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
- package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/contenteditable.directive.mjs +1 -1
- package/esm2022/lib/directive/corner-directive.mjs +1 -1
- package/esm2022/lib/directive/height.directive.mjs +1 -1
- package/esm2022/lib/directive/hover-animation.directive.mjs +1 -1
- package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
- package/esm2022/lib/directive/icon-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-container.directive.mjs +1 -1
- package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-editor.directive.mjs +1 -1
- package/esm2022/lib/directive/image-position.directive.mjs +1 -1
- package/esm2022/lib/directive/letters-only.directive.mjs +1 -1
- package/esm2022/lib/directive/merge-header.directive.mjs +1 -1
- package/esm2022/lib/directive/numbers-only.directive.mjs +1 -1
- package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/set-dynamic-background.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-around.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/text-size.directive.mjs +1 -1
- package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
- package/esm2022/lib/directive/video-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/address/address.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/categories-with-image-background-columns/categories-with-image-background-columns.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
- package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
- package/esm2022/lib/elements/add-section/add-section.component.mjs +3 -3
- package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
- package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/booking-cart-groups/booking-cart-groups.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.model.mjs +1 -1
- package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
- package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/editor-service.service.mjs +1 -1
- package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
- package/esm2022/lib/elements/index.mjs +1 -1
- package/esm2022/lib/elements/link-editor/link-editor.component.mjs +3 -3
- package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
- package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
- package/esm2022/lib/elements/my-bookings/my-bookings.component.mjs +3 -3
- package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
- package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +3 -3
- package/esm2022/lib/elements/property/property.component.mjs +3 -3
- package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
- package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
- package/esm2022/lib/elements/text/text.component.mjs +3 -3
- package/esm2022/lib/elements/text-editor/text-editor.component.mjs +7 -7
- package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
- package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
- package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
- package/esm2022/lib/sections/BaseSection.mjs +1 -1
- package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
- package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +18 -5
- package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
- package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
- package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
- package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
- package/esm2022/lib/sections/brand-story-section/brand-story-section.component.mjs +3 -3
- package/esm2022/lib/sections/brand-story-section/brand-story-section.modal.mjs +1 -1
- package/esm2022/lib/sections/button-grid-section/button-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
- package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
- package/esm2022/lib/sections/condensed-and-gradient/condensed-and-gradient.component.mjs +3 -3
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.mjs +3 -3
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.model.mjs +1 -1
- package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.component.mjs +3 -3
- package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.modal.mjs +1 -1
- package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
- package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
- package/esm2022/lib/sections/feature-experience-section/feature-experience-section.component.mjs +3 -3
- package/esm2022/lib/sections/feature-experience-section/feature-experience-section.modal.mjs +1 -1
- package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
- package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
- package/esm2022/lib/sections/footer/footer.component.mjs +3 -3
- package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
- package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.component.mjs +3 -3
- package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.modal.mjs +1 -1
- package/esm2022/lib/sections/header-section/header-section.component.mjs +3 -3
- package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
- package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
- package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
- package/esm2022/lib/sections/image-background/image-background/image-background.component.mjs +3 -3
- package/esm2022/lib/sections/image-background/image-background/image-background.component.model.mjs +1 -1
- package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.component.mjs +3 -3
- package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
- package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
- package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
- package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
- package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
- package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
- package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
- package/esm2022/lib/sections/new-services/new-services.component.mjs +3 -3
- package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
- package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
- package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
- package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +3 -3
- package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.mjs +3 -3
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.modal.mjs +1 -1
- package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
- package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
- package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
- package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
- package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
- package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
- package/esm2022/lib/sections/product-info-section/product-info-section.component.mjs +3 -3
- package/esm2022/lib/sections/product-info-section/product-info-section.component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
- package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
- package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
- package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
- package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
- package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +3 -3
- package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
- package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
- package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
- package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
- package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
- package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
- package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-carousel-section/video-carousel-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-carousel-section/video-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/video-grid-section/video-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-grid-section/video-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-showcase/video-showcase.component.mjs +3 -3
- package/esm2022/lib/sections/view-blog/view-blog.component.mjs +1 -1
- package/esm2022/lib/services/analytics.service.mjs +1 -1
- package/esm2022/lib/services/booking-product-cart.service.mjs +1 -1
- package/esm2022/lib/services/cart.service.mjs +1 -1
- package/esm2022/lib/services/endUser.service.mjs +1 -1
- package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
- package/esm2022/lib/services/rest.service.mjs +2 -2
- package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
- package/esm2022/lib/services/storage.service.mjs +1 -1
- package/esm2022/lib/styles/gradient-extension.mjs +1 -1
- package/esm2022/lib/styles/index.mjs +1 -1
- package/esm2022/lib/styles/style.model.mjs +1 -1
- package/esm2022/lib/styles/text-size.extension.mjs +1 -1
- package/esm2022/lib/styles/types.mjs +1 -1
- package/esm2022/lib/tokens/api-token.mjs +1 -1
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/simpo-component-library.mjs +230 -217
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/package.json +1 -1
- package/simpo-component-library-3.6.968.tgz +0 -0
- package/simpo-component-library-3.6.965.tgz +0 -0
|
@@ -546,11 +546,11 @@ export class AddSectionComponent {
|
|
|
546
546
|
this.dummy2 = {};
|
|
547
547
|
}
|
|
548
548
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddSectionComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.HttpClient }, { token: i3.EventsService }, { token: i4.ElementServiceService }, { token: i5.RestService }, { token: i4.ElementServiceService }, { token: i1.MatDialog }, { token: i6.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
549
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AddSectionComponent, isStandalone: true, selector: "simpo-add-section", viewQueries: [{ propertyName: "installProgressTemplate", first: true, predicate: ["installProgressTemplate"], descendants: true }, { propertyName: "installCompleteTemplate", first: true, predicate: ["installCompleteTemplate"], descendants: true }], ngImport: i0, template: "<!-- <section class=\"main-container\">\r\n <div class=\"header-container d-flex align-items-center justify-content-between\">\r\n <div>Select Template</div>\r\n <mat-icon class=\"d-flex align-items-center justify-content-center f-18 cp\" (click)=\"dialog.close()\">\r\n close\r\n </mat-icon>\r\n </div>\r\n <div class=\"parent-container\">\r\n <div class=\"search-bar-container\">\r\n <div class=\"search-bar d-flex gap-10\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\"\r\n alt=\"search-bar-icon\">\r\n <input type=\"text\" placeholder=\"Search for Sections\" [(ngModel)]=\"searchText\" (ngModelChange)=\"searchSections()\">\r\n </div>\r\n </div>\r\n <div class=\"tab-container d-flex justify-content-around align-items-center\">\r\n <ng-container *ngFor=\"let ele of tabs\">\r\n <div class=\"tabs\" (click)=\"selectedTab = ele.value\" [class.active-tab]=\"ele.value == selectedTab\">\r\n {{ele.viewValue}}\r\n <ng-container *ngIf=\"ele.value == 'PRO' && ele.value != selectedTab\">\r\n <img class=\"w-30\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/468281c1744699664858Frame%201244831740%20%281%29.png\"\r\n alt=\"pro-icon\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"selectedTab === 'BASIC'; else proTabContent\">\r\n <ng-container *ngIf=\"!isSearch;else emptyScreen\">\r\n <div class=\"categories-container d-flex\">\r\n <div class=\"categories-sidepanel\" *ngIf=\"!loader\">\r\n <ng-container *ngFor=\"let ele of getObjectKeys(sections)\">\r\n <div class=\"side-section d-flex justify-content-center align-items-center flex-column\"\r\n (click)=\"selectSection(ele)\"\r\n [class.active-section]=\"selectedSection == sections[ele]\">\r\n <div class=\"image-container\">\r\n <ng-container *ngIf=\"selectedSection == sections[ele]\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/954383c1741850392802Group%201707481879.png\"\r\n alt=\"icon text\">\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedSection != sections[ele]\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/846145c1741850574864Icon%20%281%29.png\"\r\n alt=\"icon text\">\r\n </ng-container>\r\n </div>\r\n <div class=\"section-text\">\r\n {{ele}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"categories-render-section\" *ngIf=\" !loader && !tabShiftLoader\">\r\n <div class=\"categories-head\">\r\n {{selectedSectionName}}\r\n </div>\r\n <div class=\"sub-text\">\r\n Select a section to add to your page\r\n </div>\r\n <div class=\"sections-container\">\r\n <ng-container *ngFor=\"let ele of selectedSection\">\r\n <div class=\"section\">\r\n <div class=\"section-header\">{{ele.sectionName}}</div>\r\n <div class=\"section-img-container cp\"\r\n (click)=\"addNewSection(ele.componentId,ele.sectionType,$event)\">\r\n <ng-container *ngIf=\"ele?.image; else noImage\">\r\n <img [src]=\"ele?.image\" alt=\"section image\">\r\n </ng-container>\r\n <ng-template #noImage>\r\n <img src=\"https://img.freepik.com/premium-vector/default-image-icon-vector-missing-picture-page-website-design-mobile-app-no-photo-available_87543-11093.jpg\"\r\n alt=\"section image\" class=\"h-30\">\r\n </ng-template>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"categories-sidepanel\" *ngIf=\"loader\">\r\n <ng-container *ngFor=\"let ele of [1,1,1,1,1,1,1,1,1]\">\r\n <div class=\"d-flex justify-content-center align-items-center flex-column\">\r\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n height: '8vh',\r\n width: '65%',\r\n 'border-radius': '13px',\r\n 'margin-bottom' : '10px',\r\n }\" class=\"d-flex justify-content-center w-100\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"categories-render-section\" *ngIf=\"loader || tabShiftLoader\">\r\n <div class=\"categories-head\">\r\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n width: '20%',\r\n height : '3vh',\r\n 'border-radius': '5px',\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n <div class=\"sub-text\">\r\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n width: '60%',\r\n height : '2vh',\r\n 'border-radius': '5px',\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n <div class=\"sections-container\">\r\n <ng-container *ngFor=\"let ele of [1,1,1,1]\">\r\n <div class=\"section\">\r\n <div> <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n width: '25%',\r\n height : '2vh',\r\n 'border-radius': '5px',\r\n }\">\r\n </ngx-skeleton-loader></div>\r\n <div>\r\n <ngx-skeleton-loader [theme]=\"{\r\n width: '100%',\r\n height : '25vh',\r\n 'border-radius': '5px',\r\n 'margin':'2px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #proTabContent>\r\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\r\n <div class=\"image-container-1\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\r\n </div>\r\n <div class=\"oops-text\">\r\n Coming Soon\r\n </div>\r\n <div class=\"oops-sub-text\">\r\n <div class=\"oops-sub-text-1 text-center\">Woof! Something pawsome is coming!</div>\r\n <div class=\"oops-sub-text-2 text-center\">\r\n Hey hooman! I just sniffed out something super exciting... and it\u2019s almost here! \r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #emptyScreen>\r\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\r\n <div class=\"image-container-1\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\r\n </div>\r\n <div class=\"oops-text\">\r\n Oops! \r\n </div>\r\n <div class=\"oops-sub-text\">\r\n <div class=\"oops-sub-text-1 text-center\">I sniffed everywhere, but I couldn't find what you're looking for</div>\r\n <div class=\"oops-sub-text-2 text-center\">\r\n Maybe try a different search? \r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</section> -->\r\n\r\n<section class=\"main-container d-flex flex-column\">\r\n\r\n <div class=\"header-container fade-in\">\r\n <div class=\"header-title\">Add a section</div>\r\n <div class=\"header-subtitle\">Choose a section \u2014 you can reorder or remove it any time.</div>\r\n <mat-icon class=\"close-btn\" (click)=\"dialog.close()\">close</mat-icon>\r\n </div>\r\n\r\n <div class=\"parent-container d-flex flex-column\">\r\n\r\n <!-- Tabs -->\r\n <div class=\"top-tabs-container d-flex justify-content-between fade-in\">\r\n <ng-container *ngFor=\"let ele of tabs\">\r\n <div class=\"top-tab\" (click)=\"onTabSelect(ele.value)\"\r\n [class.active-top-tab]=\"ele.value == selectedTab\">\r\n {{ele.viewValue}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"search-bar-container fade-in\" *ngIf=\"selectedTab != 'SAVED'\">\r\n <div class=\"search-bar d-flex gap-2 align-items-center\">\r\n <img\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\">\r\n <input type=\"text\" placeholder='Search section...' [(ngModel)]=\"searchText\"\r\n (ngModelChange)=\"searchSections()\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"selectedTab === 'BASIC'\">\r\n\r\n <ng-container *ngIf=\"!isSearch; else emptyScreen\">\r\n\r\n <!-- Quick Add -->\r\n <!-- <div class=\"quick-add-container fade-in d-flex align-items-center\" *ngIf=\"!loader && !searchText\">\r\n <div class=\"quick-add-label\">Quick add:</div>\r\n <div class=\"quick-add-chips d-flex\">\r\n <ng-container *ngFor=\"let category of getObjectKeys(sections); let i = index\">\r\n <ng-container *ngIf=\"i < 6\">\r\n <div class=\"quick-chip stagger-item d-flex align-items-center\"\r\n (click)=\"selectSection(category); toggleCategory(category)\"\r\n [class.active-quick-chip]=\"selectedSectionName === category\">\r\n <span class=\"chip-emoji\">{{getCategoryEmoji(category)}}</span>\r\n {{getFirstSectionName(category)}}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div> -->\r\n\r\n <!-- CONTENT -->\r\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!loader\">\r\n <!-- LEFT -->\r\n <div class=\"left-sidebar\">\r\n <!-- <div class=\"category-header d-flex align-items-center\">\r\n <div class=\"category-icon d-flex align-items-center justify-content-center\">\u2728</div>\r\n <div class=\"fs-14\">AI Recommended</div>\r\n </div> -->\r\n <ng-container *ngFor=\"let category of getObjectKeys(sections)\">\r\n <div class=\"category-block\">\r\n <div class=\"category-header d-flex align-items-end justify-content-between\"\r\n (click)=\"toggleCategory(category)\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <span class=\"category-icon\">\r\n {{getCategoryEmoji(category)}}\r\n </span>\r\n <span class=\"fs-13\">\r\n {{category}}\r\n </span>\r\n <span class=\"category-count\">\r\n ({{sections[category]?.length}})\r\n </span>\r\n </div>\r\n <mat-icon class=\"category-arrow\" *ngIf=\"expandedCategories[category]\">\r\n expand_less\r\n </mat-icon>\r\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedCategories[category]\">\r\n expand_more\r\n </mat-icon>\r\n </div>\r\n <div class=\"category-items d-flex flex-column\" *ngIf=\"expandedCategories[category]\">\r\n <ng-container *ngFor=\"let sec of sections[category]\">\r\n <div class=\"category-item\"\r\n [class.active]=\"selectedComponent?.componentId === sec.componentId\"\r\n (click)=\"selectComponent(sec, category)\">\r\n {{sec.sectionName}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"right-content\">\r\n\r\n <div class=\"section-group-label\">{{selectedSectionName || 'Sections'}}</div>\r\n\r\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedSection && selectedSection.length > 0\">\r\n\r\n <ng-container *ngFor=\"let ele of selectedSection; let i = index\">\r\n\r\n <div [id]=\"'comp-' + ele.componentId\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\r\n [class.section-card-selected]=\"selectedComponent?.componentId === ele.componentId\"\r\n (click)=\"selectComponentAndHighlight(ele)\">\r\n\r\n <div class=\"section-card-badge\" *ngIf=\"ele.sectionType\">\r\n <!-- + {{ele.sectionType | uppercase}} -->\r\n + {{ele.sectionName | titlecase}}\r\n </div>\r\n\r\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\r\n <ng-container *ngIf=\"ele?.image; else noImage\">\r\n <img [src]=\"ele?.image\" alt=\"section preview\">\r\n </ng-container>\r\n <ng-template #noImage>\r\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\r\n <div>\r\n <!-- <div class=\"section-card-name\">{{ele.sectionName}}</div> -->\r\n <div class=\"section-card-desc\" *ngIf=\"ele.desc\">{{ele.desc | titlecase}}</div>\r\n </div>\r\n <mat-icon class=\"card-check-icon\"\r\n *ngIf=\"selectedComponent?.componentId === ele.componentId\">\r\n check_circle\r\n </mat-icon>\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n <div class=\"empty-state fade-in\" *ngIf=\"!selectedSection || selectedSection.length === 0\">\r\n <mat-icon class=\"empty-page-icon\">auto_awesome</mat-icon>\r\n <div class=\"empty-title\">Select a category</div>\r\n <div class=\"empty-subtitle\">\r\n Choose any category from the left sidebar to explore and add sections\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"content-layout d-flex\" *ngIf=\"loader\">\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1,1,1,1,1]\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '6px' }\"></ngx-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-content\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\r\n <div class=\"section-card\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '40%', height: '20px', 'border-radius': '4px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '100%', height: '180px', 'border-radius': '8px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '60%', height: '16px', 'border-radius': '4px' }\"></ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedTab === 'SAVED'\">\r\n <!-- Loader skeleton -->\r\n <div class=\"content-layout d-flex\" *ngIf=\"savedLoader\">\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1,1]\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-content\">\r\n <ng-container *ngFor=\"let s of [1,1,1]\">\r\n <div class=\"section-card\" style=\"margin-bottom:12px\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '60%', height: '14px', 'border-radius': '4px' }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Loaded: categories + right component card preview -->\r\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!savedLoader && savedCategoryKeys.length > 0\">\r\n\r\n <!-- LEFT: component categories list -->\r\n <div class=\"left-sidebar\">\r\n <div class=\"saved-pages-label\">Saved Sections</div>\r\n <ng-container *ngFor=\"let catKey of savedCategoryKeys\">\r\n <div class=\"saved-page-item\"\r\n [class.active]=\"selectedSavedCategory === catKey\"\r\n (click)=\"selectSavedCategory(catKey)\">\r\n <mat-icon class=\"saved-page-icon\">article</mat-icon>\r\n <span class=\"saved-page-name\">{{catKey}}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"right-content\">\r\n <div class=\"section-group-label\">Component Preview</div>\r\n\r\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"savedSections[selectedSavedCategory]\">\r\n <div class=\"section-card fade-in\"\r\n [class.section-card-selected]=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\"\r\n (click)=\"selectSavedComponent(savedSections[selectedSavedCategory].component)\">\r\n\r\n <!-- Section type badge -->\r\n <div class=\"section-card-badge\" *ngIf=\"savedSections[selectedSavedCategory].component?.sectionType\">\r\n {{savedSections[selectedSavedCategory].component.sectionType.split('_').join(' ') | titlecase}}\r\n </div>\r\n\r\n <!-- Preview area (Show image if present, fallback to placeholder) -->\r\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\r\n <ng-container *ngIf=\"savedSections[selectedSavedCategory].component?.styles?.background?.image && savedSections[selectedSavedCategory].component?.styles?.background?.showImage; else savedNoImage\">\r\n <img [src]=\"savedSections[selectedSavedCategory].component.styles.background.image\" alt=\"section preview\">\r\n </ng-container>\r\n <ng-template #savedNoImage>\r\n <div class=\"saved-preview-placeholder d-flex flex-column align-items-center justify-content-center\">\r\n <mat-icon>layers</mat-icon>\r\n <span>{{savedSections[selectedSavedCategory].component?.sectionType?.split('_')?.join(' ') || 'Saved Component'}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Card info -->\r\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\r\n <div>\r\n <div class=\"section-card-name\">{{savedSections[selectedSavedCategory].component?.sectionName}}</div>\r\n <div class=\"section-card-desc\" *ngIf=\"savedSections[selectedSavedCategory].component?.desc\">\r\n {{savedSections[selectedSavedCategory].component.desc}}\r\n </div>\r\n </div>\r\n <mat-icon class=\"card-check-icon\"\r\n *ngIf=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\">\r\n check_circle\r\n </mat-icon>\r\n </div>\r\n\r\n <!-- Used In footer -->\r\n <div class=\"saved-card-footer\" *ngIf=\"savedSections[selectedSavedCategory].usedIn\">\r\n <div class=\"used-in-container d-flex align-items-center gap-2\">\r\n <mat-icon class=\"used-in-icon\">web</mat-icon>\r\n <span class=\"used-in-text\">\r\n <strong>Used In ({{savedSections[selectedSavedCategory].usedIn.length}} Pages):</strong> \r\n {{savedSections[selectedSavedCategory].usedIn.join(', ')}}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Empty: no saved data at all -->\r\n <div class=\"empty-state fade-in\" *ngIf=\"!savedLoader && savedCategoryKeys.length === 0\">\r\n <img src=\"https://cdn-icons-png.flaticon.com/512/4076/4076549.png\" alt=\"empty\">\r\n <div class=\"empty-title\">No saved sections</div>\r\n <div class=\"empty-subtitle\">Sections you save from pages will appear here</div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedTab === 'APPS'\">\r\n \r\n <!-- Skeleton Loader during API load -->\r\n <div class=\"content-layout d-flex\" *ngIf=\"appsLoader\">\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-content\">\r\n <ng-container *ngFor=\"let s of [1,1,1]\">\r\n <div class=\"section-card\" style=\"margin-bottom:12px\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Loaded apps list and preview boards -->\r\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!appsLoader && appsList.length > 0\">\r\n <!-- LEFT SIDEBAR -->\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let app of appsList\">\r\n <div class=\"category-block\">\r\n <!-- App Header Row -->\r\n <div class=\"category-header d-flex align-items-center justify-content-between\"\r\n (click)=\"toggleAppCategory(app.appName)\">\r\n \r\n <div class=\"d-flex gap-2 align-items-center\" style=\"min-width: 0; flex: 1;\">\r\n <span class=\"category-icon\">{{appIconMap[app.appName] || '\uD83D\uDCE6'}}</span>\r\n <span class=\"fs-13 fw-semibold\" style=\"text-overflow: ellipsis; overflow: hidden; white-space: nowrap; min-width: 0; flex: 1;\">\r\n {{app.appName}}\r\n </span>\r\n <!-- Compact active green status dot for installed -->\r\n <span class=\"app-dot-installed\" *ngIf=\"app.appInstalled\" title=\"Installed\"></span>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <!-- Install Button if not installed -->\r\n <button class=\"btn-app-install-small\" *ngIf=\"!app.appInstalled\"\r\n (click)=\"installApp(app, $event)\">\r\n Install\r\n </button>\r\n \r\n <mat-icon class=\"category-arrow\" *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\r\n expand_less\r\n </mat-icon>\r\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedApps[app.appName] && app.appInstalled\">\r\n expand_more\r\n </mat-icon>\r\n </div>\r\n\r\n </div>\r\n \r\n <!-- Subcomponents list under installed app -->\r\n <div class=\"category-items d-flex flex-column animate-dropdown\" \r\n *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\r\n <ng-container *ngIf=\"app.components?.length > 0; else noAppSecs\">\r\n <ng-container *ngFor=\"let sec of app.components\">\r\n <div class=\"category-item\"\r\n [class.active]=\"sec?.data?.componentId != null && selectedAppComponent?.componentId === sec?.data?.componentId\"\r\n (click)=\"selectAppComponent(sec.data, app.appName)\">\r\n <!-- {{sec.data.sectionName}} -->\r\n {{ sec?.data?.sectionName || 'No Component' }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #noAppSecs>\r\n <div class=\"category-item-disabled\">\r\n No sections available\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- RIGHT CONTENT PREVIEW -->\r\n <div class=\"right-content\">\r\n \r\n <!-- IF AN APP IS SELECTED -->\r\n <ng-container *ngIf=\"selectedApp\">\r\n \r\n <!-- INSTALLED APP SECTIONS LIST -->\r\n <ng-container *ngIf=\"getSelectedAppObj() as activeApp\">\r\n <ng-container *ngIf=\"activeApp.appInstalled\">\r\n <div class=\"section-group-label\">{{selectedApp}} Sections</div>\r\n \r\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedAppSections.length > 0\">\r\n <ng-container *ngFor=\"let ele of selectedAppSections; let i = index\">\r\n \r\n <div [id]=\"'app-comp-' + ele?.data?.componentId != null\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\r\n [class.section-card-selected]=\"ele?.data?.componentId != null && selectedAppComponent?.componentId === ele.data.componentId\"\r\n (click)=\"selectAppComponentAndHighlight(ele.data)\">\r\n\r\n <!-- Badge showing component section name -->\r\n <div class=\"section-card-badge\" *ngIf=\"ele?.data?.sectionType\">\r\n + {{(ele?.data?.sectionName | titlecase) || \"No Component\"}}\r\n </div>\r\n\r\n <!-- Image Preview Area -->\r\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\r\n <ng-container *ngIf=\"ele?.data?.image; else noImage\">\r\n <img [src]=\"ele.data.image\" alt=\"section preview\">\r\n </ng-container>\r\n <ng-template #noImage>\r\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Card Info (Description and Tags) -->\r\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\r\n <div style=\"min-width: 0; flex: 1; padding-right: 8px;\">\r\n <div class=\"section-card-desc\" *ngIf=\"ele?.data?.desc\" style=\"margin-bottom: 6px;\">{{ele.data.desc}}</div>\r\n <!-- Tags array rendering -->\r\n <div class=\"d-flex flex-wrap gap-1\" *ngIf=\"ele?.data?.tags?.length > 0\">\r\n <span class=\"app-badge\" style=\"background: #eef2ff; color: #4f46e5; margin: 0; font-size: 8.5px;\" *ngFor=\"let tag of ele.data.tags\">\r\n {{tag}}\r\n </span>\r\n </div>\r\n </div>\r\n <mat-icon class=\"card-check-icon\"\r\n *ngIf=\"ele?.data != null && selectedAppComponent?.componentId === ele.data.componentId\">\r\n check_circle\r\n </mat-icon>\r\n </div>\r\n\r\n </div>\r\n \r\n </ng-container>\r\n </div>\r\n \r\n <!-- No sections empty state inside right panel -->\r\n <div class=\"empty-state fade-in\" *ngIf=\"selectedAppSections.length === 0\">\r\n <mat-icon class=\"empty-page-icon\">inbox</mat-icon>\r\n <div class=\"empty-title\">No sections available</div>\r\n <div class=\"empty-subtitle\">This app does not provide any pre-built sections at the moment</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- NOT INSTALLED EMPTY STATE -->\r\n <ng-container *ngIf=\"!activeApp.appInstalled\">\r\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\r\n <mat-icon class=\"empty-page-icon\" style=\"font-size: 56px !important; width: 56px !important; height: 56px !important; color: #7c6cf0; opacity: 0.8;\">\r\n get_app\r\n </mat-icon>\r\n <div class=\"empty-title\" style=\"font-size: 16px; margin-top: 12px;\">Please install to view sections</div>\r\n <div class=\"empty-subtitle\" style=\"margin-bottom: 16px; max-width: 280px; text-align: center;\">\r\n Install the {{selectedApp}} plugin to unlock premium, pre-built sections for your website.\r\n </div>\r\n <button class=\"btn-app-install-large\" (click)=\"installApp(activeApp, $event)\">\r\n \u26A1 Install {{selectedApp}} App\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n <!-- NO ACTIVE APP SELECTED (FALLBACK) -->\r\n <ng-container *ngIf=\"!selectedApp\">\r\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\r\n <mat-icon class=\"empty-page-icon\">apps</mat-icon>\r\n <div class=\"empty-title\">Explore Plugins & Apps</div>\r\n <div class=\"empty-subtitle\" style=\"max-width: 260px;\">\r\n Select any application from the left sidebar to browse and configure its custom layout components.\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n <!-- EMPTY SEARCH -->\r\n <ng-template #emptyScreen>\r\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\">\r\n <img src=\"https://cdn-icons-png.flaticon.com/512/7486/7486803.png\">\r\n <div class=\"empty-title\">No sections found</div>\r\n <div class=\"empty-subtitle\">\r\n Try searching something else or explore categories\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"footer-container fade-in\">\r\n <div class=\"footer-hint\">\r\n <mat-icon>info_outline</mat-icon>\r\n You can rearrange or remove this section any time.\r\n </div>\r\n <div class=\"footer-actions\">\r\n <div class=\"btn-cancel\" (click)=\"dialog.close()\">Cancel</div>\r\n <div class=\"btn-add\"\r\n [class.disabled]=\"selectedTab === 'BASIC' ? !selectedComponent : (selectedTab === 'APPS' ? !selectedAppComponent : !selectedSavedComponent)\"\r\n (click)=\"handleAddSection($event)\">\r\n + Add section\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</section>\r\n\r\n<!-- Beautiful Installation Progress Dialog Template -->\r\n<ng-template #installProgressTemplate>\r\n <div class=\"simpo-dialog-container animate-complete-pop\">\r\n <div class=\"simpo-dialog-header\">\r\n <div class=\"app-icon-badge\">{{ appIconMap[installingApp?.appName] || '\uD83D\uDD0C' }}</div>\r\n <h3>Setting Up {{ installingApp?.appName }} App</h3>\r\n <p>Please wait while we configure your premium scheduling system.</p>\r\n </div>\r\n\r\n <div class=\"simpo-dialog-body\">\r\n <!-- Animated Progress Bar -->\r\n <div class=\"simpo-dialog-progress-bar\">\r\n <div class=\"simpo-dialog-progress-fill\" [style.width]=\"getOverallProgressPercent() + '%'\"></div>\r\n </div>\r\n\r\n <!-- Steps List -->\r\n <div class=\"simpo-steps-list\">\r\n <div class=\"step-row\" *ngFor=\"let step of installSteps; let idx = index\" [ngClass]=\"step?.status || ''\">\r\n <div class=\"step-icon-container\">\r\n <!-- Active Step Icon (Pulsing glowing dot) -->\r\n <div class=\"step-icon active-icon\" *ngIf=\"step?.status === 'active'\">\r\n <span class=\"step-number\">{{ idx + 1 }}</span>\r\n <div class=\"pulse-ring\"></div>\r\n </div>\r\n\r\n <!-- Success Step Icon (Green checkmark with spring-up animation) -->\r\n <div class=\"step-icon success-icon animate-success\" *ngIf=\"step?.status === 'success'\">\r\n <mat-icon>check</mat-icon>\r\n </div>\r\n\r\n <!-- Pending Step Icon (Dimmed simple number/dot) -->\r\n <div class=\"step-icon pending-icon\" *ngIf=\"step?.status === 'pending'\">\r\n <span class=\"step-number\">{{ idx + 1 }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-content\">\r\n <div class=\"step-label\">{{ step?.label || '' }}</div>\r\n <div class=\"step-desc\" *ngIf=\"step?.status === 'active'\">Processing, please wait<span class=\"dots-pulse\"></span></div>\r\n <div class=\"step-desc success-desc\" *ngIf=\"step?.status === 'success'\">Completed successfully</div>\r\n <div class=\"step-desc pending-desc\" *ngIf=\"step?.status === 'pending'\">Upcoming...</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Beautiful Installation Complete Dialog Template -->\r\n<ng-template #installCompleteTemplate>\r\n <div class=\"simpo-dialog-container complete-dialog-card animate-complete-pop\">\r\n <div class=\"complete-header-art\">\r\n <div class=\"sparkles-container\">\r\n <span class=\"sparkle one\">\u2728</span>\r\n <span class=\"sparkle two\">\u2728</span>\r\n <span class=\"sparkle three\">\uD83C\uDF89</span>\r\n </div>\r\n <div class=\"complete-icon-wrapper\">\r\n <mat-icon>verified</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"simpo-dialog-header text-center\">\r\n <div class=\"success-badge-text\">INSTALLATION COMPLETED</div>\r\n <h3 class=\"complete-title\">Your Appointment App is Ready!</h3>\r\n <p class=\"complete-message\">\r\n For better experience create service and assign staff to created service\r\n </p>\r\n </div>\r\n\r\n <div class=\"simpo-dialog-body text-center d-flex flex-column align-items-center gap-3\">\r\n <!-- Directing Action Button -->\r\n <button class=\"btn-redirect w-100\" (click)=\"redirectToAppointments()\">\r\n <span>Create Service & Assign Staff</span>\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n\r\n <!-- Dismiss button -->\r\n <button class=\"btn-dismiss\" (click)=\"closeAllDialogs()\">\r\n Maybe Later\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--primary-font-family);box-sizing:border-box}mat-icon{font-family:Material Icons!important}.gap-10{gap:10px!important}.f-18{font-size:18px;cursor:pointer}.w-30{width:30px!important}.h-30{height:30vh}.cp{cursor:pointer}.fs-14{font-size:14px}.fs-12{font-size:12px}.fs-16{font-size:16px}.fw-bold{font-weight:700}.main-container{height:100vh;background:#fff;border-radius:16px;overflow:hidden;display:flex;flex-direction:column}.header-container{position:relative;padding:16px 20px 14px;background:#fff;border-bottom:1px solid #f0eef8}.header-title{font-size:16px;font-weight:700;color:#1a1733;line-height:1.4}.header-subtitle{font-size:12px;color:#9e9bb5;margin-top:2px}.close-btn{position:absolute;top:50%;right:18px;transform:translateY(-50%);cursor:pointer;color:#aaa;font-size:20px!important;width:30px!important;height:30px!important;border-radius:8px;transition:background .15s,color .15s;display:flex;align-items:center;justify-content:center}.close-btn:hover{background:#f0eeff;color:#5a4fcf}.parent-container{flex:1;overflow:hidden;background:#f9f8fd;display:flex;flex-direction:column;padding:0}.tab-container{padding:8px;margin:0 15px;gap:3%;background:#fff;border-radius:13px}.tabs{font-size:14px;font-weight:500;line-height:24px;color:#2c2c2c99;width:30%;cursor:pointer;padding:8px 0;text-align:center}.active-tab{color:#fff!important;background:var(--primary-bg-color);box-shadow:0 0 4px #00000040;border-radius:8px;transition:opacity .3s ease-in-out,transform .3s ease-in-out;opacity:1;transform:translateY(0)}.top-tabs-container{margin:12px 16px 0;background:#eeecf8;border-radius:12px;padding:4px;display:flex;gap:2px;flex-shrink:0}.top-tab{flex:1;text-align:center;padding:7px 12px;font-size:12.5px;font-weight:500;color:#888;cursor:pointer;border-radius:9px;transition:all .18s ease;-webkit-user-select:none;user-select:none;white-space:nowrap}.top-tab:hover:not(.active-top-tab){color:#555;background:#ffffff8c}.active-top-tab{background:#fff;color:#4b3fc0;font-weight:700;box-shadow:0 1px 6px #4b3fc021}.search-bar-container{padding:10px 16px 8px;flex-shrink:0}.search-bar{background:#fff;border:1.5px solid #e6e2f6;border-radius:10px;padding:8px 12px;display:flex;align-items:center;gap:8px;transition:border-color .18s,box-shadow .18s}.search-bar:focus-within{border-color:var(--primary-bg-color);box-shadow:0 0 0 3px #7c6cf01a}.search-bar img{width:15px;height:15px;opacity:.45;flex-shrink:0}.search-bar input{border:none;outline:none;background:transparent;font-size:13px;color:#333;width:100%}.search-bar input::placeholder{color:#bbb}.content-layout{flex:1;overflow:hidden;border-top:1px solid #f0eef8;display:flex;min-height:0}.categories-sidepanel{width:15%;padding:10px 5px;margin:15px 0;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.side-section{padding:6px 10px;border-radius:8px;margin-bottom:10px;cursor:pointer}.side-section img{width:16px}.side-section .image-container{background:#f9fafb;padding:5px 8px;border-radius:5px}.side-section .section-text{font-size:12px;font-weight:500;line-height:24px;text-align:center;color:#a1a1a1}.active-section{background:var(--primary-bg-color)!important;box-shadow:0 0 4px #00000040}.active-section .section-text{color:#fff!important}.active-section .image-container{background:unset!important;padding:unset!important;border-radius:unset!important}.left-sidebar{width:210px;min-width:210px;background:#fff;padding:12px 8px;overflow-y:auto;border-right:1px solid #f0eef8;height:100%}.left-sidebar::-webkit-scrollbar{width:3px}.left-sidebar::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.category-block{margin-bottom:2px}.category-header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 10px;cursor:pointer;border-radius:9px;transition:background .15s;-webkit-user-select:none;user-select:none;white-space:nowrap!important}.category-header:hover{background:#f3f0fd}.category-icon{font-size:15px;width:20px;text-align:center;flex-shrink:0;line-height:1}.fs-13{font-size:13px}.category-count{font-size:11px;font-weight:500;color:#bbb;position:relative;top:1px}.category-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#ccc;transition:transform .22s ease,color .15s;flex-shrink:0}.category-block:has(.category-items) .category-arrow{color:#7c6cf0}.category-items{padding:2px 4px 4px 28px;display:flex;flex-direction:column;gap:1px;animation:dropdownFade .2s ease}.category-item{padding:5px 10px;font-size:12px;color:#555;cursor:pointer;border-radius:7px;transition:background .13s,color .13s;-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-item:hover{background:#f0eeff;color:#4b3fc0}.category-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.categories-render-section{width:85%;padding:15px;margin:15px 10px;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.categories-head{font-size:20px;font-weight:600;line-height:24px;color:#434343}.sub-text{font-size:13px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.section{margin-bottom:10px}.section-header{font-size:14px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.right-content{flex:1;overflow-y:auto;padding:14px 14px 14px 12px;height:100%;min-width:0}.right-content::-webkit-scrollbar{width:4px}.right-content::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.section-group-label{font-size:12px;font-weight:700;letter-spacing:.4px;color:#9e9bb5;margin-bottom:12px;text-transform:uppercase}.sections-list{display:flex;flex-direction:column;gap:12px}.section-card{border:1.5px solid #ebe8f8;border-radius:12px;overflow:hidden;cursor:pointer;background:#fff;transition:all .2s ease}.section-card:hover{border-color:#c4baf0;box-shadow:0 4px 16px #7c6cf01a;transform:translateY(-1px)}.section-card-preview{cursor:default!important;pointer-events:none}.section-card-preview:hover{border-color:#ebe8f8!important;box-shadow:none!important;transform:none!important}.section-card-selected{border-color:#7c6cf0!important;box-shadow:0 0 0 3px #7c6cf024!important}.section-card-badge{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.5px;color:#5a4fcf;background:#edeafc;padding:3px 10px;margin:10px 10px 6px;border-radius:20px}.section-img-container{width:100%;overflow:hidden;background:#f5f3fc;display:flex;align-items:center;justify-content:center;max-height:200px;min-height:100px}.section-img-container img{width:100%;display:block;object-fit:cover;transition:transform .25s ease}.section-card:hover .section-img-container img{transform:scale(1.03)}.no-image-placeholder{height:130px;display:flex;align-items:center;justify-content:center;color:#d5d0ee}.no-image-placeholder mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#d5d0ee}.section-card-info{padding:10px 14px 12px}.section-card-name{font-size:13px;font-weight:600;color:#1a1733;margin-bottom:3px}.section-card-desc{font-size:12px;color:#9e9bb5;line-height:1.5}.card-check-icon{font-size:20px!important;width:20px!important;height:20px!important;color:#7c6cf0;flex-shrink:0;animation:checkPop .22s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes checkPop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.quick-add-container{padding:4px 24px 10px;gap:10px;flex-wrap:wrap;flex-shrink:0}.quick-add-label{font-size:12px;color:#888;white-space:nowrap}.quick-add-chips{gap:6px;width:100%;overflow-y:scroll;white-space:nowrap}.quick-chip{gap:5px;padding:4px 10px;font-size:12px;border:1.5px solid #e0e0e0;border-radius:20px;cursor:pointer;color:#333;background:#fff;transition:all .2s ease;-webkit-user-select:none;user-select:none}.quick-chip.active-quick-chip{border-color:#7c6cf0;color:#4b3fc0;font-weight:500}.chip-emoji{font-size:14px}.saved-pages-label{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#bbb;padding:0 10px;margin-bottom:10px}.saved-page-item{display:flex;align-items:center;gap:7px;padding:7px 10px;cursor:pointer;border-radius:9px;font-size:13px;font-weight:500;color:#666;transition:background .15s,color .15s;-webkit-user-select:none;user-select:none;margin-bottom:2px;overflow:hidden}.saved-page-item:hover{background:#f0eeff;color:#4b3fc0}.saved-page-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.saved-page-icon{font-size:15px!important;width:15px!important;height:15px!important;color:inherit;flex-shrink:0}.saved-page-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.saved-preview-placeholder{height:100px;width:100%;background:#f5f3fc;gap:6px}.saved-preview-placeholder mat-icon{font-size:28px!important;width:28px!important;height:28px!important;color:#c8c2ee}.saved-preview-placeholder span{font-size:11px;color:#b0aac8;text-transform:capitalize}.empty-page-icon{font-size:40px!important;width:40px!important;height:40px!important;color:#d5d0ee;margin-bottom:4px}.app-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:20px;letter-spacing:.3px;text-transform:uppercase;margin-left:6px}.app-dot-installed{width:6px!important;height:6px!important;min-width:6px!important;min-height:6px!important;background:#2ec4b6!important;border-radius:50%!important;display:inline-block!important;flex-shrink:0!important;box-shadow:0 0 0 2px #2ec4b62e!important;margin-left:4px!important}.badge-installed{background:#e2fbe8;color:#1b8a3e}.btn-app-install-small{padding:3px 10px!important;font-size:10px!important;font-weight:700!important;color:#7c6cf0!important;background:#f1efff!important;border:1px solid #7c6cf0!important;border-radius:6px!important;cursor:pointer!important;transition:all .15s ease!important;outline:none!important;height:22px!important;min-height:22px!important;max-height:22px!important;min-width:unset!important;max-width:unset!important;line-height:14px!important;box-sizing:border-box!important;margin:0!important;display:inline-flex!important;align-items:center!important;justify-content:center!important}.btn-app-install-small:hover{background:#7c6cf0;color:#fff;box-shadow:0 2px 6px #7c6cf033}.btn-app-install-large{padding:8px 18px;font-size:12px;font-weight:700;color:#fff;background:linear-gradient(135deg,#7c6cf0,#5a4fcf);border:none;border-radius:9px;cursor:pointer;box-shadow:0 4px 12px #5a4fcf4d;transition:all .18s ease;outline:none}.btn-app-install-large:hover{transform:translateY(-1.5px);box-shadow:0 6px 16px #5a4fcf73}.btn-app-install-large:active{transform:translateY(0)}.category-item-disabled{padding:5px 10px;font-size:12px;color:#aaa;font-style:italic;-webkit-user-select:none;user-select:none}.saved-card-footer{padding:10px 14px;background:#faf9ff;border-top:1px solid #ebe8f8}.used-in-container{font-size:11.5px;color:#666}.used-in-icon{font-size:15px!important;width:15px!important;height:15px!important;color:#7c6cf0}.used-in-text{line-height:1.4}.used-in-text strong{color:#4b3fc0;font-weight:600}.empty-div{height:calc(70vh + -0px);background:#fff;margin:18px;border-radius:13px}.oops-text{font-weight:900;font-size:42px;background:var(--primary-bg-color);background-clip:text;-webkit-text-fill-color:transparent}.oops-sub-text-1{font-size:17px;font-weight:600;color:#101010e5}.oops-sub-text-2{font-size:14px;font-weight:600;color:#101010e5}.image-container-1{margin-bottom:16px}.empty-img{width:100px;opacity:.85}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;text-align:center;padding:32px 24px}.empty-state img{width:110px;opacity:.8;margin-bottom:4px}.empty-title{font-size:15px;font-weight:700;color:#2d2a4a}.empty-subtitle{font-size:12.5px;color:#aaa;max-width:240px;line-height:1.6}.footer-container{padding:12px 20px;border-top:1px solid #f0eef8;background:#fff;flex-shrink:0;display:flex;align-items:center;justify-content:space-between}.footer-hint{font-size:11.5px;color:#bbb;display:flex;align-items:center;gap:5px}.footer-hint mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#d0cbf0}.footer-actions{display:flex;align-items:center;gap:8px}.btn-cancel{padding:8px 18px;font-size:13px;font-weight:500;border:1.5px solid #e4e0f6;border-radius:9px;background:#fff;color:#666;cursor:pointer;transition:border-color .15s,color .15s,background .15s;-webkit-user-select:none;user-select:none}.btn-cancel:hover{border-color:#b4aae8;color:#4b3fc0;background:#f8f6ff}.btn-add{padding:8px 20px;font-size:13px;font-weight:700;border:none;border-radius:9px;background:var(--primary-bg-color);color:#fff;cursor:pointer;transition:opacity .15s,box-shadow .15s,transform .15s;-webkit-user-select:none;user-select:none;box-shadow:0 3px 10px #7c6cf047}.btn-add:hover:not(.disabled){opacity:.92;transform:translateY(-1px);box-shadow:0 5px 14px #7c6cf05c}.btn-add.disabled{opacity:.38;cursor:not-allowed;box-shadow:none;pointer-events:none}.sidebar-group{margin-bottom:2px}.sidebar-group-icon{font-size:15px;width:20px;text-align:center}.sidebar-group-label{flex:1;font-size:13px}.sidebar-group-header{gap:8px;padding:9px 14px;cursor:pointer;border-radius:0;transition:background .12s;-webkit-user-select:none;user-select:none;font-size:13px;color:#444}.sidebar-group-header:hover{background:#f0f0f0}.sidebar-group-active{background:#ece9fd;color:#4b3fc0;font-weight:600}.sidebar-chevron{font-size:18px;width:18px;height:18px;color:#aaa;transition:transform .2s}.sidebar-chevron.rotated{transform:rotate(180deg)}.subcategory-item{padding:6px 10px 6px 8px;font-size:12px;color:#555;cursor:pointer;border-radius:6px;transition:background .12s;-webkit-user-select:none;user-select:none}.subcategory-item:hover{background:#ece9fd;color:#4b3fc0}.subcategory-active{background:#ece9fd;color:#4b3fc0;font-weight:500}.active-subcategory{background:#7c6cf0!important;color:#fff!important}.sidebar-subcategory{overflow:hidden;animation:dropdownSmooth .25s ease}.fade-in{animation:fadeIn .22s ease}.fade-slide{animation:fadeSlide .25s ease}.stagger-item{opacity:0;transform:translateY(8px);animation:staggerFade .28s ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeSlide{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes staggerFade{to{opacity:1;transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes dropdownSmooth{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes expandFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}::ng-deep .simpo-install-dialog-panel .mat-mdc-dialog-container,::ng-deep .simpo-complete-dialog-panel .mat-mdc-dialog-container{background:transparent!important;box-shadow:none!important;padding:0!important;overflow:visible!important}::ng-deep .simpo-install-dialog-panel .mdc-dialog__surface,::ng-deep .simpo-complete-dialog-panel .mdc-dialog__surface{background:transparent!important;box-shadow:none!important;overflow:visible!important;border-radius:20px!important}.simpo-dialog-container{background:#fff;border-radius:20px;padding:30px;box-shadow:0 20px 50px #4b3fc026;border:1px solid #ebe8f8;overflow:hidden;position:relative;font-family:var(--primary-font-family),sans-serif;color:#1a1733}.simpo-dialog-header{margin-bottom:24px}.simpo-dialog-header h3{font-size:20px;font-weight:700;color:#1a1733;margin:8px 0 4px}.simpo-dialog-header p{font-size:13px;color:#9e9bb5;margin:0;line-height:1.4}.app-icon-badge{font-size:32px;display:inline-block;line-height:1;margin-bottom:12px}.simpo-dialog-progress-bar{height:6px;width:100%;background:#eeecf8;border-radius:10px;overflow:hidden;margin-bottom:24px}.simpo-dialog-progress-fill{height:100%;width:0%;background:linear-gradient(90deg,#7c6cf0,#a08cff);border-radius:10px;transition:width .4s cubic-bezier(.4,0,.2,1);box-shadow:0 0 8px #7c6cf066}.simpo-steps-list{display:flex;flex-direction:column;gap:16px}.step-row{display:flex;align-items:flex-start;gap:16px;transition:all .3s ease}.step-icon-container{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.step-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;transition:all .3s cubic-bezier(.34,1.56,.64,1)}.active-icon{background:#ebe7fc;color:#4b3fc0;border:2px solid #7c6cf0;position:relative;z-index:2;transform:scale(1.1)}.pulse-ring{position:absolute;inset:-4px;border:2px solid #7c6cf0;border-radius:50%;animation:ringPulse 1.8s cubic-bezier(.24,0,.38,1) infinite;opacity:0}@keyframes ringPulse{0%{transform:scale(.9);opacity:.8}50%{opacity:.4}to{transform:scale(1.3);opacity:0}}.success-icon{background:#2ec4b6;color:#fff;border:none;box-shadow:0 4px 10px #2ec4b64d}.success-icon mat-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.animate-success{animation:checkPop .4s cubic-bezier(.34,1.56,.64,1) forwards}.pending-icon{background:#f5f4f8;color:#b0aac8;border:2px solid #eeecf8}.step-number{position:relative;top:-.5px}.step-content{flex:1;display:flex;flex-direction:column;gap:2px}.step-label{font-size:14px;font-weight:600;color:#1a1733;transition:color .3s ease}.step-desc{font-size:11px;color:#7c6cf0;font-weight:500;transition:color .3s ease;animation:fadeSlide .3s ease-out forwards}.dots-pulse:after{content:\"\";display:inline-block;animation:dotsSequence 1.5s infinite}@keyframes dotsSequence{0%{content:\"\"}25%{content:\".\"}50%{content:\"..\"}75%{content:\"...\"}to{content:\"\"}}.step-row.pending .step-label{color:#9e9bb5}.step-row.pending .step-desc{color:#cccad8}.step-row.success .step-label{color:#1a1733}.step-row.success .step-desc{color:#2ec4b6}.complete-dialog-card{border-radius:24px;padding:36px 30px 30px;background:#fff;box-shadow:0 25px 60px #4b3fc02e;border:1px solid #ebe8f8}.complete-header-art{display:flex;justify-content:center;position:relative;margin-bottom:20px}.complete-icon-wrapper{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,#2ec4b6,#0cbaba);display:flex;align-items:center;justify-content:center;box-shadow:0 10px 25px #2ec4b659;position:relative;z-index:2}.complete-icon-wrapper mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.sparkles-container{position:absolute;width:120px;height:80px;top:-10px;pointer-events:none;z-index:1}.sparkle{position:absolute;font-size:20px;animation:bounceSparkle 2s ease infinite}.sparkle.one{top:10px;left:10px;animation-delay:.2s}.sparkle.two{top:0;right:15px;font-size:16px;animation-delay:.7s}.sparkle.three{bottom:10px;right:5px;font-size:22px;animation-delay:1.2s}@keyframes bounceSparkle{0%,to{transform:translateY(0) scale(1);opacity:.8}50%{transform:translateY(-8px) scale(1.15);opacity:1}}.success-badge-text{font-size:10px;font-weight:800;color:#2ec4b6;letter-spacing:1.5px;margin-bottom:8px;text-transform:uppercase}.complete-title{font-size:22px;font-weight:800;color:#1a1733;margin:0 0 12px;letter-spacing:-.2px}.complete-message{font-size:13.5px;color:#5f5c76;line-height:1.6;max-width:380px;margin:0 auto;font-weight:500}.btn-redirect{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 24px;font-size:14px!important;font-weight:700;color:#fff;background-color:#3a0044;border:none;border-radius:12px;cursor:pointer;box-shadow:0 8px 20px #7c6cf04d;transition:all .2s cubic-bezier(.25,.8,.25,1);outline:none;box-sizing:border-box;width:max-content!important}.btn-redirect mat-icon{font-size:18px!important;width:18px!important;height:18px!important;transition:transform .2s ease;display:flex;align-items:center;justify-content:center;color:#fff!important}.btn-redirect:hover mat-icon{transform:translate(3px)}.btn-dismiss{padding:10px 20px;font-size:13px!important;font-weight:600;color:#9e9bb5;background:transparent;border:none;cursor:pointer;transition:color .15s ease;outline:none}.btn-dismiss:hover{color:#4b3fc0}.animate-complete-pop{animation:popupSpring .5s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes popupSpring{0%{opacity:0;transform:scale(.85) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: NgxSkeletonLoaderModule }, { kind: "component", type: i9.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }] }); }
|
|
549
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AddSectionComponent, isStandalone: true, selector: "simpo-add-section", viewQueries: [{ propertyName: "installProgressTemplate", first: true, predicate: ["installProgressTemplate"], descendants: true }, { propertyName: "installCompleteTemplate", first: true, predicate: ["installCompleteTemplate"], descendants: true }], ngImport: i0, template: "<!-- <section class=\"main-container\">\n <div class=\"header-container d-flex align-items-center justify-content-between\">\n <div>Select Template</div>\n <mat-icon class=\"d-flex align-items-center justify-content-center f-18 cp\" (click)=\"dialog.close()\">\n close\n </mat-icon>\n </div>\n <div class=\"parent-container\">\n <div class=\"search-bar-container\">\n <div class=\"search-bar d-flex gap-10\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\"\n alt=\"search-bar-icon\">\n <input type=\"text\" placeholder=\"Search for Sections\" [(ngModel)]=\"searchText\" (ngModelChange)=\"searchSections()\">\n </div>\n </div>\n <div class=\"tab-container d-flex justify-content-around align-items-center\">\n <ng-container *ngFor=\"let ele of tabs\">\n <div class=\"tabs\" (click)=\"selectedTab = ele.value\" [class.active-tab]=\"ele.value == selectedTab\">\n {{ele.viewValue}}\n <ng-container *ngIf=\"ele.value == 'PRO' && ele.value != selectedTab\">\n <img class=\"w-30\"\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/468281c1744699664858Frame%201244831740%20%281%29.png\"\n alt=\"pro-icon\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"selectedTab === 'BASIC'; else proTabContent\">\n <ng-container *ngIf=\"!isSearch;else emptyScreen\">\n <div class=\"categories-container d-flex\">\n <div class=\"categories-sidepanel\" *ngIf=\"!loader\">\n <ng-container *ngFor=\"let ele of getObjectKeys(sections)\">\n <div class=\"side-section d-flex justify-content-center align-items-center flex-column\"\n (click)=\"selectSection(ele)\"\n [class.active-section]=\"selectedSection == sections[ele]\">\n <div class=\"image-container\">\n <ng-container *ngIf=\"selectedSection == sections[ele]\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/954383c1741850392802Group%201707481879.png\"\n alt=\"icon text\">\n </ng-container>\n <ng-container *ngIf=\"selectedSection != sections[ele]\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/846145c1741850574864Icon%20%281%29.png\"\n alt=\"icon text\">\n </ng-container>\n </div>\n <div class=\"section-text\">\n {{ele}}\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"categories-render-section\" *ngIf=\" !loader && !tabShiftLoader\">\n <div class=\"categories-head\">\n {{selectedSectionName}}\n </div>\n <div class=\"sub-text\">\n Select a section to add to your page\n </div>\n <div class=\"sections-container\">\n <ng-container *ngFor=\"let ele of selectedSection\">\n <div class=\"section\">\n <div class=\"section-header\">{{ele.sectionName}}</div>\n <div class=\"section-img-container cp\"\n (click)=\"addNewSection(ele.componentId,ele.sectionType,$event)\">\n <ng-container *ngIf=\"ele?.image; else noImage\">\n <img [src]=\"ele?.image\" alt=\"section image\">\n </ng-container>\n <ng-template #noImage>\n <img src=\"https://img.freepik.com/premium-vector/default-image-icon-vector-missing-picture-page-website-design-mobile-app-no-photo-available_87543-11093.jpg\"\n alt=\"section image\" class=\"h-30\">\n </ng-template>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"categories-sidepanel\" *ngIf=\"loader\">\n <ng-container *ngFor=\"let ele of [1,1,1,1,1,1,1,1,1]\">\n <div class=\"d-flex justify-content-center align-items-center flex-column\">\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n height: '8vh',\n width: '65%',\n 'border-radius': '13px',\n 'margin-bottom' : '10px',\n }\" class=\"d-flex justify-content-center w-100\">\n </ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n <div class=\"categories-render-section\" *ngIf=\"loader || tabShiftLoader\">\n <div class=\"categories-head\">\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n width: '20%',\n height : '3vh',\n 'border-radius': '5px',\n }\">\n </ngx-skeleton-loader>\n </div>\n <div class=\"sub-text\">\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n width: '60%',\n height : '2vh',\n 'border-radius': '5px',\n }\">\n </ngx-skeleton-loader>\n </div>\n <div class=\"sections-container\">\n <ng-container *ngFor=\"let ele of [1,1,1,1]\">\n <div class=\"section\">\n <div> <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n width: '25%',\n height : '2vh',\n 'border-radius': '5px',\n }\">\n </ngx-skeleton-loader></div>\n <div>\n <ngx-skeleton-loader [theme]=\"{\n width: '100%',\n height : '25vh',\n 'border-radius': '5px',\n 'margin':'2px'\n }\">\n </ngx-skeleton-loader>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #proTabContent>\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\n <div class=\"image-container-1\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\n </div>\n <div class=\"oops-text\">\n Coming Soon\n </div>\n <div class=\"oops-sub-text\">\n <div class=\"oops-sub-text-1 text-center\">Woof! Something pawsome is coming!</div>\n <div class=\"oops-sub-text-2 text-center\">\n Hey hooman! I just sniffed out something super exciting... and it\u2019s almost here! \n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #emptyScreen>\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\n <div class=\"image-container-1\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\n </div>\n <div class=\"oops-text\">\n Oops! \n </div>\n <div class=\"oops-sub-text\">\n <div class=\"oops-sub-text-1 text-center\">I sniffed everywhere, but I couldn't find what you're looking for</div>\n <div class=\"oops-sub-text-2 text-center\">\n Maybe try a different search? \n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</section> -->\n\n<section class=\"main-container d-flex flex-column\">\n\n <div class=\"header-container fade-in\">\n <div class=\"header-title\">Add a section</div>\n <div class=\"header-subtitle\">Choose a section \u2014 you can reorder or remove it any time.</div>\n <mat-icon class=\"close-btn\" (click)=\"dialog.close()\">close</mat-icon>\n </div>\n\n <div class=\"parent-container d-flex flex-column\">\n\n <!-- Tabs -->\n <div class=\"top-tabs-container d-flex justify-content-between fade-in\">\n <ng-container *ngFor=\"let ele of tabs\">\n <div class=\"top-tab\" (click)=\"onTabSelect(ele.value)\"\n [class.active-top-tab]=\"ele.value == selectedTab\">\n {{ele.viewValue}}\n </div>\n </ng-container>\n </div>\n\n <!-- Search -->\n <div class=\"search-bar-container fade-in\" *ngIf=\"selectedTab != 'SAVED'\">\n <div class=\"search-bar d-flex gap-2 align-items-center\">\n <img\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\">\n <input type=\"text\" placeholder='Search section...' [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchSections()\">\n </div>\n </div>\n\n <ng-container *ngIf=\"selectedTab === 'BASIC'\">\n\n <ng-container *ngIf=\"!isSearch; else emptyScreen\">\n\n <!-- Quick Add -->\n <!-- <div class=\"quick-add-container fade-in d-flex align-items-center\" *ngIf=\"!loader && !searchText\">\n <div class=\"quick-add-label\">Quick add:</div>\n <div class=\"quick-add-chips d-flex\">\n <ng-container *ngFor=\"let category of getObjectKeys(sections); let i = index\">\n <ng-container *ngIf=\"i < 6\">\n <div class=\"quick-chip stagger-item d-flex align-items-center\"\n (click)=\"selectSection(category); toggleCategory(category)\"\n [class.active-quick-chip]=\"selectedSectionName === category\">\n <span class=\"chip-emoji\">{{getCategoryEmoji(category)}}</span>\n {{getFirstSectionName(category)}}\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div> -->\n\n <!-- CONTENT -->\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!loader\">\n <!-- LEFT -->\n <div class=\"left-sidebar\">\n <!-- <div class=\"category-header d-flex align-items-center\">\n <div class=\"category-icon d-flex align-items-center justify-content-center\">\u2728</div>\n <div class=\"fs-14\">AI Recommended</div>\n </div> -->\n <ng-container *ngFor=\"let category of getObjectKeys(sections)\">\n <div class=\"category-block\">\n <div class=\"category-header d-flex align-items-end justify-content-between\"\n (click)=\"toggleCategory(category)\">\n <div class=\"d-flex gap-2 align-items-center\">\n <span class=\"category-icon\">\n {{getCategoryEmoji(category)}}\n </span>\n <span class=\"fs-13\">\n {{category}}\n </span>\n <span class=\"category-count\">\n ({{sections[category]?.length}})\n </span>\n </div>\n <mat-icon class=\"category-arrow\" *ngIf=\"expandedCategories[category]\">\n expand_less\n </mat-icon>\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedCategories[category]\">\n expand_more\n </mat-icon>\n </div>\n <div class=\"category-items d-flex flex-column\" *ngIf=\"expandedCategories[category]\">\n <ng-container *ngFor=\"let sec of sections[category]\">\n <div class=\"category-item\"\n [class.active]=\"selectedComponent?.componentId === sec.componentId\"\n (click)=\"selectComponent(sec, category)\">\n {{sec.sectionName}}\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"right-content\">\n\n <div class=\"section-group-label\">{{selectedSectionName || 'Sections'}}</div>\n\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedSection && selectedSection.length > 0\">\n\n <ng-container *ngFor=\"let ele of selectedSection; let i = index\">\n\n <div [id]=\"'comp-' + ele.componentId\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\n [class.section-card-selected]=\"selectedComponent?.componentId === ele.componentId\"\n (click)=\"selectComponentAndHighlight(ele)\">\n\n <div class=\"section-card-badge\" *ngIf=\"ele.sectionType\">\n <!-- + {{ele.sectionType | uppercase}} -->\n + {{ele.sectionName | titlecase}}\n </div>\n\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\n <ng-container *ngIf=\"ele?.image; else noImage\">\n <img [src]=\"ele?.image\" alt=\"section preview\">\n </ng-container>\n <ng-template #noImage>\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\n <mat-icon>image</mat-icon>\n </div>\n </ng-template>\n </div>\n\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\n <div>\n <!-- <div class=\"section-card-name\">{{ele.sectionName}}</div> -->\n <div class=\"section-card-desc\" *ngIf=\"ele.desc\">{{ele.desc | titlecase}}</div>\n </div>\n <mat-icon class=\"card-check-icon\"\n *ngIf=\"selectedComponent?.componentId === ele.componentId\">\n check_circle\n </mat-icon>\n </div>\n\n </div>\n\n </ng-container>\n\n </div>\n\n <div class=\"empty-state fade-in\" *ngIf=\"!selectedSection || selectedSection.length === 0\">\n <mat-icon class=\"empty-page-icon\">auto_awesome</mat-icon>\n <div class=\"empty-title\">Select a category</div>\n <div class=\"empty-subtitle\">\n Choose any category from the left sidebar to explore and add sections\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"content-layout d-flex\" *ngIf=\"loader\">\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let s of [1,1,1,1,1,1,1,1]\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '6px' }\"></ngx-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"right-content\">\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\n <div class=\"section-card\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '40%', height: '20px', 'border-radius': '4px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '100%', height: '180px', 'border-radius': '8px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '60%', height: '16px', 'border-radius': '4px' }\"></ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"selectedTab === 'SAVED'\">\n <!-- Loader skeleton -->\n <div class=\"content-layout d-flex\" *ngIf=\"savedLoader\">\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let s of [1,1,1,1,1]\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"right-content\">\n <ng-container *ngFor=\"let s of [1,1,1]\">\n <div class=\"section-card\" style=\"margin-bottom:12px\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '60%', height: '14px', 'border-radius': '4px' }\">\n </ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Loaded: categories + right component card preview -->\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!savedLoader && savedCategoryKeys.length > 0\">\n\n <!-- LEFT: component categories list -->\n <div class=\"left-sidebar\">\n <div class=\"saved-pages-label\">Saved Sections</div>\n <ng-container *ngFor=\"let catKey of savedCategoryKeys\">\n <div class=\"saved-page-item\"\n [class.active]=\"selectedSavedCategory === catKey\"\n (click)=\"selectSavedCategory(catKey)\">\n <mat-icon class=\"saved-page-icon\">article</mat-icon>\n <span class=\"saved-page-name\">{{catKey}}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"right-content\">\n <div class=\"section-group-label\">Component Preview</div>\n\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"savedSections[selectedSavedCategory]\">\n <div class=\"section-card fade-in\"\n [class.section-card-selected]=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\"\n (click)=\"selectSavedComponent(savedSections[selectedSavedCategory].component)\">\n\n <!-- Section type badge -->\n <div class=\"section-card-badge\" *ngIf=\"savedSections[selectedSavedCategory].component?.sectionType\">\n {{savedSections[selectedSavedCategory].component.sectionType.split('_').join(' ') | titlecase}}\n </div>\n\n <!-- Preview area (Show image if present, fallback to placeholder) -->\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\n <ng-container *ngIf=\"savedSections[selectedSavedCategory].component?.styles?.background?.image && savedSections[selectedSavedCategory].component?.styles?.background?.showImage; else savedNoImage\">\n <img [src]=\"savedSections[selectedSavedCategory].component.styles.background.image\" alt=\"section preview\">\n </ng-container>\n <ng-template #savedNoImage>\n <div class=\"saved-preview-placeholder d-flex flex-column align-items-center justify-content-center\">\n <mat-icon>layers</mat-icon>\n <span>{{savedSections[selectedSavedCategory].component?.sectionType?.split('_')?.join(' ') || 'Saved Component'}}</span>\n </div>\n </ng-template>\n </div>\n\n <!-- Card info -->\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\n <div>\n <div class=\"section-card-name\">{{savedSections[selectedSavedCategory].component?.sectionName}}</div>\n <div class=\"section-card-desc\" *ngIf=\"savedSections[selectedSavedCategory].component?.desc\">\n {{savedSections[selectedSavedCategory].component.desc}}\n </div>\n </div>\n <mat-icon class=\"card-check-icon\"\n *ngIf=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\">\n check_circle\n </mat-icon>\n </div>\n\n <!-- Used In footer -->\n <div class=\"saved-card-footer\" *ngIf=\"savedSections[selectedSavedCategory].usedIn\">\n <div class=\"used-in-container d-flex align-items-center gap-2\">\n <mat-icon class=\"used-in-icon\">web</mat-icon>\n <span class=\"used-in-text\">\n <strong>Used In ({{savedSections[selectedSavedCategory].usedIn.length}} Pages):</strong> \n {{savedSections[selectedSavedCategory].usedIn.join(', ')}}\n </span>\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n </div>\n\n <!-- Empty: no saved data at all -->\n <div class=\"empty-state fade-in\" *ngIf=\"!savedLoader && savedCategoryKeys.length === 0\">\n <img src=\"https://cdn-icons-png.flaticon.com/512/4076/4076549.png\" alt=\"empty\">\n <div class=\"empty-title\">No saved sections</div>\n <div class=\"empty-subtitle\">Sections you save from pages will appear here</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"selectedTab === 'APPS'\">\n \n <!-- Skeleton Loader during API load -->\n <div class=\"content-layout d-flex\" *ngIf=\"appsLoader\">\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"right-content\">\n <ng-container *ngFor=\"let s of [1,1,1]\">\n <div class=\"section-card\" style=\"margin-bottom:12px\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Loaded apps list and preview boards -->\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!appsLoader && appsList.length > 0\">\n <!-- LEFT SIDEBAR -->\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let app of appsList\">\n <div class=\"category-block\">\n <!-- App Header Row -->\n <div class=\"category-header d-flex align-items-center justify-content-between\"\n (click)=\"toggleAppCategory(app.appName)\">\n \n <div class=\"d-flex gap-2 align-items-center\" style=\"min-width: 0; flex: 1;\">\n <span class=\"category-icon\">{{appIconMap[app.appName] || '\uD83D\uDCE6'}}</span>\n <span class=\"fs-13 fw-semibold\" style=\"text-overflow: ellipsis; overflow: hidden; white-space: nowrap; min-width: 0; flex: 1;\">\n {{app.appName}}\n </span>\n <!-- Compact active green status dot for installed -->\n <span class=\"app-dot-installed\" *ngIf=\"app.appInstalled\" title=\"Installed\"></span>\n </div>\n\n <div class=\"d-flex align-items-center gap-1\">\n <!-- Install Button if not installed -->\n <button class=\"btn-app-install-small\" *ngIf=\"!app.appInstalled\"\n (click)=\"installApp(app, $event)\">\n Install\n </button>\n \n <mat-icon class=\"category-arrow\" *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\n expand_less\n </mat-icon>\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedApps[app.appName] && app.appInstalled\">\n expand_more\n </mat-icon>\n </div>\n\n </div>\n \n <!-- Subcomponents list under installed app -->\n <div class=\"category-items d-flex flex-column animate-dropdown\" \n *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\n <ng-container *ngIf=\"app.components?.length > 0; else noAppSecs\">\n <ng-container *ngFor=\"let sec of app.components\">\n <div class=\"category-item\"\n [class.active]=\"sec?.data?.componentId != null && selectedAppComponent?.componentId === sec?.data?.componentId\"\n (click)=\"selectAppComponent(sec.data, app.appName)\">\n <!-- {{sec.data.sectionName}} -->\n {{ sec?.data?.sectionName || 'No Component' }}\n </div>\n </ng-container>\n </ng-container>\n <ng-template #noAppSecs>\n <div class=\"category-item-disabled\">\n No sections available\n </div>\n </ng-template>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- RIGHT CONTENT PREVIEW -->\n <div class=\"right-content\">\n \n <!-- IF AN APP IS SELECTED -->\n <ng-container *ngIf=\"selectedApp\">\n \n <!-- INSTALLED APP SECTIONS LIST -->\n <ng-container *ngIf=\"getSelectedAppObj() as activeApp\">\n <ng-container *ngIf=\"activeApp.appInstalled\">\n <div class=\"section-group-label\">{{selectedApp}} Sections</div>\n \n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedAppSections.length > 0\">\n <ng-container *ngFor=\"let ele of selectedAppSections; let i = index\">\n \n <div [id]=\"'app-comp-' + ele?.data?.componentId != null\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\n [class.section-card-selected]=\"ele?.data?.componentId != null && selectedAppComponent?.componentId === ele.data.componentId\"\n (click)=\"selectAppComponentAndHighlight(ele.data)\">\n\n <!-- Badge showing component section name -->\n <div class=\"section-card-badge\" *ngIf=\"ele?.data?.sectionType\">\n + {{(ele?.data?.sectionName | titlecase) || \"No Component\"}}\n </div>\n\n <!-- Image Preview Area -->\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\n <ng-container *ngIf=\"ele?.data?.image; else noImage\">\n <img [src]=\"ele.data.image\" alt=\"section preview\">\n </ng-container>\n <ng-template #noImage>\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\n <mat-icon>image</mat-icon>\n </div>\n </ng-template>\n </div>\n\n <!-- Card Info (Description and Tags) -->\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\n <div style=\"min-width: 0; flex: 1; padding-right: 8px;\">\n <div class=\"section-card-desc\" *ngIf=\"ele?.data?.desc\" style=\"margin-bottom: 6px;\">{{ele.data.desc}}</div>\n <!-- Tags array rendering -->\n <div class=\"d-flex flex-wrap gap-1\" *ngIf=\"ele?.data?.tags?.length > 0\">\n <span class=\"app-badge\" style=\"background: #eef2ff; color: #4f46e5; margin: 0; font-size: 8.5px;\" *ngFor=\"let tag of ele.data.tags\">\n {{tag}}\n </span>\n </div>\n </div>\n <mat-icon class=\"card-check-icon\"\n *ngIf=\"ele?.data != null && selectedAppComponent?.componentId === ele.data.componentId\">\n check_circle\n </mat-icon>\n </div>\n\n </div>\n \n </ng-container>\n </div>\n \n <!-- No sections empty state inside right panel -->\n <div class=\"empty-state fade-in\" *ngIf=\"selectedAppSections.length === 0\">\n <mat-icon class=\"empty-page-icon\">inbox</mat-icon>\n <div class=\"empty-title\">No sections available</div>\n <div class=\"empty-subtitle\">This app does not provide any pre-built sections at the moment</div>\n </div>\n </ng-container>\n\n <!-- NOT INSTALLED EMPTY STATE -->\n <ng-container *ngIf=\"!activeApp.appInstalled\">\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\n <mat-icon class=\"empty-page-icon\" style=\"font-size: 56px !important; width: 56px !important; height: 56px !important; color: #7c6cf0; opacity: 0.8;\">\n get_app\n </mat-icon>\n <div class=\"empty-title\" style=\"font-size: 16px; margin-top: 12px;\">Please install to view sections</div>\n <div class=\"empty-subtitle\" style=\"margin-bottom: 16px; max-width: 280px; text-align: center;\">\n Install the {{selectedApp}} plugin to unlock premium, pre-built sections for your website.\n </div>\n <button class=\"btn-app-install-large\" (click)=\"installApp(activeApp, $event)\">\n \u26A1 Install {{selectedApp}} App\n </button>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-container>\n\n <!-- NO ACTIVE APP SELECTED (FALLBACK) -->\n <ng-container *ngIf=\"!selectedApp\">\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\n <mat-icon class=\"empty-page-icon\">apps</mat-icon>\n <div class=\"empty-title\">Explore Plugins & Apps</div>\n <div class=\"empty-subtitle\" style=\"max-width: 260px;\">\n Select any application from the left sidebar to browse and configure its custom layout components.\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </ng-container>\n\n\n <!-- EMPTY SEARCH -->\n <ng-template #emptyScreen>\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\">\n <img src=\"https://cdn-icons-png.flaticon.com/512/7486/7486803.png\">\n <div class=\"empty-title\">No sections found</div>\n <div class=\"empty-subtitle\">\n Try searching something else or explore categories\n </div>\n </div>\n </ng-template>\n\n </div>\n\n <!-- Footer -->\n <div class=\"footer-container fade-in\">\n <div class=\"footer-hint\">\n <mat-icon>info_outline</mat-icon>\n You can rearrange or remove this section any time.\n </div>\n <div class=\"footer-actions\">\n <div class=\"btn-cancel\" (click)=\"dialog.close()\">Cancel</div>\n <div class=\"btn-add\"\n [class.disabled]=\"selectedTab === 'BASIC' ? !selectedComponent : (selectedTab === 'APPS' ? !selectedAppComponent : !selectedSavedComponent)\"\n (click)=\"handleAddSection($event)\">\n + Add section\n </div>\n </div>\n </div>\n\n</section>\n\n<!-- Beautiful Installation Progress Dialog Template -->\n<ng-template #installProgressTemplate>\n <div class=\"simpo-dialog-container animate-complete-pop\">\n <div class=\"simpo-dialog-header\">\n <div class=\"app-icon-badge\">{{ appIconMap[installingApp?.appName] || '\uD83D\uDD0C' }}</div>\n <h3>Setting Up {{ installingApp?.appName }} App</h3>\n <p>Please wait while we configure your premium scheduling system.</p>\n </div>\n\n <div class=\"simpo-dialog-body\">\n <!-- Animated Progress Bar -->\n <div class=\"simpo-dialog-progress-bar\">\n <div class=\"simpo-dialog-progress-fill\" [style.width]=\"getOverallProgressPercent() + '%'\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"simpo-steps-list\">\n <div class=\"step-row\" *ngFor=\"let step of installSteps; let idx = index\" [ngClass]=\"step?.status || ''\">\n <div class=\"step-icon-container\">\n <!-- Active Step Icon (Pulsing glowing dot) -->\n <div class=\"step-icon active-icon\" *ngIf=\"step?.status === 'active'\">\n <span class=\"step-number\">{{ idx + 1 }}</span>\n <div class=\"pulse-ring\"></div>\n </div>\n\n <!-- Success Step Icon (Green checkmark with spring-up animation) -->\n <div class=\"step-icon success-icon animate-success\" *ngIf=\"step?.status === 'success'\">\n <mat-icon>check</mat-icon>\n </div>\n\n <!-- Pending Step Icon (Dimmed simple number/dot) -->\n <div class=\"step-icon pending-icon\" *ngIf=\"step?.status === 'pending'\">\n <span class=\"step-number\">{{ idx + 1 }}</span>\n </div>\n </div>\n\n <div class=\"step-content\">\n <div class=\"step-label\">{{ step?.label || '' }}</div>\n <div class=\"step-desc\" *ngIf=\"step?.status === 'active'\">Processing, please wait<span class=\"dots-pulse\"></span></div>\n <div class=\"step-desc success-desc\" *ngIf=\"step?.status === 'success'\">Completed successfully</div>\n <div class=\"step-desc pending-desc\" *ngIf=\"step?.status === 'pending'\">Upcoming...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Beautiful Installation Complete Dialog Template -->\n<ng-template #installCompleteTemplate>\n <div class=\"simpo-dialog-container complete-dialog-card animate-complete-pop\">\n <div class=\"complete-header-art\">\n <div class=\"sparkles-container\">\n <span class=\"sparkle one\">\u2728</span>\n <span class=\"sparkle two\">\u2728</span>\n <span class=\"sparkle three\">\uD83C\uDF89</span>\n </div>\n <div class=\"complete-icon-wrapper\">\n <mat-icon>verified</mat-icon>\n </div>\n </div>\n\n <div class=\"simpo-dialog-header text-center\">\n <div class=\"success-badge-text\">INSTALLATION COMPLETED</div>\n <h3 class=\"complete-title\">Your Appointment App is Ready!</h3>\n <p class=\"complete-message\">\n For better experience create service and assign staff to created service\n </p>\n </div>\n\n <div class=\"simpo-dialog-body text-center d-flex flex-column align-items-center gap-3\">\n <!-- Directing Action Button -->\n <button class=\"btn-redirect w-100\" (click)=\"redirectToAppointments()\">\n <span>Create Service & Assign Staff</span>\n <mat-icon>arrow_forward</mat-icon>\n </button>\n\n <!-- Dismiss button -->\n <button class=\"btn-dismiss\" (click)=\"closeAllDialogs()\">\n Maybe Later\n </button>\n </div>\n </div>\n</ng-template>", styles: ["*{font-family:var(--primary-font-family);box-sizing:border-box}mat-icon{font-family:Material Icons!important}.gap-10{gap:10px!important}.f-18{font-size:18px;cursor:pointer}.w-30{width:30px!important}.h-30{height:30vh}.cp{cursor:pointer}.fs-14{font-size:14px}.fs-12{font-size:12px}.fs-16{font-size:16px}.fw-bold{font-weight:700}.main-container{height:100vh;background:#fff;border-radius:16px;overflow:hidden;display:flex;flex-direction:column}.header-container{position:relative;padding:16px 20px 14px;background:#fff;border-bottom:1px solid #f0eef8}.header-title{font-size:16px;font-weight:700;color:#1a1733;line-height:1.4}.header-subtitle{font-size:12px;color:#9e9bb5;margin-top:2px}.close-btn{position:absolute;top:50%;right:18px;transform:translateY(-50%);cursor:pointer;color:#aaa;font-size:20px!important;width:30px!important;height:30px!important;border-radius:8px;transition:background .15s,color .15s;display:flex;align-items:center;justify-content:center}.close-btn:hover{background:#f0eeff;color:#5a4fcf}.parent-container{flex:1;overflow:hidden;background:#f9f8fd;display:flex;flex-direction:column;padding:0}.tab-container{padding:8px;margin:0 15px;gap:3%;background:#fff;border-radius:13px}.tabs{font-size:14px;font-weight:500;line-height:24px;color:#2c2c2c99;width:30%;cursor:pointer;padding:8px 0;text-align:center}.active-tab{color:#fff!important;background:var(--primary-bg-color);box-shadow:0 0 4px #00000040;border-radius:8px;transition:opacity .3s ease-in-out,transform .3s ease-in-out;opacity:1;transform:translateY(0)}.top-tabs-container{margin:12px 16px 0;background:#eeecf8;border-radius:12px;padding:4px;display:flex;gap:2px;flex-shrink:0}.top-tab{flex:1;text-align:center;padding:7px 12px;font-size:12.5px;font-weight:500;color:#888;cursor:pointer;border-radius:9px;transition:all .18s ease;-webkit-user-select:none;user-select:none;white-space:nowrap}.top-tab:hover:not(.active-top-tab){color:#555;background:#ffffff8c}.active-top-tab{background:#fff;color:#4b3fc0;font-weight:700;box-shadow:0 1px 6px #4b3fc021}.search-bar-container{padding:10px 16px 8px;flex-shrink:0}.search-bar{background:#fff;border:1.5px solid #e6e2f6;border-radius:10px;padding:8px 12px;display:flex;align-items:center;gap:8px;transition:border-color .18s,box-shadow .18s}.search-bar:focus-within{border-color:var(--primary-bg-color);box-shadow:0 0 0 3px #7c6cf01a}.search-bar img{width:15px;height:15px;opacity:.45;flex-shrink:0}.search-bar input{border:none;outline:none;background:transparent;font-size:13px;color:#333;width:100%}.search-bar input::placeholder{color:#bbb}.content-layout{flex:1;overflow:hidden;border-top:1px solid #f0eef8;display:flex;min-height:0}.categories-sidepanel{width:15%;padding:10px 5px;margin:15px 0;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.side-section{padding:6px 10px;border-radius:8px;margin-bottom:10px;cursor:pointer}.side-section img{width:16px}.side-section .image-container{background:#f9fafb;padding:5px 8px;border-radius:5px}.side-section .section-text{font-size:12px;font-weight:500;line-height:24px;text-align:center;color:#a1a1a1}.active-section{background:var(--primary-bg-color)!important;box-shadow:0 0 4px #00000040}.active-section .section-text{color:#fff!important}.active-section .image-container{background:unset!important;padding:unset!important;border-radius:unset!important}.left-sidebar{width:210px;min-width:210px;background:#fff;padding:12px 8px;overflow-y:auto;border-right:1px solid #f0eef8;height:100%}.left-sidebar::-webkit-scrollbar{width:3px}.left-sidebar::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.category-block{margin-bottom:2px}.category-header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 10px;cursor:pointer;border-radius:9px;transition:background .15s;-webkit-user-select:none;user-select:none;white-space:nowrap!important}.category-header:hover{background:#f3f0fd}.category-icon{font-size:15px;width:20px;text-align:center;flex-shrink:0;line-height:1}.fs-13{font-size:13px}.category-count{font-size:11px;font-weight:500;color:#bbb;position:relative;top:1px}.category-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#ccc;transition:transform .22s ease,color .15s;flex-shrink:0}.category-block:has(.category-items) .category-arrow{color:#7c6cf0}.category-items{padding:2px 4px 4px 28px;display:flex;flex-direction:column;gap:1px;animation:dropdownFade .2s ease}.category-item{padding:5px 10px;font-size:12px;color:#555;cursor:pointer;border-radius:7px;transition:background .13s,color .13s;-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-item:hover{background:#f0eeff;color:#4b3fc0}.category-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.categories-render-section{width:85%;padding:15px;margin:15px 10px;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.categories-head{font-size:20px;font-weight:600;line-height:24px;color:#434343}.sub-text{font-size:13px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.section{margin-bottom:10px}.section-header{font-size:14px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.right-content{flex:1;overflow-y:auto;padding:14px 14px 14px 12px;height:100%;min-width:0}.right-content::-webkit-scrollbar{width:4px}.right-content::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.section-group-label{font-size:12px;font-weight:700;letter-spacing:.4px;color:#9e9bb5;margin-bottom:12px;text-transform:uppercase}.sections-list{display:flex;flex-direction:column;gap:12px}.section-card{border:1.5px solid #ebe8f8;border-radius:12px;overflow:hidden;cursor:pointer;background:#fff;transition:all .2s ease}.section-card:hover{border-color:#c4baf0;box-shadow:0 4px 16px #7c6cf01a;transform:translateY(-1px)}.section-card-preview{cursor:default!important;pointer-events:none}.section-card-preview:hover{border-color:#ebe8f8!important;box-shadow:none!important;transform:none!important}.section-card-selected{border-color:#7c6cf0!important;box-shadow:0 0 0 3px #7c6cf024!important}.section-card-badge{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.5px;color:#5a4fcf;background:#edeafc;padding:3px 10px;margin:10px 10px 6px;border-radius:20px}.section-img-container{width:100%;overflow:hidden;background:#f5f3fc;display:flex;align-items:center;justify-content:center;max-height:200px;min-height:100px}.section-img-container img{width:100%;display:block;object-fit:cover;transition:transform .25s ease}.section-card:hover .section-img-container img{transform:scale(1.03)}.no-image-placeholder{height:130px;display:flex;align-items:center;justify-content:center;color:#d5d0ee}.no-image-placeholder mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#d5d0ee}.section-card-info{padding:10px 14px 12px}.section-card-name{font-size:13px;font-weight:600;color:#1a1733;margin-bottom:3px}.section-card-desc{font-size:12px;color:#9e9bb5;line-height:1.5}.card-check-icon{font-size:20px!important;width:20px!important;height:20px!important;color:#7c6cf0;flex-shrink:0;animation:checkPop .22s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes checkPop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.quick-add-container{padding:4px 24px 10px;gap:10px;flex-wrap:wrap;flex-shrink:0}.quick-add-label{font-size:12px;color:#888;white-space:nowrap}.quick-add-chips{gap:6px;width:100%;overflow-y:scroll;white-space:nowrap}.quick-chip{gap:5px;padding:4px 10px;font-size:12px;border:1.5px solid #e0e0e0;border-radius:20px;cursor:pointer;color:#333;background:#fff;transition:all .2s ease;-webkit-user-select:none;user-select:none}.quick-chip.active-quick-chip{border-color:#7c6cf0;color:#4b3fc0;font-weight:500}.chip-emoji{font-size:14px}.saved-pages-label{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#bbb;padding:0 10px;margin-bottom:10px}.saved-page-item{display:flex;align-items:center;gap:7px;padding:7px 10px;cursor:pointer;border-radius:9px;font-size:13px;font-weight:500;color:#666;transition:background .15s,color .15s;-webkit-user-select:none;user-select:none;margin-bottom:2px;overflow:hidden}.saved-page-item:hover{background:#f0eeff;color:#4b3fc0}.saved-page-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.saved-page-icon{font-size:15px!important;width:15px!important;height:15px!important;color:inherit;flex-shrink:0}.saved-page-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.saved-preview-placeholder{height:100px;width:100%;background:#f5f3fc;gap:6px}.saved-preview-placeholder mat-icon{font-size:28px!important;width:28px!important;height:28px!important;color:#c8c2ee}.saved-preview-placeholder span{font-size:11px;color:#b0aac8;text-transform:capitalize}.empty-page-icon{font-size:40px!important;width:40px!important;height:40px!important;color:#d5d0ee;margin-bottom:4px}.app-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:20px;letter-spacing:.3px;text-transform:uppercase;margin-left:6px}.app-dot-installed{width:6px!important;height:6px!important;min-width:6px!important;min-height:6px!important;background:#2ec4b6!important;border-radius:50%!important;display:inline-block!important;flex-shrink:0!important;box-shadow:0 0 0 2px #2ec4b62e!important;margin-left:4px!important}.badge-installed{background:#e2fbe8;color:#1b8a3e}.btn-app-install-small{padding:3px 10px!important;font-size:10px!important;font-weight:700!important;color:#7c6cf0!important;background:#f1efff!important;border:1px solid #7c6cf0!important;border-radius:6px!important;cursor:pointer!important;transition:all .15s ease!important;outline:none!important;height:22px!important;min-height:22px!important;max-height:22px!important;min-width:unset!important;max-width:unset!important;line-height:14px!important;box-sizing:border-box!important;margin:0!important;display:inline-flex!important;align-items:center!important;justify-content:center!important}.btn-app-install-small:hover{background:#7c6cf0;color:#fff;box-shadow:0 2px 6px #7c6cf033}.btn-app-install-large{padding:8px 18px;font-size:12px;font-weight:700;color:#fff;background:linear-gradient(135deg,#7c6cf0,#5a4fcf);border:none;border-radius:9px;cursor:pointer;box-shadow:0 4px 12px #5a4fcf4d;transition:all .18s ease;outline:none}.btn-app-install-large:hover{transform:translateY(-1.5px);box-shadow:0 6px 16px #5a4fcf73}.btn-app-install-large:active{transform:translateY(0)}.category-item-disabled{padding:5px 10px;font-size:12px;color:#aaa;font-style:italic;-webkit-user-select:none;user-select:none}.saved-card-footer{padding:10px 14px;background:#faf9ff;border-top:1px solid #ebe8f8}.used-in-container{font-size:11.5px;color:#666}.used-in-icon{font-size:15px!important;width:15px!important;height:15px!important;color:#7c6cf0}.used-in-text{line-height:1.4}.used-in-text strong{color:#4b3fc0;font-weight:600}.empty-div{height:calc(70vh + -0px);background:#fff;margin:18px;border-radius:13px}.oops-text{font-weight:900;font-size:42px;background:var(--primary-bg-color);background-clip:text;-webkit-text-fill-color:transparent}.oops-sub-text-1{font-size:17px;font-weight:600;color:#101010e5}.oops-sub-text-2{font-size:14px;font-weight:600;color:#101010e5}.image-container-1{margin-bottom:16px}.empty-img{width:100px;opacity:.85}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;text-align:center;padding:32px 24px}.empty-state img{width:110px;opacity:.8;margin-bottom:4px}.empty-title{font-size:15px;font-weight:700;color:#2d2a4a}.empty-subtitle{font-size:12.5px;color:#aaa;max-width:240px;line-height:1.6}.footer-container{padding:12px 20px;border-top:1px solid #f0eef8;background:#fff;flex-shrink:0;display:flex;align-items:center;justify-content:space-between}.footer-hint{font-size:11.5px;color:#bbb;display:flex;align-items:center;gap:5px}.footer-hint mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#d0cbf0}.footer-actions{display:flex;align-items:center;gap:8px}.btn-cancel{padding:8px 18px;font-size:13px;font-weight:500;border:1.5px solid #e4e0f6;border-radius:9px;background:#fff;color:#666;cursor:pointer;transition:border-color .15s,color .15s,background .15s;-webkit-user-select:none;user-select:none}.btn-cancel:hover{border-color:#b4aae8;color:#4b3fc0;background:#f8f6ff}.btn-add{padding:8px 20px;font-size:13px;font-weight:700;border:none;border-radius:9px;background:var(--primary-bg-color);color:#fff;cursor:pointer;transition:opacity .15s,box-shadow .15s,transform .15s;-webkit-user-select:none;user-select:none;box-shadow:0 3px 10px #7c6cf047}.btn-add:hover:not(.disabled){opacity:.92;transform:translateY(-1px);box-shadow:0 5px 14px #7c6cf05c}.btn-add.disabled{opacity:.38;cursor:not-allowed;box-shadow:none;pointer-events:none}.sidebar-group{margin-bottom:2px}.sidebar-group-icon{font-size:15px;width:20px;text-align:center}.sidebar-group-label{flex:1;font-size:13px}.sidebar-group-header{gap:8px;padding:9px 14px;cursor:pointer;border-radius:0;transition:background .12s;-webkit-user-select:none;user-select:none;font-size:13px;color:#444}.sidebar-group-header:hover{background:#f0f0f0}.sidebar-group-active{background:#ece9fd;color:#4b3fc0;font-weight:600}.sidebar-chevron{font-size:18px;width:18px;height:18px;color:#aaa;transition:transform .2s}.sidebar-chevron.rotated{transform:rotate(180deg)}.subcategory-item{padding:6px 10px 6px 8px;font-size:12px;color:#555;cursor:pointer;border-radius:6px;transition:background .12s;-webkit-user-select:none;user-select:none}.subcategory-item:hover{background:#ece9fd;color:#4b3fc0}.subcategory-active{background:#ece9fd;color:#4b3fc0;font-weight:500}.active-subcategory{background:#7c6cf0!important;color:#fff!important}.sidebar-subcategory{overflow:hidden;animation:dropdownSmooth .25s ease}.fade-in{animation:fadeIn .22s ease}.fade-slide{animation:fadeSlide .25s ease}.stagger-item{opacity:0;transform:translateY(8px);animation:staggerFade .28s ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeSlide{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes staggerFade{to{opacity:1;transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes dropdownSmooth{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes expandFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}::ng-deep .simpo-install-dialog-panel .mat-mdc-dialog-container,::ng-deep .simpo-complete-dialog-panel .mat-mdc-dialog-container{background:transparent!important;box-shadow:none!important;padding:0!important;overflow:visible!important}::ng-deep .simpo-install-dialog-panel .mdc-dialog__surface,::ng-deep .simpo-complete-dialog-panel .mdc-dialog__surface{background:transparent!important;box-shadow:none!important;overflow:visible!important;border-radius:20px!important}.simpo-dialog-container{background:#fff;border-radius:20px;padding:30px;box-shadow:0 20px 50px #4b3fc026;border:1px solid #ebe8f8;overflow:hidden;position:relative;font-family:var(--primary-font-family),sans-serif;color:#1a1733}.simpo-dialog-header{margin-bottom:24px}.simpo-dialog-header h3{font-size:20px;font-weight:700;color:#1a1733;margin:8px 0 4px}.simpo-dialog-header p{font-size:13px;color:#9e9bb5;margin:0;line-height:1.4}.app-icon-badge{font-size:32px;display:inline-block;line-height:1;margin-bottom:12px}.simpo-dialog-progress-bar{height:6px;width:100%;background:#eeecf8;border-radius:10px;overflow:hidden;margin-bottom:24px}.simpo-dialog-progress-fill{height:100%;width:0%;background:linear-gradient(90deg,#7c6cf0,#a08cff);border-radius:10px;transition:width .4s cubic-bezier(.4,0,.2,1);box-shadow:0 0 8px #7c6cf066}.simpo-steps-list{display:flex;flex-direction:column;gap:16px}.step-row{display:flex;align-items:flex-start;gap:16px;transition:all .3s ease}.step-icon-container{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.step-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;transition:all .3s cubic-bezier(.34,1.56,.64,1)}.active-icon{background:#ebe7fc;color:#4b3fc0;border:2px solid #7c6cf0;position:relative;z-index:2;transform:scale(1.1)}.pulse-ring{position:absolute;inset:-4px;border:2px solid #7c6cf0;border-radius:50%;animation:ringPulse 1.8s cubic-bezier(.24,0,.38,1) infinite;opacity:0}@keyframes ringPulse{0%{transform:scale(.9);opacity:.8}50%{opacity:.4}to{transform:scale(1.3);opacity:0}}.success-icon{background:#2ec4b6;color:#fff;border:none;box-shadow:0 4px 10px #2ec4b64d}.success-icon mat-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.animate-success{animation:checkPop .4s cubic-bezier(.34,1.56,.64,1) forwards}.pending-icon{background:#f5f4f8;color:#b0aac8;border:2px solid #eeecf8}.step-number{position:relative;top:-.5px}.step-content{flex:1;display:flex;flex-direction:column;gap:2px}.step-label{font-size:14px;font-weight:600;color:#1a1733;transition:color .3s ease}.step-desc{font-size:11px;color:#7c6cf0;font-weight:500;transition:color .3s ease;animation:fadeSlide .3s ease-out forwards}.dots-pulse:after{content:\"\";display:inline-block;animation:dotsSequence 1.5s infinite}@keyframes dotsSequence{0%{content:\"\"}25%{content:\".\"}50%{content:\"..\"}75%{content:\"...\"}to{content:\"\"}}.step-row.pending .step-label{color:#9e9bb5}.step-row.pending .step-desc{color:#cccad8}.step-row.success .step-label{color:#1a1733}.step-row.success .step-desc{color:#2ec4b6}.complete-dialog-card{border-radius:24px;padding:36px 30px 30px;background:#fff;box-shadow:0 25px 60px #4b3fc02e;border:1px solid #ebe8f8}.complete-header-art{display:flex;justify-content:center;position:relative;margin-bottom:20px}.complete-icon-wrapper{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,#2ec4b6,#0cbaba);display:flex;align-items:center;justify-content:center;box-shadow:0 10px 25px #2ec4b659;position:relative;z-index:2}.complete-icon-wrapper mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.sparkles-container{position:absolute;width:120px;height:80px;top:-10px;pointer-events:none;z-index:1}.sparkle{position:absolute;font-size:20px;animation:bounceSparkle 2s ease infinite}.sparkle.one{top:10px;left:10px;animation-delay:.2s}.sparkle.two{top:0;right:15px;font-size:16px;animation-delay:.7s}.sparkle.three{bottom:10px;right:5px;font-size:22px;animation-delay:1.2s}@keyframes bounceSparkle{0%,to{transform:translateY(0) scale(1);opacity:.8}50%{transform:translateY(-8px) scale(1.15);opacity:1}}.success-badge-text{font-size:10px;font-weight:800;color:#2ec4b6;letter-spacing:1.5px;margin-bottom:8px;text-transform:uppercase}.complete-title{font-size:22px;font-weight:800;color:#1a1733;margin:0 0 12px;letter-spacing:-.2px}.complete-message{font-size:13.5px;color:#5f5c76;line-height:1.6;max-width:380px;margin:0 auto;font-weight:500}.btn-redirect{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 24px;font-size:14px!important;font-weight:700;color:#fff;background-color:#3a0044;border:none;border-radius:12px;cursor:pointer;box-shadow:0 8px 20px #7c6cf04d;transition:all .2s cubic-bezier(.25,.8,.25,1);outline:none;box-sizing:border-box;width:max-content!important}.btn-redirect mat-icon{font-size:18px!important;width:18px!important;height:18px!important;transition:transform .2s ease;display:flex;align-items:center;justify-content:center;color:#fff!important}.btn-redirect:hover mat-icon{transform:translate(3px)}.btn-dismiss{padding:10px 20px;font-size:13px!important;font-weight:600;color:#9e9bb5;background:transparent;border:none;cursor:pointer;transition:color .15s ease;outline:none}.btn-dismiss:hover{color:#4b3fc0}.animate-complete-pop{animation:popupSpring .5s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes popupSpring{0%{opacity:0;transform:scale(.85) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: NgxSkeletonLoaderModule }, { kind: "component", type: i9.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }] }); }
|
|
550
550
|
}
|
|
551
551
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddSectionComponent, decorators: [{
|
|
552
552
|
type: Component,
|
|
553
|
-
args: [{ selector: 'simpo-add-section', standalone: true, imports: [CommonModule, MatIconModule, NgxSkeletonLoaderModule, FormsModule, MatDialogModule], template: "<!-- <section class=\"main-container\">\r\n <div class=\"header-container d-flex align-items-center justify-content-between\">\r\n <div>Select Template</div>\r\n <mat-icon class=\"d-flex align-items-center justify-content-center f-18 cp\" (click)=\"dialog.close()\">\r\n close\r\n </mat-icon>\r\n </div>\r\n <div class=\"parent-container\">\r\n <div class=\"search-bar-container\">\r\n <div class=\"search-bar d-flex gap-10\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\"\r\n alt=\"search-bar-icon\">\r\n <input type=\"text\" placeholder=\"Search for Sections\" [(ngModel)]=\"searchText\" (ngModelChange)=\"searchSections()\">\r\n </div>\r\n </div>\r\n <div class=\"tab-container d-flex justify-content-around align-items-center\">\r\n <ng-container *ngFor=\"let ele of tabs\">\r\n <div class=\"tabs\" (click)=\"selectedTab = ele.value\" [class.active-tab]=\"ele.value == selectedTab\">\r\n {{ele.viewValue}}\r\n <ng-container *ngIf=\"ele.value == 'PRO' && ele.value != selectedTab\">\r\n <img class=\"w-30\"\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/468281c1744699664858Frame%201244831740%20%281%29.png\"\r\n alt=\"pro-icon\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"selectedTab === 'BASIC'; else proTabContent\">\r\n <ng-container *ngIf=\"!isSearch;else emptyScreen\">\r\n <div class=\"categories-container d-flex\">\r\n <div class=\"categories-sidepanel\" *ngIf=\"!loader\">\r\n <ng-container *ngFor=\"let ele of getObjectKeys(sections)\">\r\n <div class=\"side-section d-flex justify-content-center align-items-center flex-column\"\r\n (click)=\"selectSection(ele)\"\r\n [class.active-section]=\"selectedSection == sections[ele]\">\r\n <div class=\"image-container\">\r\n <ng-container *ngIf=\"selectedSection == sections[ele]\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/954383c1741850392802Group%201707481879.png\"\r\n alt=\"icon text\">\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedSection != sections[ele]\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/846145c1741850574864Icon%20%281%29.png\"\r\n alt=\"icon text\">\r\n </ng-container>\r\n </div>\r\n <div class=\"section-text\">\r\n {{ele}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"categories-render-section\" *ngIf=\" !loader && !tabShiftLoader\">\r\n <div class=\"categories-head\">\r\n {{selectedSectionName}}\r\n </div>\r\n <div class=\"sub-text\">\r\n Select a section to add to your page\r\n </div>\r\n <div class=\"sections-container\">\r\n <ng-container *ngFor=\"let ele of selectedSection\">\r\n <div class=\"section\">\r\n <div class=\"section-header\">{{ele.sectionName}}</div>\r\n <div class=\"section-img-container cp\"\r\n (click)=\"addNewSection(ele.componentId,ele.sectionType,$event)\">\r\n <ng-container *ngIf=\"ele?.image; else noImage\">\r\n <img [src]=\"ele?.image\" alt=\"section image\">\r\n </ng-container>\r\n <ng-template #noImage>\r\n <img src=\"https://img.freepik.com/premium-vector/default-image-icon-vector-missing-picture-page-website-design-mobile-app-no-photo-available_87543-11093.jpg\"\r\n alt=\"section image\" class=\"h-30\">\r\n </ng-template>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"categories-sidepanel\" *ngIf=\"loader\">\r\n <ng-container *ngFor=\"let ele of [1,1,1,1,1,1,1,1,1]\">\r\n <div class=\"d-flex justify-content-center align-items-center flex-column\">\r\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n height: '8vh',\r\n width: '65%',\r\n 'border-radius': '13px',\r\n 'margin-bottom' : '10px',\r\n }\" class=\"d-flex justify-content-center w-100\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"categories-render-section\" *ngIf=\"loader || tabShiftLoader\">\r\n <div class=\"categories-head\">\r\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n width: '20%',\r\n height : '3vh',\r\n 'border-radius': '5px',\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n <div class=\"sub-text\">\r\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n width: '60%',\r\n height : '2vh',\r\n 'border-radius': '5px',\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n <div class=\"sections-container\">\r\n <ng-container *ngFor=\"let ele of [1,1,1,1]\">\r\n <div class=\"section\">\r\n <div> <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\r\n width: '25%',\r\n height : '2vh',\r\n 'border-radius': '5px',\r\n }\">\r\n </ngx-skeleton-loader></div>\r\n <div>\r\n <ngx-skeleton-loader [theme]=\"{\r\n width: '100%',\r\n height : '25vh',\r\n 'border-radius': '5px',\r\n 'margin':'2px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #proTabContent>\r\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\r\n <div class=\"image-container-1\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\r\n </div>\r\n <div class=\"oops-text\">\r\n Coming Soon\r\n </div>\r\n <div class=\"oops-sub-text\">\r\n <div class=\"oops-sub-text-1 text-center\">Woof! Something pawsome is coming!</div>\r\n <div class=\"oops-sub-text-2 text-center\">\r\n Hey hooman! I just sniffed out something super exciting... and it\u2019s almost here! \r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #emptyScreen>\r\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\r\n <div class=\"image-container-1\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\r\n </div>\r\n <div class=\"oops-text\">\r\n Oops! \r\n </div>\r\n <div class=\"oops-sub-text\">\r\n <div class=\"oops-sub-text-1 text-center\">I sniffed everywhere, but I couldn't find what you're looking for</div>\r\n <div class=\"oops-sub-text-2 text-center\">\r\n Maybe try a different search? \r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</section> -->\r\n\r\n<section class=\"main-container d-flex flex-column\">\r\n\r\n <div class=\"header-container fade-in\">\r\n <div class=\"header-title\">Add a section</div>\r\n <div class=\"header-subtitle\">Choose a section \u2014 you can reorder or remove it any time.</div>\r\n <mat-icon class=\"close-btn\" (click)=\"dialog.close()\">close</mat-icon>\r\n </div>\r\n\r\n <div class=\"parent-container d-flex flex-column\">\r\n\r\n <!-- Tabs -->\r\n <div class=\"top-tabs-container d-flex justify-content-between fade-in\">\r\n <ng-container *ngFor=\"let ele of tabs\">\r\n <div class=\"top-tab\" (click)=\"onTabSelect(ele.value)\"\r\n [class.active-top-tab]=\"ele.value == selectedTab\">\r\n {{ele.viewValue}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Search -->\r\n <div class=\"search-bar-container fade-in\" *ngIf=\"selectedTab != 'SAVED'\">\r\n <div class=\"search-bar d-flex gap-2 align-items-center\">\r\n <img\r\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\">\r\n <input type=\"text\" placeholder='Search section...' [(ngModel)]=\"searchText\"\r\n (ngModelChange)=\"searchSections()\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"selectedTab === 'BASIC'\">\r\n\r\n <ng-container *ngIf=\"!isSearch; else emptyScreen\">\r\n\r\n <!-- Quick Add -->\r\n <!-- <div class=\"quick-add-container fade-in d-flex align-items-center\" *ngIf=\"!loader && !searchText\">\r\n <div class=\"quick-add-label\">Quick add:</div>\r\n <div class=\"quick-add-chips d-flex\">\r\n <ng-container *ngFor=\"let category of getObjectKeys(sections); let i = index\">\r\n <ng-container *ngIf=\"i < 6\">\r\n <div class=\"quick-chip stagger-item d-flex align-items-center\"\r\n (click)=\"selectSection(category); toggleCategory(category)\"\r\n [class.active-quick-chip]=\"selectedSectionName === category\">\r\n <span class=\"chip-emoji\">{{getCategoryEmoji(category)}}</span>\r\n {{getFirstSectionName(category)}}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div> -->\r\n\r\n <!-- CONTENT -->\r\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!loader\">\r\n <!-- LEFT -->\r\n <div class=\"left-sidebar\">\r\n <!-- <div class=\"category-header d-flex align-items-center\">\r\n <div class=\"category-icon d-flex align-items-center justify-content-center\">\u2728</div>\r\n <div class=\"fs-14\">AI Recommended</div>\r\n </div> -->\r\n <ng-container *ngFor=\"let category of getObjectKeys(sections)\">\r\n <div class=\"category-block\">\r\n <div class=\"category-header d-flex align-items-end justify-content-between\"\r\n (click)=\"toggleCategory(category)\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <span class=\"category-icon\">\r\n {{getCategoryEmoji(category)}}\r\n </span>\r\n <span class=\"fs-13\">\r\n {{category}}\r\n </span>\r\n <span class=\"category-count\">\r\n ({{sections[category]?.length}})\r\n </span>\r\n </div>\r\n <mat-icon class=\"category-arrow\" *ngIf=\"expandedCategories[category]\">\r\n expand_less\r\n </mat-icon>\r\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedCategories[category]\">\r\n expand_more\r\n </mat-icon>\r\n </div>\r\n <div class=\"category-items d-flex flex-column\" *ngIf=\"expandedCategories[category]\">\r\n <ng-container *ngFor=\"let sec of sections[category]\">\r\n <div class=\"category-item\"\r\n [class.active]=\"selectedComponent?.componentId === sec.componentId\"\r\n (click)=\"selectComponent(sec, category)\">\r\n {{sec.sectionName}}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"right-content\">\r\n\r\n <div class=\"section-group-label\">{{selectedSectionName || 'Sections'}}</div>\r\n\r\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedSection && selectedSection.length > 0\">\r\n\r\n <ng-container *ngFor=\"let ele of selectedSection; let i = index\">\r\n\r\n <div [id]=\"'comp-' + ele.componentId\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\r\n [class.section-card-selected]=\"selectedComponent?.componentId === ele.componentId\"\r\n (click)=\"selectComponentAndHighlight(ele)\">\r\n\r\n <div class=\"section-card-badge\" *ngIf=\"ele.sectionType\">\r\n <!-- + {{ele.sectionType | uppercase}} -->\r\n + {{ele.sectionName | titlecase}}\r\n </div>\r\n\r\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\r\n <ng-container *ngIf=\"ele?.image; else noImage\">\r\n <img [src]=\"ele?.image\" alt=\"section preview\">\r\n </ng-container>\r\n <ng-template #noImage>\r\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\r\n <div>\r\n <!-- <div class=\"section-card-name\">{{ele.sectionName}}</div> -->\r\n <div class=\"section-card-desc\" *ngIf=\"ele.desc\">{{ele.desc | titlecase}}</div>\r\n </div>\r\n <mat-icon class=\"card-check-icon\"\r\n *ngIf=\"selectedComponent?.componentId === ele.componentId\">\r\n check_circle\r\n </mat-icon>\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </div>\r\n\r\n <div class=\"empty-state fade-in\" *ngIf=\"!selectedSection || selectedSection.length === 0\">\r\n <mat-icon class=\"empty-page-icon\">auto_awesome</mat-icon>\r\n <div class=\"empty-title\">Select a category</div>\r\n <div class=\"empty-subtitle\">\r\n Choose any category from the left sidebar to explore and add sections\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"content-layout d-flex\" *ngIf=\"loader\">\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1,1,1,1,1]\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '6px' }\"></ngx-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-content\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\r\n <div class=\"section-card\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '40%', height: '20px', 'border-radius': '4px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '100%', height: '180px', 'border-radius': '8px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '60%', height: '16px', 'border-radius': '4px' }\"></ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedTab === 'SAVED'\">\r\n <!-- Loader skeleton -->\r\n <div class=\"content-layout d-flex\" *ngIf=\"savedLoader\">\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1,1]\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-content\">\r\n <ng-container *ngFor=\"let s of [1,1,1]\">\r\n <div class=\"section-card\" style=\"margin-bottom:12px\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '60%', height: '14px', 'border-radius': '4px' }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Loaded: categories + right component card preview -->\r\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!savedLoader && savedCategoryKeys.length > 0\">\r\n\r\n <!-- LEFT: component categories list -->\r\n <div class=\"left-sidebar\">\r\n <div class=\"saved-pages-label\">Saved Sections</div>\r\n <ng-container *ngFor=\"let catKey of savedCategoryKeys\">\r\n <div class=\"saved-page-item\"\r\n [class.active]=\"selectedSavedCategory === catKey\"\r\n (click)=\"selectSavedCategory(catKey)\">\r\n <mat-icon class=\"saved-page-icon\">article</mat-icon>\r\n <span class=\"saved-page-name\">{{catKey}}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"right-content\">\r\n <div class=\"section-group-label\">Component Preview</div>\r\n\r\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"savedSections[selectedSavedCategory]\">\r\n <div class=\"section-card fade-in\"\r\n [class.section-card-selected]=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\"\r\n (click)=\"selectSavedComponent(savedSections[selectedSavedCategory].component)\">\r\n\r\n <!-- Section type badge -->\r\n <div class=\"section-card-badge\" *ngIf=\"savedSections[selectedSavedCategory].component?.sectionType\">\r\n {{savedSections[selectedSavedCategory].component.sectionType.split('_').join(' ') | titlecase}}\r\n </div>\r\n\r\n <!-- Preview area (Show image if present, fallback to placeholder) -->\r\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\r\n <ng-container *ngIf=\"savedSections[selectedSavedCategory].component?.styles?.background?.image && savedSections[selectedSavedCategory].component?.styles?.background?.showImage; else savedNoImage\">\r\n <img [src]=\"savedSections[selectedSavedCategory].component.styles.background.image\" alt=\"section preview\">\r\n </ng-container>\r\n <ng-template #savedNoImage>\r\n <div class=\"saved-preview-placeholder d-flex flex-column align-items-center justify-content-center\">\r\n <mat-icon>layers</mat-icon>\r\n <span>{{savedSections[selectedSavedCategory].component?.sectionType?.split('_')?.join(' ') || 'Saved Component'}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Card info -->\r\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\r\n <div>\r\n <div class=\"section-card-name\">{{savedSections[selectedSavedCategory].component?.sectionName}}</div>\r\n <div class=\"section-card-desc\" *ngIf=\"savedSections[selectedSavedCategory].component?.desc\">\r\n {{savedSections[selectedSavedCategory].component.desc}}\r\n </div>\r\n </div>\r\n <mat-icon class=\"card-check-icon\"\r\n *ngIf=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\">\r\n check_circle\r\n </mat-icon>\r\n </div>\r\n\r\n <!-- Used In footer -->\r\n <div class=\"saved-card-footer\" *ngIf=\"savedSections[selectedSavedCategory].usedIn\">\r\n <div class=\"used-in-container d-flex align-items-center gap-2\">\r\n <mat-icon class=\"used-in-icon\">web</mat-icon>\r\n <span class=\"used-in-text\">\r\n <strong>Used In ({{savedSections[selectedSavedCategory].usedIn.length}} Pages):</strong> \r\n {{savedSections[selectedSavedCategory].usedIn.join(', ')}}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Empty: no saved data at all -->\r\n <div class=\"empty-state fade-in\" *ngIf=\"!savedLoader && savedCategoryKeys.length === 0\">\r\n <img src=\"https://cdn-icons-png.flaticon.com/512/4076/4076549.png\" alt=\"empty\">\r\n <div class=\"empty-title\">No saved sections</div>\r\n <div class=\"empty-subtitle\">Sections you save from pages will appear here</div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedTab === 'APPS'\">\r\n \r\n <!-- Skeleton Loader during API load -->\r\n <div class=\"content-layout d-flex\" *ngIf=\"appsLoader\">\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"right-content\">\r\n <ng-container *ngFor=\"let s of [1,1,1]\">\r\n <div class=\"section-card\" style=\"margin-bottom:12px\">\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n <ngx-skeleton-loader\r\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Loaded apps list and preview boards -->\r\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!appsLoader && appsList.length > 0\">\r\n <!-- LEFT SIDEBAR -->\r\n <div class=\"left-sidebar\">\r\n <ng-container *ngFor=\"let app of appsList\">\r\n <div class=\"category-block\">\r\n <!-- App Header Row -->\r\n <div class=\"category-header d-flex align-items-center justify-content-between\"\r\n (click)=\"toggleAppCategory(app.appName)\">\r\n \r\n <div class=\"d-flex gap-2 align-items-center\" style=\"min-width: 0; flex: 1;\">\r\n <span class=\"category-icon\">{{appIconMap[app.appName] || '\uD83D\uDCE6'}}</span>\r\n <span class=\"fs-13 fw-semibold\" style=\"text-overflow: ellipsis; overflow: hidden; white-space: nowrap; min-width: 0; flex: 1;\">\r\n {{app.appName}}\r\n </span>\r\n <!-- Compact active green status dot for installed -->\r\n <span class=\"app-dot-installed\" *ngIf=\"app.appInstalled\" title=\"Installed\"></span>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <!-- Install Button if not installed -->\r\n <button class=\"btn-app-install-small\" *ngIf=\"!app.appInstalled\"\r\n (click)=\"installApp(app, $event)\">\r\n Install\r\n </button>\r\n \r\n <mat-icon class=\"category-arrow\" *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\r\n expand_less\r\n </mat-icon>\r\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedApps[app.appName] && app.appInstalled\">\r\n expand_more\r\n </mat-icon>\r\n </div>\r\n\r\n </div>\r\n \r\n <!-- Subcomponents list under installed app -->\r\n <div class=\"category-items d-flex flex-column animate-dropdown\" \r\n *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\r\n <ng-container *ngIf=\"app.components?.length > 0; else noAppSecs\">\r\n <ng-container *ngFor=\"let sec of app.components\">\r\n <div class=\"category-item\"\r\n [class.active]=\"sec?.data?.componentId != null && selectedAppComponent?.componentId === sec?.data?.componentId\"\r\n (click)=\"selectAppComponent(sec.data, app.appName)\">\r\n <!-- {{sec.data.sectionName}} -->\r\n {{ sec?.data?.sectionName || 'No Component' }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #noAppSecs>\r\n <div class=\"category-item-disabled\">\r\n No sections available\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- RIGHT CONTENT PREVIEW -->\r\n <div class=\"right-content\">\r\n \r\n <!-- IF AN APP IS SELECTED -->\r\n <ng-container *ngIf=\"selectedApp\">\r\n \r\n <!-- INSTALLED APP SECTIONS LIST -->\r\n <ng-container *ngIf=\"getSelectedAppObj() as activeApp\">\r\n <ng-container *ngIf=\"activeApp.appInstalled\">\r\n <div class=\"section-group-label\">{{selectedApp}} Sections</div>\r\n \r\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedAppSections.length > 0\">\r\n <ng-container *ngFor=\"let ele of selectedAppSections; let i = index\">\r\n \r\n <div [id]=\"'app-comp-' + ele?.data?.componentId != null\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\r\n [class.section-card-selected]=\"ele?.data?.componentId != null && selectedAppComponent?.componentId === ele.data.componentId\"\r\n (click)=\"selectAppComponentAndHighlight(ele.data)\">\r\n\r\n <!-- Badge showing component section name -->\r\n <div class=\"section-card-badge\" *ngIf=\"ele?.data?.sectionType\">\r\n + {{(ele?.data?.sectionName | titlecase) || \"No Component\"}}\r\n </div>\r\n\r\n <!-- Image Preview Area -->\r\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\r\n <ng-container *ngIf=\"ele?.data?.image; else noImage\">\r\n <img [src]=\"ele.data.image\" alt=\"section preview\">\r\n </ng-container>\r\n <ng-template #noImage>\r\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\r\n <mat-icon>image</mat-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Card Info (Description and Tags) -->\r\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\r\n <div style=\"min-width: 0; flex: 1; padding-right: 8px;\">\r\n <div class=\"section-card-desc\" *ngIf=\"ele?.data?.desc\" style=\"margin-bottom: 6px;\">{{ele.data.desc}}</div>\r\n <!-- Tags array rendering -->\r\n <div class=\"d-flex flex-wrap gap-1\" *ngIf=\"ele?.data?.tags?.length > 0\">\r\n <span class=\"app-badge\" style=\"background: #eef2ff; color: #4f46e5; margin: 0; font-size: 8.5px;\" *ngFor=\"let tag of ele.data.tags\">\r\n {{tag}}\r\n </span>\r\n </div>\r\n </div>\r\n <mat-icon class=\"card-check-icon\"\r\n *ngIf=\"ele?.data != null && selectedAppComponent?.componentId === ele.data.componentId\">\r\n check_circle\r\n </mat-icon>\r\n </div>\r\n\r\n </div>\r\n \r\n </ng-container>\r\n </div>\r\n \r\n <!-- No sections empty state inside right panel -->\r\n <div class=\"empty-state fade-in\" *ngIf=\"selectedAppSections.length === 0\">\r\n <mat-icon class=\"empty-page-icon\">inbox</mat-icon>\r\n <div class=\"empty-title\">No sections available</div>\r\n <div class=\"empty-subtitle\">This app does not provide any pre-built sections at the moment</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- NOT INSTALLED EMPTY STATE -->\r\n <ng-container *ngIf=\"!activeApp.appInstalled\">\r\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\r\n <mat-icon class=\"empty-page-icon\" style=\"font-size: 56px !important; width: 56px !important; height: 56px !important; color: #7c6cf0; opacity: 0.8;\">\r\n get_app\r\n </mat-icon>\r\n <div class=\"empty-title\" style=\"font-size: 16px; margin-top: 12px;\">Please install to view sections</div>\r\n <div class=\"empty-subtitle\" style=\"margin-bottom: 16px; max-width: 280px; text-align: center;\">\r\n Install the {{selectedApp}} plugin to unlock premium, pre-built sections for your website.\r\n </div>\r\n <button class=\"btn-app-install-large\" (click)=\"installApp(activeApp, $event)\">\r\n \u26A1 Install {{selectedApp}} App\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n <!-- NO ACTIVE APP SELECTED (FALLBACK) -->\r\n <ng-container *ngIf=\"!selectedApp\">\r\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\r\n <mat-icon class=\"empty-page-icon\">apps</mat-icon>\r\n <div class=\"empty-title\">Explore Plugins & Apps</div>\r\n <div class=\"empty-subtitle\" style=\"max-width: 260px;\">\r\n Select any application from the left sidebar to browse and configure its custom layout components.\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n <!-- EMPTY SEARCH -->\r\n <ng-template #emptyScreen>\r\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\">\r\n <img src=\"https://cdn-icons-png.flaticon.com/512/7486/7486803.png\">\r\n <div class=\"empty-title\">No sections found</div>\r\n <div class=\"empty-subtitle\">\r\n Try searching something else or explore categories\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"footer-container fade-in\">\r\n <div class=\"footer-hint\">\r\n <mat-icon>info_outline</mat-icon>\r\n You can rearrange or remove this section any time.\r\n </div>\r\n <div class=\"footer-actions\">\r\n <div class=\"btn-cancel\" (click)=\"dialog.close()\">Cancel</div>\r\n <div class=\"btn-add\"\r\n [class.disabled]=\"selectedTab === 'BASIC' ? !selectedComponent : (selectedTab === 'APPS' ? !selectedAppComponent : !selectedSavedComponent)\"\r\n (click)=\"handleAddSection($event)\">\r\n + Add section\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</section>\r\n\r\n<!-- Beautiful Installation Progress Dialog Template -->\r\n<ng-template #installProgressTemplate>\r\n <div class=\"simpo-dialog-container animate-complete-pop\">\r\n <div class=\"simpo-dialog-header\">\r\n <div class=\"app-icon-badge\">{{ appIconMap[installingApp?.appName] || '\uD83D\uDD0C' }}</div>\r\n <h3>Setting Up {{ installingApp?.appName }} App</h3>\r\n <p>Please wait while we configure your premium scheduling system.</p>\r\n </div>\r\n\r\n <div class=\"simpo-dialog-body\">\r\n <!-- Animated Progress Bar -->\r\n <div class=\"simpo-dialog-progress-bar\">\r\n <div class=\"simpo-dialog-progress-fill\" [style.width]=\"getOverallProgressPercent() + '%'\"></div>\r\n </div>\r\n\r\n <!-- Steps List -->\r\n <div class=\"simpo-steps-list\">\r\n <div class=\"step-row\" *ngFor=\"let step of installSteps; let idx = index\" [ngClass]=\"step?.status || ''\">\r\n <div class=\"step-icon-container\">\r\n <!-- Active Step Icon (Pulsing glowing dot) -->\r\n <div class=\"step-icon active-icon\" *ngIf=\"step?.status === 'active'\">\r\n <span class=\"step-number\">{{ idx + 1 }}</span>\r\n <div class=\"pulse-ring\"></div>\r\n </div>\r\n\r\n <!-- Success Step Icon (Green checkmark with spring-up animation) -->\r\n <div class=\"step-icon success-icon animate-success\" *ngIf=\"step?.status === 'success'\">\r\n <mat-icon>check</mat-icon>\r\n </div>\r\n\r\n <!-- Pending Step Icon (Dimmed simple number/dot) -->\r\n <div class=\"step-icon pending-icon\" *ngIf=\"step?.status === 'pending'\">\r\n <span class=\"step-number\">{{ idx + 1 }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-content\">\r\n <div class=\"step-label\">{{ step?.label || '' }}</div>\r\n <div class=\"step-desc\" *ngIf=\"step?.status === 'active'\">Processing, please wait<span class=\"dots-pulse\"></span></div>\r\n <div class=\"step-desc success-desc\" *ngIf=\"step?.status === 'success'\">Completed successfully</div>\r\n <div class=\"step-desc pending-desc\" *ngIf=\"step?.status === 'pending'\">Upcoming...</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Beautiful Installation Complete Dialog Template -->\r\n<ng-template #installCompleteTemplate>\r\n <div class=\"simpo-dialog-container complete-dialog-card animate-complete-pop\">\r\n <div class=\"complete-header-art\">\r\n <div class=\"sparkles-container\">\r\n <span class=\"sparkle one\">\u2728</span>\r\n <span class=\"sparkle two\">\u2728</span>\r\n <span class=\"sparkle three\">\uD83C\uDF89</span>\r\n </div>\r\n <div class=\"complete-icon-wrapper\">\r\n <mat-icon>verified</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"simpo-dialog-header text-center\">\r\n <div class=\"success-badge-text\">INSTALLATION COMPLETED</div>\r\n <h3 class=\"complete-title\">Your Appointment App is Ready!</h3>\r\n <p class=\"complete-message\">\r\n For better experience create service and assign staff to created service\r\n </p>\r\n </div>\r\n\r\n <div class=\"simpo-dialog-body text-center d-flex flex-column align-items-center gap-3\">\r\n <!-- Directing Action Button -->\r\n <button class=\"btn-redirect w-100\" (click)=\"redirectToAppointments()\">\r\n <span>Create Service & Assign Staff</span>\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n\r\n <!-- Dismiss button -->\r\n <button class=\"btn-dismiss\" (click)=\"closeAllDialogs()\">\r\n Maybe Later\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["*{font-family:var(--primary-font-family);box-sizing:border-box}mat-icon{font-family:Material Icons!important}.gap-10{gap:10px!important}.f-18{font-size:18px;cursor:pointer}.w-30{width:30px!important}.h-30{height:30vh}.cp{cursor:pointer}.fs-14{font-size:14px}.fs-12{font-size:12px}.fs-16{font-size:16px}.fw-bold{font-weight:700}.main-container{height:100vh;background:#fff;border-radius:16px;overflow:hidden;display:flex;flex-direction:column}.header-container{position:relative;padding:16px 20px 14px;background:#fff;border-bottom:1px solid #f0eef8}.header-title{font-size:16px;font-weight:700;color:#1a1733;line-height:1.4}.header-subtitle{font-size:12px;color:#9e9bb5;margin-top:2px}.close-btn{position:absolute;top:50%;right:18px;transform:translateY(-50%);cursor:pointer;color:#aaa;font-size:20px!important;width:30px!important;height:30px!important;border-radius:8px;transition:background .15s,color .15s;display:flex;align-items:center;justify-content:center}.close-btn:hover{background:#f0eeff;color:#5a4fcf}.parent-container{flex:1;overflow:hidden;background:#f9f8fd;display:flex;flex-direction:column;padding:0}.tab-container{padding:8px;margin:0 15px;gap:3%;background:#fff;border-radius:13px}.tabs{font-size:14px;font-weight:500;line-height:24px;color:#2c2c2c99;width:30%;cursor:pointer;padding:8px 0;text-align:center}.active-tab{color:#fff!important;background:var(--primary-bg-color);box-shadow:0 0 4px #00000040;border-radius:8px;transition:opacity .3s ease-in-out,transform .3s ease-in-out;opacity:1;transform:translateY(0)}.top-tabs-container{margin:12px 16px 0;background:#eeecf8;border-radius:12px;padding:4px;display:flex;gap:2px;flex-shrink:0}.top-tab{flex:1;text-align:center;padding:7px 12px;font-size:12.5px;font-weight:500;color:#888;cursor:pointer;border-radius:9px;transition:all .18s ease;-webkit-user-select:none;user-select:none;white-space:nowrap}.top-tab:hover:not(.active-top-tab){color:#555;background:#ffffff8c}.active-top-tab{background:#fff;color:#4b3fc0;font-weight:700;box-shadow:0 1px 6px #4b3fc021}.search-bar-container{padding:10px 16px 8px;flex-shrink:0}.search-bar{background:#fff;border:1.5px solid #e6e2f6;border-radius:10px;padding:8px 12px;display:flex;align-items:center;gap:8px;transition:border-color .18s,box-shadow .18s}.search-bar:focus-within{border-color:var(--primary-bg-color);box-shadow:0 0 0 3px #7c6cf01a}.search-bar img{width:15px;height:15px;opacity:.45;flex-shrink:0}.search-bar input{border:none;outline:none;background:transparent;font-size:13px;color:#333;width:100%}.search-bar input::placeholder{color:#bbb}.content-layout{flex:1;overflow:hidden;border-top:1px solid #f0eef8;display:flex;min-height:0}.categories-sidepanel{width:15%;padding:10px 5px;margin:15px 0;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.side-section{padding:6px 10px;border-radius:8px;margin-bottom:10px;cursor:pointer}.side-section img{width:16px}.side-section .image-container{background:#f9fafb;padding:5px 8px;border-radius:5px}.side-section .section-text{font-size:12px;font-weight:500;line-height:24px;text-align:center;color:#a1a1a1}.active-section{background:var(--primary-bg-color)!important;box-shadow:0 0 4px #00000040}.active-section .section-text{color:#fff!important}.active-section .image-container{background:unset!important;padding:unset!important;border-radius:unset!important}.left-sidebar{width:210px;min-width:210px;background:#fff;padding:12px 8px;overflow-y:auto;border-right:1px solid #f0eef8;height:100%}.left-sidebar::-webkit-scrollbar{width:3px}.left-sidebar::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.category-block{margin-bottom:2px}.category-header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 10px;cursor:pointer;border-radius:9px;transition:background .15s;-webkit-user-select:none;user-select:none;white-space:nowrap!important}.category-header:hover{background:#f3f0fd}.category-icon{font-size:15px;width:20px;text-align:center;flex-shrink:0;line-height:1}.fs-13{font-size:13px}.category-count{font-size:11px;font-weight:500;color:#bbb;position:relative;top:1px}.category-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#ccc;transition:transform .22s ease,color .15s;flex-shrink:0}.category-block:has(.category-items) .category-arrow{color:#7c6cf0}.category-items{padding:2px 4px 4px 28px;display:flex;flex-direction:column;gap:1px;animation:dropdownFade .2s ease}.category-item{padding:5px 10px;font-size:12px;color:#555;cursor:pointer;border-radius:7px;transition:background .13s,color .13s;-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-item:hover{background:#f0eeff;color:#4b3fc0}.category-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.categories-render-section{width:85%;padding:15px;margin:15px 10px;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.categories-head{font-size:20px;font-weight:600;line-height:24px;color:#434343}.sub-text{font-size:13px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.section{margin-bottom:10px}.section-header{font-size:14px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.right-content{flex:1;overflow-y:auto;padding:14px 14px 14px 12px;height:100%;min-width:0}.right-content::-webkit-scrollbar{width:4px}.right-content::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.section-group-label{font-size:12px;font-weight:700;letter-spacing:.4px;color:#9e9bb5;margin-bottom:12px;text-transform:uppercase}.sections-list{display:flex;flex-direction:column;gap:12px}.section-card{border:1.5px solid #ebe8f8;border-radius:12px;overflow:hidden;cursor:pointer;background:#fff;transition:all .2s ease}.section-card:hover{border-color:#c4baf0;box-shadow:0 4px 16px #7c6cf01a;transform:translateY(-1px)}.section-card-preview{cursor:default!important;pointer-events:none}.section-card-preview:hover{border-color:#ebe8f8!important;box-shadow:none!important;transform:none!important}.section-card-selected{border-color:#7c6cf0!important;box-shadow:0 0 0 3px #7c6cf024!important}.section-card-badge{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.5px;color:#5a4fcf;background:#edeafc;padding:3px 10px;margin:10px 10px 6px;border-radius:20px}.section-img-container{width:100%;overflow:hidden;background:#f5f3fc;display:flex;align-items:center;justify-content:center;max-height:200px;min-height:100px}.section-img-container img{width:100%;display:block;object-fit:cover;transition:transform .25s ease}.section-card:hover .section-img-container img{transform:scale(1.03)}.no-image-placeholder{height:130px;display:flex;align-items:center;justify-content:center;color:#d5d0ee}.no-image-placeholder mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#d5d0ee}.section-card-info{padding:10px 14px 12px}.section-card-name{font-size:13px;font-weight:600;color:#1a1733;margin-bottom:3px}.section-card-desc{font-size:12px;color:#9e9bb5;line-height:1.5}.card-check-icon{font-size:20px!important;width:20px!important;height:20px!important;color:#7c6cf0;flex-shrink:0;animation:checkPop .22s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes checkPop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.quick-add-container{padding:4px 24px 10px;gap:10px;flex-wrap:wrap;flex-shrink:0}.quick-add-label{font-size:12px;color:#888;white-space:nowrap}.quick-add-chips{gap:6px;width:100%;overflow-y:scroll;white-space:nowrap}.quick-chip{gap:5px;padding:4px 10px;font-size:12px;border:1.5px solid #e0e0e0;border-radius:20px;cursor:pointer;color:#333;background:#fff;transition:all .2s ease;-webkit-user-select:none;user-select:none}.quick-chip.active-quick-chip{border-color:#7c6cf0;color:#4b3fc0;font-weight:500}.chip-emoji{font-size:14px}.saved-pages-label{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#bbb;padding:0 10px;margin-bottom:10px}.saved-page-item{display:flex;align-items:center;gap:7px;padding:7px 10px;cursor:pointer;border-radius:9px;font-size:13px;font-weight:500;color:#666;transition:background .15s,color .15s;-webkit-user-select:none;user-select:none;margin-bottom:2px;overflow:hidden}.saved-page-item:hover{background:#f0eeff;color:#4b3fc0}.saved-page-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.saved-page-icon{font-size:15px!important;width:15px!important;height:15px!important;color:inherit;flex-shrink:0}.saved-page-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.saved-preview-placeholder{height:100px;width:100%;background:#f5f3fc;gap:6px}.saved-preview-placeholder mat-icon{font-size:28px!important;width:28px!important;height:28px!important;color:#c8c2ee}.saved-preview-placeholder span{font-size:11px;color:#b0aac8;text-transform:capitalize}.empty-page-icon{font-size:40px!important;width:40px!important;height:40px!important;color:#d5d0ee;margin-bottom:4px}.app-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:20px;letter-spacing:.3px;text-transform:uppercase;margin-left:6px}.app-dot-installed{width:6px!important;height:6px!important;min-width:6px!important;min-height:6px!important;background:#2ec4b6!important;border-radius:50%!important;display:inline-block!important;flex-shrink:0!important;box-shadow:0 0 0 2px #2ec4b62e!important;margin-left:4px!important}.badge-installed{background:#e2fbe8;color:#1b8a3e}.btn-app-install-small{padding:3px 10px!important;font-size:10px!important;font-weight:700!important;color:#7c6cf0!important;background:#f1efff!important;border:1px solid #7c6cf0!important;border-radius:6px!important;cursor:pointer!important;transition:all .15s ease!important;outline:none!important;height:22px!important;min-height:22px!important;max-height:22px!important;min-width:unset!important;max-width:unset!important;line-height:14px!important;box-sizing:border-box!important;margin:0!important;display:inline-flex!important;align-items:center!important;justify-content:center!important}.btn-app-install-small:hover{background:#7c6cf0;color:#fff;box-shadow:0 2px 6px #7c6cf033}.btn-app-install-large{padding:8px 18px;font-size:12px;font-weight:700;color:#fff;background:linear-gradient(135deg,#7c6cf0,#5a4fcf);border:none;border-radius:9px;cursor:pointer;box-shadow:0 4px 12px #5a4fcf4d;transition:all .18s ease;outline:none}.btn-app-install-large:hover{transform:translateY(-1.5px);box-shadow:0 6px 16px #5a4fcf73}.btn-app-install-large:active{transform:translateY(0)}.category-item-disabled{padding:5px 10px;font-size:12px;color:#aaa;font-style:italic;-webkit-user-select:none;user-select:none}.saved-card-footer{padding:10px 14px;background:#faf9ff;border-top:1px solid #ebe8f8}.used-in-container{font-size:11.5px;color:#666}.used-in-icon{font-size:15px!important;width:15px!important;height:15px!important;color:#7c6cf0}.used-in-text{line-height:1.4}.used-in-text strong{color:#4b3fc0;font-weight:600}.empty-div{height:calc(70vh + -0px);background:#fff;margin:18px;border-radius:13px}.oops-text{font-weight:900;font-size:42px;background:var(--primary-bg-color);background-clip:text;-webkit-text-fill-color:transparent}.oops-sub-text-1{font-size:17px;font-weight:600;color:#101010e5}.oops-sub-text-2{font-size:14px;font-weight:600;color:#101010e5}.image-container-1{margin-bottom:16px}.empty-img{width:100px;opacity:.85}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;text-align:center;padding:32px 24px}.empty-state img{width:110px;opacity:.8;margin-bottom:4px}.empty-title{font-size:15px;font-weight:700;color:#2d2a4a}.empty-subtitle{font-size:12.5px;color:#aaa;max-width:240px;line-height:1.6}.footer-container{padding:12px 20px;border-top:1px solid #f0eef8;background:#fff;flex-shrink:0;display:flex;align-items:center;justify-content:space-between}.footer-hint{font-size:11.5px;color:#bbb;display:flex;align-items:center;gap:5px}.footer-hint mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#d0cbf0}.footer-actions{display:flex;align-items:center;gap:8px}.btn-cancel{padding:8px 18px;font-size:13px;font-weight:500;border:1.5px solid #e4e0f6;border-radius:9px;background:#fff;color:#666;cursor:pointer;transition:border-color .15s,color .15s,background .15s;-webkit-user-select:none;user-select:none}.btn-cancel:hover{border-color:#b4aae8;color:#4b3fc0;background:#f8f6ff}.btn-add{padding:8px 20px;font-size:13px;font-weight:700;border:none;border-radius:9px;background:var(--primary-bg-color);color:#fff;cursor:pointer;transition:opacity .15s,box-shadow .15s,transform .15s;-webkit-user-select:none;user-select:none;box-shadow:0 3px 10px #7c6cf047}.btn-add:hover:not(.disabled){opacity:.92;transform:translateY(-1px);box-shadow:0 5px 14px #7c6cf05c}.btn-add.disabled{opacity:.38;cursor:not-allowed;box-shadow:none;pointer-events:none}.sidebar-group{margin-bottom:2px}.sidebar-group-icon{font-size:15px;width:20px;text-align:center}.sidebar-group-label{flex:1;font-size:13px}.sidebar-group-header{gap:8px;padding:9px 14px;cursor:pointer;border-radius:0;transition:background .12s;-webkit-user-select:none;user-select:none;font-size:13px;color:#444}.sidebar-group-header:hover{background:#f0f0f0}.sidebar-group-active{background:#ece9fd;color:#4b3fc0;font-weight:600}.sidebar-chevron{font-size:18px;width:18px;height:18px;color:#aaa;transition:transform .2s}.sidebar-chevron.rotated{transform:rotate(180deg)}.subcategory-item{padding:6px 10px 6px 8px;font-size:12px;color:#555;cursor:pointer;border-radius:6px;transition:background .12s;-webkit-user-select:none;user-select:none}.subcategory-item:hover{background:#ece9fd;color:#4b3fc0}.subcategory-active{background:#ece9fd;color:#4b3fc0;font-weight:500}.active-subcategory{background:#7c6cf0!important;color:#fff!important}.sidebar-subcategory{overflow:hidden;animation:dropdownSmooth .25s ease}.fade-in{animation:fadeIn .22s ease}.fade-slide{animation:fadeSlide .25s ease}.stagger-item{opacity:0;transform:translateY(8px);animation:staggerFade .28s ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeSlide{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes staggerFade{to{opacity:1;transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes dropdownSmooth{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes expandFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}::ng-deep .simpo-install-dialog-panel .mat-mdc-dialog-container,::ng-deep .simpo-complete-dialog-panel .mat-mdc-dialog-container{background:transparent!important;box-shadow:none!important;padding:0!important;overflow:visible!important}::ng-deep .simpo-install-dialog-panel .mdc-dialog__surface,::ng-deep .simpo-complete-dialog-panel .mdc-dialog__surface{background:transparent!important;box-shadow:none!important;overflow:visible!important;border-radius:20px!important}.simpo-dialog-container{background:#fff;border-radius:20px;padding:30px;box-shadow:0 20px 50px #4b3fc026;border:1px solid #ebe8f8;overflow:hidden;position:relative;font-family:var(--primary-font-family),sans-serif;color:#1a1733}.simpo-dialog-header{margin-bottom:24px}.simpo-dialog-header h3{font-size:20px;font-weight:700;color:#1a1733;margin:8px 0 4px}.simpo-dialog-header p{font-size:13px;color:#9e9bb5;margin:0;line-height:1.4}.app-icon-badge{font-size:32px;display:inline-block;line-height:1;margin-bottom:12px}.simpo-dialog-progress-bar{height:6px;width:100%;background:#eeecf8;border-radius:10px;overflow:hidden;margin-bottom:24px}.simpo-dialog-progress-fill{height:100%;width:0%;background:linear-gradient(90deg,#7c6cf0,#a08cff);border-radius:10px;transition:width .4s cubic-bezier(.4,0,.2,1);box-shadow:0 0 8px #7c6cf066}.simpo-steps-list{display:flex;flex-direction:column;gap:16px}.step-row{display:flex;align-items:flex-start;gap:16px;transition:all .3s ease}.step-icon-container{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.step-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;transition:all .3s cubic-bezier(.34,1.56,.64,1)}.active-icon{background:#ebe7fc;color:#4b3fc0;border:2px solid #7c6cf0;position:relative;z-index:2;transform:scale(1.1)}.pulse-ring{position:absolute;inset:-4px;border:2px solid #7c6cf0;border-radius:50%;animation:ringPulse 1.8s cubic-bezier(.24,0,.38,1) infinite;opacity:0}@keyframes ringPulse{0%{transform:scale(.9);opacity:.8}50%{opacity:.4}to{transform:scale(1.3);opacity:0}}.success-icon{background:#2ec4b6;color:#fff;border:none;box-shadow:0 4px 10px #2ec4b64d}.success-icon mat-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.animate-success{animation:checkPop .4s cubic-bezier(.34,1.56,.64,1) forwards}.pending-icon{background:#f5f4f8;color:#b0aac8;border:2px solid #eeecf8}.step-number{position:relative;top:-.5px}.step-content{flex:1;display:flex;flex-direction:column;gap:2px}.step-label{font-size:14px;font-weight:600;color:#1a1733;transition:color .3s ease}.step-desc{font-size:11px;color:#7c6cf0;font-weight:500;transition:color .3s ease;animation:fadeSlide .3s ease-out forwards}.dots-pulse:after{content:\"\";display:inline-block;animation:dotsSequence 1.5s infinite}@keyframes dotsSequence{0%{content:\"\"}25%{content:\".\"}50%{content:\"..\"}75%{content:\"...\"}to{content:\"\"}}.step-row.pending .step-label{color:#9e9bb5}.step-row.pending .step-desc{color:#cccad8}.step-row.success .step-label{color:#1a1733}.step-row.success .step-desc{color:#2ec4b6}.complete-dialog-card{border-radius:24px;padding:36px 30px 30px;background:#fff;box-shadow:0 25px 60px #4b3fc02e;border:1px solid #ebe8f8}.complete-header-art{display:flex;justify-content:center;position:relative;margin-bottom:20px}.complete-icon-wrapper{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,#2ec4b6,#0cbaba);display:flex;align-items:center;justify-content:center;box-shadow:0 10px 25px #2ec4b659;position:relative;z-index:2}.complete-icon-wrapper mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.sparkles-container{position:absolute;width:120px;height:80px;top:-10px;pointer-events:none;z-index:1}.sparkle{position:absolute;font-size:20px;animation:bounceSparkle 2s ease infinite}.sparkle.one{top:10px;left:10px;animation-delay:.2s}.sparkle.two{top:0;right:15px;font-size:16px;animation-delay:.7s}.sparkle.three{bottom:10px;right:5px;font-size:22px;animation-delay:1.2s}@keyframes bounceSparkle{0%,to{transform:translateY(0) scale(1);opacity:.8}50%{transform:translateY(-8px) scale(1.15);opacity:1}}.success-badge-text{font-size:10px;font-weight:800;color:#2ec4b6;letter-spacing:1.5px;margin-bottom:8px;text-transform:uppercase}.complete-title{font-size:22px;font-weight:800;color:#1a1733;margin:0 0 12px;letter-spacing:-.2px}.complete-message{font-size:13.5px;color:#5f5c76;line-height:1.6;max-width:380px;margin:0 auto;font-weight:500}.btn-redirect{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 24px;font-size:14px!important;font-weight:700;color:#fff;background-color:#3a0044;border:none;border-radius:12px;cursor:pointer;box-shadow:0 8px 20px #7c6cf04d;transition:all .2s cubic-bezier(.25,.8,.25,1);outline:none;box-sizing:border-box;width:max-content!important}.btn-redirect mat-icon{font-size:18px!important;width:18px!important;height:18px!important;transition:transform .2s ease;display:flex;align-items:center;justify-content:center;color:#fff!important}.btn-redirect:hover mat-icon{transform:translate(3px)}.btn-dismiss{padding:10px 20px;font-size:13px!important;font-weight:600;color:#9e9bb5;background:transparent;border:none;cursor:pointer;transition:color .15s ease;outline:none}.btn-dismiss:hover{color:#4b3fc0}.animate-complete-pop{animation:popupSpring .5s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes popupSpring{0%{opacity:0;transform:scale(.85) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"] }]
|
|
553
|
+
args: [{ selector: 'simpo-add-section', standalone: true, imports: [CommonModule, MatIconModule, NgxSkeletonLoaderModule, FormsModule, MatDialogModule], template: "<!-- <section class=\"main-container\">\n <div class=\"header-container d-flex align-items-center justify-content-between\">\n <div>Select Template</div>\n <mat-icon class=\"d-flex align-items-center justify-content-center f-18 cp\" (click)=\"dialog.close()\">\n close\n </mat-icon>\n </div>\n <div class=\"parent-container\">\n <div class=\"search-bar-container\">\n <div class=\"search-bar d-flex gap-10\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\"\n alt=\"search-bar-icon\">\n <input type=\"text\" placeholder=\"Search for Sections\" [(ngModel)]=\"searchText\" (ngModelChange)=\"searchSections()\">\n </div>\n </div>\n <div class=\"tab-container d-flex justify-content-around align-items-center\">\n <ng-container *ngFor=\"let ele of tabs\">\n <div class=\"tabs\" (click)=\"selectedTab = ele.value\" [class.active-tab]=\"ele.value == selectedTab\">\n {{ele.viewValue}}\n <ng-container *ngIf=\"ele.value == 'PRO' && ele.value != selectedTab\">\n <img class=\"w-30\"\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/468281c1744699664858Frame%201244831740%20%281%29.png\"\n alt=\"pro-icon\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"selectedTab === 'BASIC'; else proTabContent\">\n <ng-container *ngIf=\"!isSearch;else emptyScreen\">\n <div class=\"categories-container d-flex\">\n <div class=\"categories-sidepanel\" *ngIf=\"!loader\">\n <ng-container *ngFor=\"let ele of getObjectKeys(sections)\">\n <div class=\"side-section d-flex justify-content-center align-items-center flex-column\"\n (click)=\"selectSection(ele)\"\n [class.active-section]=\"selectedSection == sections[ele]\">\n <div class=\"image-container\">\n <ng-container *ngIf=\"selectedSection == sections[ele]\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/954383c1741850392802Group%201707481879.png\"\n alt=\"icon text\">\n </ng-container>\n <ng-container *ngIf=\"selectedSection != sections[ele]\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/846145c1741850574864Icon%20%281%29.png\"\n alt=\"icon text\">\n </ng-container>\n </div>\n <div class=\"section-text\">\n {{ele}}\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"categories-render-section\" *ngIf=\" !loader && !tabShiftLoader\">\n <div class=\"categories-head\">\n {{selectedSectionName}}\n </div>\n <div class=\"sub-text\">\n Select a section to add to your page\n </div>\n <div class=\"sections-container\">\n <ng-container *ngFor=\"let ele of selectedSection\">\n <div class=\"section\">\n <div class=\"section-header\">{{ele.sectionName}}</div>\n <div class=\"section-img-container cp\"\n (click)=\"addNewSection(ele.componentId,ele.sectionType,$event)\">\n <ng-container *ngIf=\"ele?.image; else noImage\">\n <img [src]=\"ele?.image\" alt=\"section image\">\n </ng-container>\n <ng-template #noImage>\n <img src=\"https://img.freepik.com/premium-vector/default-image-icon-vector-missing-picture-page-website-design-mobile-app-no-photo-available_87543-11093.jpg\"\n alt=\"section image\" class=\"h-30\">\n </ng-template>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"categories-sidepanel\" *ngIf=\"loader\">\n <ng-container *ngFor=\"let ele of [1,1,1,1,1,1,1,1,1]\">\n <div class=\"d-flex justify-content-center align-items-center flex-column\">\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n height: '8vh',\n width: '65%',\n 'border-radius': '13px',\n 'margin-bottom' : '10px',\n }\" class=\"d-flex justify-content-center w-100\">\n </ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n <div class=\"categories-render-section\" *ngIf=\"loader || tabShiftLoader\">\n <div class=\"categories-head\">\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n width: '20%',\n height : '3vh',\n 'border-radius': '5px',\n }\">\n </ngx-skeleton-loader>\n </div>\n <div class=\"sub-text\">\n <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n width: '60%',\n height : '2vh',\n 'border-radius': '5px',\n }\">\n </ngx-skeleton-loader>\n </div>\n <div class=\"sections-container\">\n <ng-container *ngFor=\"let ele of [1,1,1,1]\">\n <div class=\"section\">\n <div> <ngx-skeleton-loader appearance=\"circle\" [theme]=\"{\n width: '25%',\n height : '2vh',\n 'border-radius': '5px',\n }\">\n </ngx-skeleton-loader></div>\n <div>\n <ngx-skeleton-loader [theme]=\"{\n width: '100%',\n height : '25vh',\n 'border-radius': '5px',\n 'margin':'2px'\n }\">\n </ngx-skeleton-loader>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #proTabContent>\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\n <div class=\"image-container-1\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\n </div>\n <div class=\"oops-text\">\n Coming Soon\n </div>\n <div class=\"oops-sub-text\">\n <div class=\"oops-sub-text-1 text-center\">Woof! Something pawsome is coming!</div>\n <div class=\"oops-sub-text-2 text-center\">\n Hey hooman! I just sniffed out something super exciting... and it\u2019s almost here! \n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #emptyScreen>\n <div class=\"empty-div d-flex align-items-center justify-content-center flex-column\">\n <div class=\"image-container-1\">\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/377076c1743154807683image%20%286%29.png\" alt=\"empty-img\" class=\"empty-img \">\n </div>\n <div class=\"oops-text\">\n Oops! \n </div>\n <div class=\"oops-sub-text\">\n <div class=\"oops-sub-text-1 text-center\">I sniffed everywhere, but I couldn't find what you're looking for</div>\n <div class=\"oops-sub-text-2 text-center\">\n Maybe try a different search? \n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</section> -->\n\n<section class=\"main-container d-flex flex-column\">\n\n <div class=\"header-container fade-in\">\n <div class=\"header-title\">Add a section</div>\n <div class=\"header-subtitle\">Choose a section \u2014 you can reorder or remove it any time.</div>\n <mat-icon class=\"close-btn\" (click)=\"dialog.close()\">close</mat-icon>\n </div>\n\n <div class=\"parent-container d-flex flex-column\">\n\n <!-- Tabs -->\n <div class=\"top-tabs-container d-flex justify-content-between fade-in\">\n <ng-container *ngFor=\"let ele of tabs\">\n <div class=\"top-tab\" (click)=\"onTabSelect(ele.value)\"\n [class.active-top-tab]=\"ele.value == selectedTab\">\n {{ele.viewValue}}\n </div>\n </ng-container>\n </div>\n\n <!-- Search -->\n <div class=\"search-bar-container fade-in\" *ngIf=\"selectedTab != 'SAVED'\">\n <div class=\"search-bar d-flex gap-2 align-items-center\">\n <img\n src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/314661c1741844234442Vector%20%281%29.png\">\n <input type=\"text\" placeholder='Search section...' [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchSections()\">\n </div>\n </div>\n\n <ng-container *ngIf=\"selectedTab === 'BASIC'\">\n\n <ng-container *ngIf=\"!isSearch; else emptyScreen\">\n\n <!-- Quick Add -->\n <!-- <div class=\"quick-add-container fade-in d-flex align-items-center\" *ngIf=\"!loader && !searchText\">\n <div class=\"quick-add-label\">Quick add:</div>\n <div class=\"quick-add-chips d-flex\">\n <ng-container *ngFor=\"let category of getObjectKeys(sections); let i = index\">\n <ng-container *ngIf=\"i < 6\">\n <div class=\"quick-chip stagger-item d-flex align-items-center\"\n (click)=\"selectSection(category); toggleCategory(category)\"\n [class.active-quick-chip]=\"selectedSectionName === category\">\n <span class=\"chip-emoji\">{{getCategoryEmoji(category)}}</span>\n {{getFirstSectionName(category)}}\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div> -->\n\n <!-- CONTENT -->\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!loader\">\n <!-- LEFT -->\n <div class=\"left-sidebar\">\n <!-- <div class=\"category-header d-flex align-items-center\">\n <div class=\"category-icon d-flex align-items-center justify-content-center\">\u2728</div>\n <div class=\"fs-14\">AI Recommended</div>\n </div> -->\n <ng-container *ngFor=\"let category of getObjectKeys(sections)\">\n <div class=\"category-block\">\n <div class=\"category-header d-flex align-items-end justify-content-between\"\n (click)=\"toggleCategory(category)\">\n <div class=\"d-flex gap-2 align-items-center\">\n <span class=\"category-icon\">\n {{getCategoryEmoji(category)}}\n </span>\n <span class=\"fs-13\">\n {{category}}\n </span>\n <span class=\"category-count\">\n ({{sections[category]?.length}})\n </span>\n </div>\n <mat-icon class=\"category-arrow\" *ngIf=\"expandedCategories[category]\">\n expand_less\n </mat-icon>\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedCategories[category]\">\n expand_more\n </mat-icon>\n </div>\n <div class=\"category-items d-flex flex-column\" *ngIf=\"expandedCategories[category]\">\n <ng-container *ngFor=\"let sec of sections[category]\">\n <div class=\"category-item\"\n [class.active]=\"selectedComponent?.componentId === sec.componentId\"\n (click)=\"selectComponent(sec, category)\">\n {{sec.sectionName}}\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"right-content\">\n\n <div class=\"section-group-label\">{{selectedSectionName || 'Sections'}}</div>\n\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedSection && selectedSection.length > 0\">\n\n <ng-container *ngFor=\"let ele of selectedSection; let i = index\">\n\n <div [id]=\"'comp-' + ele.componentId\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\n [class.section-card-selected]=\"selectedComponent?.componentId === ele.componentId\"\n (click)=\"selectComponentAndHighlight(ele)\">\n\n <div class=\"section-card-badge\" *ngIf=\"ele.sectionType\">\n <!-- + {{ele.sectionType | uppercase}} -->\n + {{ele.sectionName | titlecase}}\n </div>\n\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\n <ng-container *ngIf=\"ele?.image; else noImage\">\n <img [src]=\"ele?.image\" alt=\"section preview\">\n </ng-container>\n <ng-template #noImage>\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\n <mat-icon>image</mat-icon>\n </div>\n </ng-template>\n </div>\n\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\n <div>\n <!-- <div class=\"section-card-name\">{{ele.sectionName}}</div> -->\n <div class=\"section-card-desc\" *ngIf=\"ele.desc\">{{ele.desc | titlecase}}</div>\n </div>\n <mat-icon class=\"card-check-icon\"\n *ngIf=\"selectedComponent?.componentId === ele.componentId\">\n check_circle\n </mat-icon>\n </div>\n\n </div>\n\n </ng-container>\n\n </div>\n\n <div class=\"empty-state fade-in\" *ngIf=\"!selectedSection || selectedSection.length === 0\">\n <mat-icon class=\"empty-page-icon\">auto_awesome</mat-icon>\n <div class=\"empty-title\">Select a category</div>\n <div class=\"empty-subtitle\">\n Choose any category from the left sidebar to explore and add sections\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"content-layout d-flex\" *ngIf=\"loader\">\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let s of [1,1,1,1,1,1,1,1]\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '6px' }\"></ngx-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"right-content\">\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\n <div class=\"section-card\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '40%', height: '20px', 'border-radius': '4px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '100%', height: '180px', 'border-radius': '8px', 'margin-bottom': '8px' }\"></ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '60%', height: '16px', 'border-radius': '4px' }\"></ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"selectedTab === 'SAVED'\">\n <!-- Loader skeleton -->\n <div class=\"content-layout d-flex\" *ngIf=\"savedLoader\">\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let s of [1,1,1,1,1]\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"right-content\">\n <ng-container *ngFor=\"let s of [1,1,1]\">\n <div class=\"section-card\" style=\"margin-bottom:12px\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '60%', height: '14px', 'border-radius': '4px' }\">\n </ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Loaded: categories + right component card preview -->\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!savedLoader && savedCategoryKeys.length > 0\">\n\n <!-- LEFT: component categories list -->\n <div class=\"left-sidebar\">\n <div class=\"saved-pages-label\">Saved Sections</div>\n <ng-container *ngFor=\"let catKey of savedCategoryKeys\">\n <div class=\"saved-page-item\"\n [class.active]=\"selectedSavedCategory === catKey\"\n (click)=\"selectSavedCategory(catKey)\">\n <mat-icon class=\"saved-page-icon\">article</mat-icon>\n <span class=\"saved-page-name\">{{catKey}}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"right-content\">\n <div class=\"section-group-label\">Component Preview</div>\n\n <div class=\"sections-list d-flex flex-column\" *ngIf=\"savedSections[selectedSavedCategory]\">\n <div class=\"section-card fade-in\"\n [class.section-card-selected]=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\"\n (click)=\"selectSavedComponent(savedSections[selectedSavedCategory].component)\">\n\n <!-- Section type badge -->\n <div class=\"section-card-badge\" *ngIf=\"savedSections[selectedSavedCategory].component?.sectionType\">\n {{savedSections[selectedSavedCategory].component.sectionType.split('_').join(' ') | titlecase}}\n </div>\n\n <!-- Preview area (Show image if present, fallback to placeholder) -->\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\n <ng-container *ngIf=\"savedSections[selectedSavedCategory].component?.styles?.background?.image && savedSections[selectedSavedCategory].component?.styles?.background?.showImage; else savedNoImage\">\n <img [src]=\"savedSections[selectedSavedCategory].component.styles.background.image\" alt=\"section preview\">\n </ng-container>\n <ng-template #savedNoImage>\n <div class=\"saved-preview-placeholder d-flex flex-column align-items-center justify-content-center\">\n <mat-icon>layers</mat-icon>\n <span>{{savedSections[selectedSavedCategory].component?.sectionType?.split('_')?.join(' ') || 'Saved Component'}}</span>\n </div>\n </ng-template>\n </div>\n\n <!-- Card info -->\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\n <div>\n <div class=\"section-card-name\">{{savedSections[selectedSavedCategory].component?.sectionName}}</div>\n <div class=\"section-card-desc\" *ngIf=\"savedSections[selectedSavedCategory].component?.desc\">\n {{savedSections[selectedSavedCategory].component.desc}}\n </div>\n </div>\n <mat-icon class=\"card-check-icon\"\n *ngIf=\"selectedSavedComponent?.id === savedSections[selectedSavedCategory].component?.id\">\n check_circle\n </mat-icon>\n </div>\n\n <!-- Used In footer -->\n <div class=\"saved-card-footer\" *ngIf=\"savedSections[selectedSavedCategory].usedIn\">\n <div class=\"used-in-container d-flex align-items-center gap-2\">\n <mat-icon class=\"used-in-icon\">web</mat-icon>\n <span class=\"used-in-text\">\n <strong>Used In ({{savedSections[selectedSavedCategory].usedIn.length}} Pages):</strong> \n {{savedSections[selectedSavedCategory].usedIn.join(', ')}}\n </span>\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n </div>\n\n <!-- Empty: no saved data at all -->\n <div class=\"empty-state fade-in\" *ngIf=\"!savedLoader && savedCategoryKeys.length === 0\">\n <img src=\"https://cdn-icons-png.flaticon.com/512/4076/4076549.png\" alt=\"empty\">\n <div class=\"empty-title\">No saved sections</div>\n <div class=\"empty-subtitle\">Sections you save from pages will appear here</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"selectedTab === 'APPS'\">\n \n <!-- Skeleton Loader during API load -->\n <div class=\"content-layout d-flex\" *ngIf=\"appsLoader\">\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let s of [1,1,1,1]\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '90%', height: '36px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"right-content\">\n <ng-container *ngFor=\"let s of [1,1,1]\">\n <div class=\"section-card\" style=\"margin-bottom:12px\">\n <ngx-skeleton-loader\n [theme]=\"{ width: '40%', height: '18px', 'border-radius': '4px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n <ngx-skeleton-loader\n [theme]=\"{ width: '100%', height: '100px', 'border-radius': '8px', 'margin-bottom': '8px' }\">\n </ngx-skeleton-loader>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Loaded apps list and preview boards -->\n <div class=\"content-layout fade-in d-flex\" *ngIf=\"!appsLoader && appsList.length > 0\">\n <!-- LEFT SIDEBAR -->\n <div class=\"left-sidebar\">\n <ng-container *ngFor=\"let app of appsList\">\n <div class=\"category-block\">\n <!-- App Header Row -->\n <div class=\"category-header d-flex align-items-center justify-content-between\"\n (click)=\"toggleAppCategory(app.appName)\">\n \n <div class=\"d-flex gap-2 align-items-center\" style=\"min-width: 0; flex: 1;\">\n <span class=\"category-icon\">{{appIconMap[app.appName] || '\uD83D\uDCE6'}}</span>\n <span class=\"fs-13 fw-semibold\" style=\"text-overflow: ellipsis; overflow: hidden; white-space: nowrap; min-width: 0; flex: 1;\">\n {{app.appName}}\n </span>\n <!-- Compact active green status dot for installed -->\n <span class=\"app-dot-installed\" *ngIf=\"app.appInstalled\" title=\"Installed\"></span>\n </div>\n\n <div class=\"d-flex align-items-center gap-1\">\n <!-- Install Button if not installed -->\n <button class=\"btn-app-install-small\" *ngIf=\"!app.appInstalled\"\n (click)=\"installApp(app, $event)\">\n Install\n </button>\n \n <mat-icon class=\"category-arrow\" *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\n expand_less\n </mat-icon>\n <mat-icon class=\"category-arrow\" *ngIf=\"!expandedApps[app.appName] && app.appInstalled\">\n expand_more\n </mat-icon>\n </div>\n\n </div>\n \n <!-- Subcomponents list under installed app -->\n <div class=\"category-items d-flex flex-column animate-dropdown\" \n *ngIf=\"expandedApps[app.appName] && app.appInstalled\">\n <ng-container *ngIf=\"app.components?.length > 0; else noAppSecs\">\n <ng-container *ngFor=\"let sec of app.components\">\n <div class=\"category-item\"\n [class.active]=\"sec?.data?.componentId != null && selectedAppComponent?.componentId === sec?.data?.componentId\"\n (click)=\"selectAppComponent(sec.data, app.appName)\">\n <!-- {{sec.data.sectionName}} -->\n {{ sec?.data?.sectionName || 'No Component' }}\n </div>\n </ng-container>\n </ng-container>\n <ng-template #noAppSecs>\n <div class=\"category-item-disabled\">\n No sections available\n </div>\n </ng-template>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- RIGHT CONTENT PREVIEW -->\n <div class=\"right-content\">\n \n <!-- IF AN APP IS SELECTED -->\n <ng-container *ngIf=\"selectedApp\">\n \n <!-- INSTALLED APP SECTIONS LIST -->\n <ng-container *ngIf=\"getSelectedAppObj() as activeApp\">\n <ng-container *ngIf=\"activeApp.appInstalled\">\n <div class=\"section-group-label\">{{selectedApp}} Sections</div>\n \n <div class=\"sections-list d-flex flex-column\" *ngIf=\"selectedAppSections.length > 0\">\n <ng-container *ngFor=\"let ele of selectedAppSections; let i = index\">\n \n <div [id]=\"'app-comp-' + ele?.data?.componentId != null\" class=\"section-card stagger-item\" [style.animation-delay]=\"i * 40 + 'ms'\"\n [class.section-card-selected]=\"ele?.data?.componentId != null && selectedAppComponent?.componentId === ele.data.componentId\"\n (click)=\"selectAppComponentAndHighlight(ele.data)\">\n\n <!-- Badge showing component section name -->\n <div class=\"section-card-badge\" *ngIf=\"ele?.data?.sectionType\">\n + {{(ele?.data?.sectionName | titlecase) || \"No Component\"}}\n </div>\n\n <!-- Image Preview Area -->\n <div class=\"section-img-container d-flex align-items-center justify-content-center\">\n <ng-container *ngIf=\"ele?.data?.image; else noImage\">\n <img [src]=\"ele.data.image\" alt=\"section preview\">\n </ng-container>\n <ng-template #noImage>\n <div class=\"no-image-placeholder d-flex align-items-center justify-content-center\">\n <mat-icon>image</mat-icon>\n </div>\n </ng-template>\n </div>\n\n <!-- Card Info (Description and Tags) -->\n <div class=\"section-card-info d-flex align-items-center justify-content-between\">\n <div style=\"min-width: 0; flex: 1; padding-right: 8px;\">\n <div class=\"section-card-desc\" *ngIf=\"ele?.data?.desc\" style=\"margin-bottom: 6px;\">{{ele.data.desc}}</div>\n <!-- Tags array rendering -->\n <div class=\"d-flex flex-wrap gap-1\" *ngIf=\"ele?.data?.tags?.length > 0\">\n <span class=\"app-badge\" style=\"background: #eef2ff; color: #4f46e5; margin: 0; font-size: 8.5px;\" *ngFor=\"let tag of ele.data.tags\">\n {{tag}}\n </span>\n </div>\n </div>\n <mat-icon class=\"card-check-icon\"\n *ngIf=\"ele?.data != null && selectedAppComponent?.componentId === ele.data.componentId\">\n check_circle\n </mat-icon>\n </div>\n\n </div>\n \n </ng-container>\n </div>\n \n <!-- No sections empty state inside right panel -->\n <div class=\"empty-state fade-in\" *ngIf=\"selectedAppSections.length === 0\">\n <mat-icon class=\"empty-page-icon\">inbox</mat-icon>\n <div class=\"empty-title\">No sections available</div>\n <div class=\"empty-subtitle\">This app does not provide any pre-built sections at the moment</div>\n </div>\n </ng-container>\n\n <!-- NOT INSTALLED EMPTY STATE -->\n <ng-container *ngIf=\"!activeApp.appInstalled\">\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\n <mat-icon class=\"empty-page-icon\" style=\"font-size: 56px !important; width: 56px !important; height: 56px !important; color: #7c6cf0; opacity: 0.8;\">\n get_app\n </mat-icon>\n <div class=\"empty-title\" style=\"font-size: 16px; margin-top: 12px;\">Please install to view sections</div>\n <div class=\"empty-subtitle\" style=\"margin-bottom: 16px; max-width: 280px; text-align: center;\">\n Install the {{selectedApp}} plugin to unlock premium, pre-built sections for your website.\n </div>\n <button class=\"btn-app-install-large\" (click)=\"installApp(activeApp, $event)\">\n \u26A1 Install {{selectedApp}} App\n </button>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-container>\n\n <!-- NO ACTIVE APP SELECTED (FALLBACK) -->\n <ng-container *ngIf=\"!selectedApp\">\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\" style=\"height: 100%;\">\n <mat-icon class=\"empty-page-icon\">apps</mat-icon>\n <div class=\"empty-title\">Explore Plugins & Apps</div>\n <div class=\"empty-subtitle\" style=\"max-width: 260px;\">\n Select any application from the left sidebar to browse and configure its custom layout components.\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </ng-container>\n\n\n <!-- EMPTY SEARCH -->\n <ng-template #emptyScreen>\n <div class=\"empty-state fade-in d-flex flex-column align-items-center justify-content-center\">\n <img src=\"https://cdn-icons-png.flaticon.com/512/7486/7486803.png\">\n <div class=\"empty-title\">No sections found</div>\n <div class=\"empty-subtitle\">\n Try searching something else or explore categories\n </div>\n </div>\n </ng-template>\n\n </div>\n\n <!-- Footer -->\n <div class=\"footer-container fade-in\">\n <div class=\"footer-hint\">\n <mat-icon>info_outline</mat-icon>\n You can rearrange or remove this section any time.\n </div>\n <div class=\"footer-actions\">\n <div class=\"btn-cancel\" (click)=\"dialog.close()\">Cancel</div>\n <div class=\"btn-add\"\n [class.disabled]=\"selectedTab === 'BASIC' ? !selectedComponent : (selectedTab === 'APPS' ? !selectedAppComponent : !selectedSavedComponent)\"\n (click)=\"handleAddSection($event)\">\n + Add section\n </div>\n </div>\n </div>\n\n</section>\n\n<!-- Beautiful Installation Progress Dialog Template -->\n<ng-template #installProgressTemplate>\n <div class=\"simpo-dialog-container animate-complete-pop\">\n <div class=\"simpo-dialog-header\">\n <div class=\"app-icon-badge\">{{ appIconMap[installingApp?.appName] || '\uD83D\uDD0C' }}</div>\n <h3>Setting Up {{ installingApp?.appName }} App</h3>\n <p>Please wait while we configure your premium scheduling system.</p>\n </div>\n\n <div class=\"simpo-dialog-body\">\n <!-- Animated Progress Bar -->\n <div class=\"simpo-dialog-progress-bar\">\n <div class=\"simpo-dialog-progress-fill\" [style.width]=\"getOverallProgressPercent() + '%'\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"simpo-steps-list\">\n <div class=\"step-row\" *ngFor=\"let step of installSteps; let idx = index\" [ngClass]=\"step?.status || ''\">\n <div class=\"step-icon-container\">\n <!-- Active Step Icon (Pulsing glowing dot) -->\n <div class=\"step-icon active-icon\" *ngIf=\"step?.status === 'active'\">\n <span class=\"step-number\">{{ idx + 1 }}</span>\n <div class=\"pulse-ring\"></div>\n </div>\n\n <!-- Success Step Icon (Green checkmark with spring-up animation) -->\n <div class=\"step-icon success-icon animate-success\" *ngIf=\"step?.status === 'success'\">\n <mat-icon>check</mat-icon>\n </div>\n\n <!-- Pending Step Icon (Dimmed simple number/dot) -->\n <div class=\"step-icon pending-icon\" *ngIf=\"step?.status === 'pending'\">\n <span class=\"step-number\">{{ idx + 1 }}</span>\n </div>\n </div>\n\n <div class=\"step-content\">\n <div class=\"step-label\">{{ step?.label || '' }}</div>\n <div class=\"step-desc\" *ngIf=\"step?.status === 'active'\">Processing, please wait<span class=\"dots-pulse\"></span></div>\n <div class=\"step-desc success-desc\" *ngIf=\"step?.status === 'success'\">Completed successfully</div>\n <div class=\"step-desc pending-desc\" *ngIf=\"step?.status === 'pending'\">Upcoming...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Beautiful Installation Complete Dialog Template -->\n<ng-template #installCompleteTemplate>\n <div class=\"simpo-dialog-container complete-dialog-card animate-complete-pop\">\n <div class=\"complete-header-art\">\n <div class=\"sparkles-container\">\n <span class=\"sparkle one\">\u2728</span>\n <span class=\"sparkle two\">\u2728</span>\n <span class=\"sparkle three\">\uD83C\uDF89</span>\n </div>\n <div class=\"complete-icon-wrapper\">\n <mat-icon>verified</mat-icon>\n </div>\n </div>\n\n <div class=\"simpo-dialog-header text-center\">\n <div class=\"success-badge-text\">INSTALLATION COMPLETED</div>\n <h3 class=\"complete-title\">Your Appointment App is Ready!</h3>\n <p class=\"complete-message\">\n For better experience create service and assign staff to created service\n </p>\n </div>\n\n <div class=\"simpo-dialog-body text-center d-flex flex-column align-items-center gap-3\">\n <!-- Directing Action Button -->\n <button class=\"btn-redirect w-100\" (click)=\"redirectToAppointments()\">\n <span>Create Service & Assign Staff</span>\n <mat-icon>arrow_forward</mat-icon>\n </button>\n\n <!-- Dismiss button -->\n <button class=\"btn-dismiss\" (click)=\"closeAllDialogs()\">\n Maybe Later\n </button>\n </div>\n </div>\n</ng-template>", styles: ["*{font-family:var(--primary-font-family);box-sizing:border-box}mat-icon{font-family:Material Icons!important}.gap-10{gap:10px!important}.f-18{font-size:18px;cursor:pointer}.w-30{width:30px!important}.h-30{height:30vh}.cp{cursor:pointer}.fs-14{font-size:14px}.fs-12{font-size:12px}.fs-16{font-size:16px}.fw-bold{font-weight:700}.main-container{height:100vh;background:#fff;border-radius:16px;overflow:hidden;display:flex;flex-direction:column}.header-container{position:relative;padding:16px 20px 14px;background:#fff;border-bottom:1px solid #f0eef8}.header-title{font-size:16px;font-weight:700;color:#1a1733;line-height:1.4}.header-subtitle{font-size:12px;color:#9e9bb5;margin-top:2px}.close-btn{position:absolute;top:50%;right:18px;transform:translateY(-50%);cursor:pointer;color:#aaa;font-size:20px!important;width:30px!important;height:30px!important;border-radius:8px;transition:background .15s,color .15s;display:flex;align-items:center;justify-content:center}.close-btn:hover{background:#f0eeff;color:#5a4fcf}.parent-container{flex:1;overflow:hidden;background:#f9f8fd;display:flex;flex-direction:column;padding:0}.tab-container{padding:8px;margin:0 15px;gap:3%;background:#fff;border-radius:13px}.tabs{font-size:14px;font-weight:500;line-height:24px;color:#2c2c2c99;width:30%;cursor:pointer;padding:8px 0;text-align:center}.active-tab{color:#fff!important;background:var(--primary-bg-color);box-shadow:0 0 4px #00000040;border-radius:8px;transition:opacity .3s ease-in-out,transform .3s ease-in-out;opacity:1;transform:translateY(0)}.top-tabs-container{margin:12px 16px 0;background:#eeecf8;border-radius:12px;padding:4px;display:flex;gap:2px;flex-shrink:0}.top-tab{flex:1;text-align:center;padding:7px 12px;font-size:12.5px;font-weight:500;color:#888;cursor:pointer;border-radius:9px;transition:all .18s ease;-webkit-user-select:none;user-select:none;white-space:nowrap}.top-tab:hover:not(.active-top-tab){color:#555;background:#ffffff8c}.active-top-tab{background:#fff;color:#4b3fc0;font-weight:700;box-shadow:0 1px 6px #4b3fc021}.search-bar-container{padding:10px 16px 8px;flex-shrink:0}.search-bar{background:#fff;border:1.5px solid #e6e2f6;border-radius:10px;padding:8px 12px;display:flex;align-items:center;gap:8px;transition:border-color .18s,box-shadow .18s}.search-bar:focus-within{border-color:var(--primary-bg-color);box-shadow:0 0 0 3px #7c6cf01a}.search-bar img{width:15px;height:15px;opacity:.45;flex-shrink:0}.search-bar input{border:none;outline:none;background:transparent;font-size:13px;color:#333;width:100%}.search-bar input::placeholder{color:#bbb}.content-layout{flex:1;overflow:hidden;border-top:1px solid #f0eef8;display:flex;min-height:0}.categories-sidepanel{width:15%;padding:10px 5px;margin:15px 0;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.side-section{padding:6px 10px;border-radius:8px;margin-bottom:10px;cursor:pointer}.side-section img{width:16px}.side-section .image-container{background:#f9fafb;padding:5px 8px;border-radius:5px}.side-section .section-text{font-size:12px;font-weight:500;line-height:24px;text-align:center;color:#a1a1a1}.active-section{background:var(--primary-bg-color)!important;box-shadow:0 0 4px #00000040}.active-section .section-text{color:#fff!important}.active-section .image-container{background:unset!important;padding:unset!important;border-radius:unset!important}.left-sidebar{width:210px;min-width:210px;background:#fff;padding:12px 8px;overflow-y:auto;border-right:1px solid #f0eef8;height:100%}.left-sidebar::-webkit-scrollbar{width:3px}.left-sidebar::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.category-block{margin-bottom:2px}.category-header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 10px;cursor:pointer;border-radius:9px;transition:background .15s;-webkit-user-select:none;user-select:none;white-space:nowrap!important}.category-header:hover{background:#f3f0fd}.category-icon{font-size:15px;width:20px;text-align:center;flex-shrink:0;line-height:1}.fs-13{font-size:13px}.category-count{font-size:11px;font-weight:500;color:#bbb;position:relative;top:1px}.category-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#ccc;transition:transform .22s ease,color .15s;flex-shrink:0}.category-block:has(.category-items) .category-arrow{color:#7c6cf0}.category-items{padding:2px 4px 4px 28px;display:flex;flex-direction:column;gap:1px;animation:dropdownFade .2s ease}.category-item{padding:5px 10px;font-size:12px;color:#555;cursor:pointer;border-radius:7px;transition:background .13s,color .13s;-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-item:hover{background:#f0eeff;color:#4b3fc0}.category-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.categories-render-section{width:85%;padding:15px;margin:15px 10px;border-radius:10px;height:calc(70vh + -0px);overflow-y:scroll;background:#fff}.categories-head{font-size:20px;font-weight:600;line-height:24px;color:#434343}.sub-text{font-size:13px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.section{margin-bottom:10px}.section-header{font-size:14px;font-weight:500;line-height:24px;color:#a1a1a1;margin-bottom:10px}.right-content{flex:1;overflow-y:auto;padding:14px 14px 14px 12px;height:100%;min-width:0}.right-content::-webkit-scrollbar{width:4px}.right-content::-webkit-scrollbar-thumb{background:#ddd8f5;border-radius:4px}.section-group-label{font-size:12px;font-weight:700;letter-spacing:.4px;color:#9e9bb5;margin-bottom:12px;text-transform:uppercase}.sections-list{display:flex;flex-direction:column;gap:12px}.section-card{border:1.5px solid #ebe8f8;border-radius:12px;overflow:hidden;cursor:pointer;background:#fff;transition:all .2s ease}.section-card:hover{border-color:#c4baf0;box-shadow:0 4px 16px #7c6cf01a;transform:translateY(-1px)}.section-card-preview{cursor:default!important;pointer-events:none}.section-card-preview:hover{border-color:#ebe8f8!important;box-shadow:none!important;transform:none!important}.section-card-selected{border-color:#7c6cf0!important;box-shadow:0 0 0 3px #7c6cf024!important}.section-card-badge{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.5px;color:#5a4fcf;background:#edeafc;padding:3px 10px;margin:10px 10px 6px;border-radius:20px}.section-img-container{width:100%;overflow:hidden;background:#f5f3fc;display:flex;align-items:center;justify-content:center;max-height:200px;min-height:100px}.section-img-container img{width:100%;display:block;object-fit:cover;transition:transform .25s ease}.section-card:hover .section-img-container img{transform:scale(1.03)}.no-image-placeholder{height:130px;display:flex;align-items:center;justify-content:center;color:#d5d0ee}.no-image-placeholder mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#d5d0ee}.section-card-info{padding:10px 14px 12px}.section-card-name{font-size:13px;font-weight:600;color:#1a1733;margin-bottom:3px}.section-card-desc{font-size:12px;color:#9e9bb5;line-height:1.5}.card-check-icon{font-size:20px!important;width:20px!important;height:20px!important;color:#7c6cf0;flex-shrink:0;animation:checkPop .22s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes checkPop{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.quick-add-container{padding:4px 24px 10px;gap:10px;flex-wrap:wrap;flex-shrink:0}.quick-add-label{font-size:12px;color:#888;white-space:nowrap}.quick-add-chips{gap:6px;width:100%;overflow-y:scroll;white-space:nowrap}.quick-chip{gap:5px;padding:4px 10px;font-size:12px;border:1.5px solid #e0e0e0;border-radius:20px;cursor:pointer;color:#333;background:#fff;transition:all .2s ease;-webkit-user-select:none;user-select:none}.quick-chip.active-quick-chip{border-color:#7c6cf0;color:#4b3fc0;font-weight:500}.chip-emoji{font-size:14px}.saved-pages-label{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#bbb;padding:0 10px;margin-bottom:10px}.saved-page-item{display:flex;align-items:center;gap:7px;padding:7px 10px;cursor:pointer;border-radius:9px;font-size:13px;font-weight:500;color:#666;transition:background .15s,color .15s;-webkit-user-select:none;user-select:none;margin-bottom:2px;overflow:hidden}.saved-page-item:hover{background:#f0eeff;color:#4b3fc0}.saved-page-item.active{background:#ebe7fc;color:#4b3fc0;font-weight:600}.saved-page-icon{font-size:15px!important;width:15px!important;height:15px!important;color:inherit;flex-shrink:0}.saved-page-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.saved-preview-placeholder{height:100px;width:100%;background:#f5f3fc;gap:6px}.saved-preview-placeholder mat-icon{font-size:28px!important;width:28px!important;height:28px!important;color:#c8c2ee}.saved-preview-placeholder span{font-size:11px;color:#b0aac8;text-transform:capitalize}.empty-page-icon{font-size:40px!important;width:40px!important;height:40px!important;color:#d5d0ee;margin-bottom:4px}.app-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:20px;letter-spacing:.3px;text-transform:uppercase;margin-left:6px}.app-dot-installed{width:6px!important;height:6px!important;min-width:6px!important;min-height:6px!important;background:#2ec4b6!important;border-radius:50%!important;display:inline-block!important;flex-shrink:0!important;box-shadow:0 0 0 2px #2ec4b62e!important;margin-left:4px!important}.badge-installed{background:#e2fbe8;color:#1b8a3e}.btn-app-install-small{padding:3px 10px!important;font-size:10px!important;font-weight:700!important;color:#7c6cf0!important;background:#f1efff!important;border:1px solid #7c6cf0!important;border-radius:6px!important;cursor:pointer!important;transition:all .15s ease!important;outline:none!important;height:22px!important;min-height:22px!important;max-height:22px!important;min-width:unset!important;max-width:unset!important;line-height:14px!important;box-sizing:border-box!important;margin:0!important;display:inline-flex!important;align-items:center!important;justify-content:center!important}.btn-app-install-small:hover{background:#7c6cf0;color:#fff;box-shadow:0 2px 6px #7c6cf033}.btn-app-install-large{padding:8px 18px;font-size:12px;font-weight:700;color:#fff;background:linear-gradient(135deg,#7c6cf0,#5a4fcf);border:none;border-radius:9px;cursor:pointer;box-shadow:0 4px 12px #5a4fcf4d;transition:all .18s ease;outline:none}.btn-app-install-large:hover{transform:translateY(-1.5px);box-shadow:0 6px 16px #5a4fcf73}.btn-app-install-large:active{transform:translateY(0)}.category-item-disabled{padding:5px 10px;font-size:12px;color:#aaa;font-style:italic;-webkit-user-select:none;user-select:none}.saved-card-footer{padding:10px 14px;background:#faf9ff;border-top:1px solid #ebe8f8}.used-in-container{font-size:11.5px;color:#666}.used-in-icon{font-size:15px!important;width:15px!important;height:15px!important;color:#7c6cf0}.used-in-text{line-height:1.4}.used-in-text strong{color:#4b3fc0;font-weight:600}.empty-div{height:calc(70vh + -0px);background:#fff;margin:18px;border-radius:13px}.oops-text{font-weight:900;font-size:42px;background:var(--primary-bg-color);background-clip:text;-webkit-text-fill-color:transparent}.oops-sub-text-1{font-size:17px;font-weight:600;color:#101010e5}.oops-sub-text-2{font-size:14px;font-weight:600;color:#101010e5}.image-container-1{margin-bottom:16px}.empty-img{width:100px;opacity:.85}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;text-align:center;padding:32px 24px}.empty-state img{width:110px;opacity:.8;margin-bottom:4px}.empty-title{font-size:15px;font-weight:700;color:#2d2a4a}.empty-subtitle{font-size:12.5px;color:#aaa;max-width:240px;line-height:1.6}.footer-container{padding:12px 20px;border-top:1px solid #f0eef8;background:#fff;flex-shrink:0;display:flex;align-items:center;justify-content:space-between}.footer-hint{font-size:11.5px;color:#bbb;display:flex;align-items:center;gap:5px}.footer-hint mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#d0cbf0}.footer-actions{display:flex;align-items:center;gap:8px}.btn-cancel{padding:8px 18px;font-size:13px;font-weight:500;border:1.5px solid #e4e0f6;border-radius:9px;background:#fff;color:#666;cursor:pointer;transition:border-color .15s,color .15s,background .15s;-webkit-user-select:none;user-select:none}.btn-cancel:hover{border-color:#b4aae8;color:#4b3fc0;background:#f8f6ff}.btn-add{padding:8px 20px;font-size:13px;font-weight:700;border:none;border-radius:9px;background:var(--primary-bg-color);color:#fff;cursor:pointer;transition:opacity .15s,box-shadow .15s,transform .15s;-webkit-user-select:none;user-select:none;box-shadow:0 3px 10px #7c6cf047}.btn-add:hover:not(.disabled){opacity:.92;transform:translateY(-1px);box-shadow:0 5px 14px #7c6cf05c}.btn-add.disabled{opacity:.38;cursor:not-allowed;box-shadow:none;pointer-events:none}.sidebar-group{margin-bottom:2px}.sidebar-group-icon{font-size:15px;width:20px;text-align:center}.sidebar-group-label{flex:1;font-size:13px}.sidebar-group-header{gap:8px;padding:9px 14px;cursor:pointer;border-radius:0;transition:background .12s;-webkit-user-select:none;user-select:none;font-size:13px;color:#444}.sidebar-group-header:hover{background:#f0f0f0}.sidebar-group-active{background:#ece9fd;color:#4b3fc0;font-weight:600}.sidebar-chevron{font-size:18px;width:18px;height:18px;color:#aaa;transition:transform .2s}.sidebar-chevron.rotated{transform:rotate(180deg)}.subcategory-item{padding:6px 10px 6px 8px;font-size:12px;color:#555;cursor:pointer;border-radius:6px;transition:background .12s;-webkit-user-select:none;user-select:none}.subcategory-item:hover{background:#ece9fd;color:#4b3fc0}.subcategory-active{background:#ece9fd;color:#4b3fc0;font-weight:500}.active-subcategory{background:#7c6cf0!important;color:#fff!important}.sidebar-subcategory{overflow:hidden;animation:dropdownSmooth .25s ease}.fade-in{animation:fadeIn .22s ease}.fade-slide{animation:fadeSlide .25s ease}.stagger-item{opacity:0;transform:translateY(8px);animation:staggerFade .28s ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeSlide{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes staggerFade{to{opacity:1;transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes dropdownSmooth{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes expandFade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}::ng-deep .simpo-install-dialog-panel .mat-mdc-dialog-container,::ng-deep .simpo-complete-dialog-panel .mat-mdc-dialog-container{background:transparent!important;box-shadow:none!important;padding:0!important;overflow:visible!important}::ng-deep .simpo-install-dialog-panel .mdc-dialog__surface,::ng-deep .simpo-complete-dialog-panel .mdc-dialog__surface{background:transparent!important;box-shadow:none!important;overflow:visible!important;border-radius:20px!important}.simpo-dialog-container{background:#fff;border-radius:20px;padding:30px;box-shadow:0 20px 50px #4b3fc026;border:1px solid #ebe8f8;overflow:hidden;position:relative;font-family:var(--primary-font-family),sans-serif;color:#1a1733}.simpo-dialog-header{margin-bottom:24px}.simpo-dialog-header h3{font-size:20px;font-weight:700;color:#1a1733;margin:8px 0 4px}.simpo-dialog-header p{font-size:13px;color:#9e9bb5;margin:0;line-height:1.4}.app-icon-badge{font-size:32px;display:inline-block;line-height:1;margin-bottom:12px}.simpo-dialog-progress-bar{height:6px;width:100%;background:#eeecf8;border-radius:10px;overflow:hidden;margin-bottom:24px}.simpo-dialog-progress-fill{height:100%;width:0%;background:linear-gradient(90deg,#7c6cf0,#a08cff);border-radius:10px;transition:width .4s cubic-bezier(.4,0,.2,1);box-shadow:0 0 8px #7c6cf066}.simpo-steps-list{display:flex;flex-direction:column;gap:16px}.step-row{display:flex;align-items:flex-start;gap:16px;transition:all .3s ease}.step-icon-container{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.step-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;transition:all .3s cubic-bezier(.34,1.56,.64,1)}.active-icon{background:#ebe7fc;color:#4b3fc0;border:2px solid #7c6cf0;position:relative;z-index:2;transform:scale(1.1)}.pulse-ring{position:absolute;inset:-4px;border:2px solid #7c6cf0;border-radius:50%;animation:ringPulse 1.8s cubic-bezier(.24,0,.38,1) infinite;opacity:0}@keyframes ringPulse{0%{transform:scale(.9);opacity:.8}50%{opacity:.4}to{transform:scale(1.3);opacity:0}}.success-icon{background:#2ec4b6;color:#fff;border:none;box-shadow:0 4px 10px #2ec4b64d}.success-icon mat-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.animate-success{animation:checkPop .4s cubic-bezier(.34,1.56,.64,1) forwards}.pending-icon{background:#f5f4f8;color:#b0aac8;border:2px solid #eeecf8}.step-number{position:relative;top:-.5px}.step-content{flex:1;display:flex;flex-direction:column;gap:2px}.step-label{font-size:14px;font-weight:600;color:#1a1733;transition:color .3s ease}.step-desc{font-size:11px;color:#7c6cf0;font-weight:500;transition:color .3s ease;animation:fadeSlide .3s ease-out forwards}.dots-pulse:after{content:\"\";display:inline-block;animation:dotsSequence 1.5s infinite}@keyframes dotsSequence{0%{content:\"\"}25%{content:\".\"}50%{content:\"..\"}75%{content:\"...\"}to{content:\"\"}}.step-row.pending .step-label{color:#9e9bb5}.step-row.pending .step-desc{color:#cccad8}.step-row.success .step-label{color:#1a1733}.step-row.success .step-desc{color:#2ec4b6}.complete-dialog-card{border-radius:24px;padding:36px 30px 30px;background:#fff;box-shadow:0 25px 60px #4b3fc02e;border:1px solid #ebe8f8}.complete-header-art{display:flex;justify-content:center;position:relative;margin-bottom:20px}.complete-icon-wrapper{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,#2ec4b6,#0cbaba);display:flex;align-items:center;justify-content:center;box-shadow:0 10px 25px #2ec4b659;position:relative;z-index:2}.complete-icon-wrapper mat-icon{font-size:38px!important;width:38px!important;height:38px!important;color:#fff!important;display:flex;align-items:center;justify-content:center}.sparkles-container{position:absolute;width:120px;height:80px;top:-10px;pointer-events:none;z-index:1}.sparkle{position:absolute;font-size:20px;animation:bounceSparkle 2s ease infinite}.sparkle.one{top:10px;left:10px;animation-delay:.2s}.sparkle.two{top:0;right:15px;font-size:16px;animation-delay:.7s}.sparkle.three{bottom:10px;right:5px;font-size:22px;animation-delay:1.2s}@keyframes bounceSparkle{0%,to{transform:translateY(0) scale(1);opacity:.8}50%{transform:translateY(-8px) scale(1.15);opacity:1}}.success-badge-text{font-size:10px;font-weight:800;color:#2ec4b6;letter-spacing:1.5px;margin-bottom:8px;text-transform:uppercase}.complete-title{font-size:22px;font-weight:800;color:#1a1733;margin:0 0 12px;letter-spacing:-.2px}.complete-message{font-size:13.5px;color:#5f5c76;line-height:1.6;max-width:380px;margin:0 auto;font-weight:500}.btn-redirect{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 24px;font-size:14px!important;font-weight:700;color:#fff;background-color:#3a0044;border:none;border-radius:12px;cursor:pointer;box-shadow:0 8px 20px #7c6cf04d;transition:all .2s cubic-bezier(.25,.8,.25,1);outline:none;box-sizing:border-box;width:max-content!important}.btn-redirect mat-icon{font-size:18px!important;width:18px!important;height:18px!important;transition:transform .2s ease;display:flex;align-items:center;justify-content:center;color:#fff!important}.btn-redirect:hover mat-icon{transform:translate(3px)}.btn-dismiss{padding:10px 20px;font-size:13px!important;font-weight:600;color:#9e9bb5;background:transparent;border:none;cursor:pointer;transition:color .15s ease;outline:none}.btn-dismiss:hover{color:#4b3fc0}.animate-complete-pop{animation:popupSpring .5s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes popupSpring{0%{opacity:0;transform:scale(.85) translateY(20px)}to{opacity:1;transform:scale(1) translateY(0)}}\n"] }]
|
|
554
554
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
555
555
|
type: Inject,
|
|
556
556
|
args: [MAT_DIALOG_DATA]
|
|
@@ -561,4 +561,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
561
561
|
type: ViewChild,
|
|
562
562
|
args: ['installCompleteTemplate']
|
|
563
563
|
}] } });
|
|
564
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXNlY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9hZGQtc2VjdGlvbi9hZGQtc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL2FkZC1zZWN0aW9uL2FkZC1zZWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBWSxTQUFTLEVBQWtDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxlQUFlLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUl2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQWUsV0FBVyxFQUFXLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQVluRSxNQUFNLE9BQU8sbUJBQW1CO0lBYTlCLFlBQW1CLE1BQXlDLEVBQzFCLElBQVMsRUFDakMsSUFBZ0IsRUFDaEIsYUFBNEIsRUFDNUIsYUFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsU0FBb0IsRUFDcEIsTUFBZSxFQUNmLEdBQXNCO1FBVGIsV0FBTSxHQUFOLE1BQU0sQ0FBbUM7UUFDMUIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixtQkFB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LENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDbEIsQ0FBQzsrR0Eva0JVLG1CQUFtQiw4Q0FjcEIsZUFBZTttR0FkZCxtQkFBbUIsc1VDcEJoQyxrbzZDQTB1QmMsMDZuQkQxdEJGLFlBQVksMFpBQUUsYUFBYSxtTEFBRSx1QkFBdUIsOE1BQUUsV0FBVyxpbkJBQUUsZUFBZTs7NEZBSWpGLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDOzswQkFrQjFGLE1BQU07MkJBQUMsZUFBZTs2UUFWYSx1QkFBdUI7c0JBQTVELFNBQVM7dUJBQUMseUJBQXlCO2dCQUNFLHVCQUF1QjtzQkFBNUQsU0FBUzt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgTmdNb2R1bGUsIFZpZXdDaGlsZCwgVGVtcGxhdGVSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2csIE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRWxlbWVudFNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vZWRpdG9yLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE5neFNrZWxldG9uTG9hZGVyTW9kdWxlIH0gZnJvbSAnbmd4LXNrZWxldG9uLWxvYWRlcic7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3Jtc01vZHVsZSwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1hZGQtc2VjdGlvbicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBOZ3hTa2VsZXRvbkxvYWRlck1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdERpYWxvZ01vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1zZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYWRkLXNlY3Rpb24uY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZFNlY3Rpb25Db21wb25lbnQge1xyXG5cclxuICBPYmplY3Q/OiBPYmplY3RcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5zdGFsbFByb2dyZXNzVGVtcGxhdGUnKSBpbnN0YWxsUHJvZ3Jlc3NUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnaW5zdGFsbENvbXBsZXRlVGVtcGxhdGUnKSBpbnN0YWxsQ29tcGxldGVUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIGluc3RhbGxTdGVwcyA9IFtcclxuICAgIHsgbGFiZWw6ICdJbnN0YWxsaW5nIGFwcG9pbnRtZW50IGFwcCcsIHN0YXR1czogJ3BlbmRpbmcnIH0sXHJcbiAgICB7IGxhYmVsOiAnQ3JlYXRpbmcgcmVxdWlyZWQgcGFnZXMgZm9yIHlvdXIgYXBwJywgc3RhdHVzOiAncGVuZGluZycgfSxcclxuICAgIHsgbGFiZWw6ICdDcmVhdGluZyBvbmUgc3RvcmUnLCBzdGF0dXM6ICdwZW5kaW5nJyB9XHJcbiAgXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGRpYWxvZzogTWF0RGlhbG9nUmVmPEFkZFNlY3Rpb25Db21wb25lbnQ+LFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVsZW1lbnRTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50U2VydmljZTogRWxlbWVudFNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgcm91dGVyIDogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgYnVzaW5lc3NUeXBlOiAnU1RBVElDJyB8ICdFX0NPTU1FUkNFJyA9ICdFX0NPTU1FUkNFJztcclxuXHJcbiAgaW5zdGFsbGluZ0FwcDogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8g4pSA4pSAIEFwcHMgdGFiIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4gIGV4cGFuZGVkQXBwczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fSAgICAvLyB0cmFja3Mgd2hpY2ggYXBwIGNhdGVnb3J5IGlzIGV4cGFuZGVkIGluIGxlZnQgc2lkZWJhclxyXG4gIHNlbGVjdGVkQXBwOiBzdHJpbmcgPSBcIlwiICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFja3Mgd2hpY2ggYXBwIGlzIGN1cnJlbnRseSBzZWxlY3RlZC9hY3RpdmVcclxuICBzZWxlY3RlZEFwcFNlY3Rpb25zOiBhbnlbXSA9IFtdICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIHNlY3Rpb25zIG9mIHRoZSBzZWxlY3RlZCBhcHBcclxuICBzZWxlY3RlZEFwcENvbXBvbmVudDogYW55ID0gbnVsbCAgICAgICAgICAgICAgICAgLy8gdHJhY2tzIHdoaWNoIGNvbXBvbmVudCBpbnNpZGUgdGhlIHNlbGVjdGVkIGFwcCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQvaGlnaGxpZ2h0ZWRcclxuXHJcbiAgYXBwSWNvbk1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgIFwiRS1jb21tZXJjZVwiOiBcIvCfm43vuI9cIixcclxuICAgIFwiQXBwb2ludG1lbnRcIjogXCLwn5OFXCIsXHJcbiAgICBcIkNSTVwiOiBcIvCfkaVcIixcclxuICAgIFwiUGFzc0Jvb2tcIjogXCLwn5KzXCIsXHJcbiAgICBcIlBhc3Nib29rXCI6IFwi8J+Ss1wiLFxyXG4gICAgXCJSZWZlciBhbmQgRWFyblwiOiBcIvCfjoFcIlxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zdCBidXNpbmVzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiRGV0YWlscycpIHx8ICcnO1xyXG4gICAgdGhpcy5idXNpbmVzc1R5cGUgPSBidXNpbmVzcyA/IEpTT04ucGFyc2UoYnVzaW5lc3MpPy50eXBlIDogJ1NUQVRJQydcclxuICAgIHRoaXMuZ2V0QWxsU2VjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkVGFiOiBzdHJpbmcgPSBcIkJBU0lDXCJcclxuICBwdWJsaWMgYnVzaW5lc3NJZDogc3RyaW5nIHwgbnVsbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYnVzaW5lc3NJZFwiKTtcclxuICB0YWJzOiBhbnkgPSBbXHJcbiAgICB7IHZhbHVlOiBcIkJBU0lDXCIsIHZpZXdWYWx1ZTogXCJTZWN0aW9uIFN0dWRpb1wiIH0sXHJcbiAgICAvLyB7IHZhbHVlOiBcIklOVEVHUkFUSU9OU1wiLCB2aWV3VmFsdWU6IFwiRHluYW1pY1wiIH0sXHJcbiAgICB7IHZhbHVlOiBcIkFQUFNcIiwgdmlld1ZhbHVlOiBcIkFwcHNcIiB9LFxyXG4gICAgeyB2YWx1ZTogXCJTQVZFRFwiLCB2aWV3VmFsdWU6IFwiU2F2ZWRcIiB9XHJcbiAgXVxyXG5cclxuICBzZWN0aW9uczogYW55ID0gW11cclxuICBzZWxlY3RlZFNlY3Rpb246IGFueSA9IFtdXHJcbiAgc2VsZWN0ZWRTZWN0aW9uTmFtZTogYW55ID0gXCJcIlxyXG4gIGxvYWRlcjogYm9vbGVhbiA9IGZhbHNlXHJcbiAgdGFiU2hpZnRMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIHJlZmVyRWFybkV4aXN0OiBib29sZWFuID0gZmFsc2VcclxuICBleHBhbmRlZENhdGVnb3JpZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cclxuXHJcblxyXG4gIHNlbGVjdGVkQ29tcG9uZW50OiBhbnkgPSBudWxsXHJcblxyXG4gIC8vIOKUgOKUgCBTYXZlZCB0YWIgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgc2F2ZWRTZWN0aW9uczogYW55ID0ge31cclxuICBzYXZlZENhdGVnb3J5S2V5czogc3RyaW5nW10gPSBbXVxyXG4gIHNhdmVkTG9hZGVyOiBib29sZWFuID0gZmFsc2VcclxuICBzZWxlY3RlZFNhdmVkQ2F0ZWdvcnk6IHN0cmluZyA9ICcnXHJcbiAgc2VsZWN0ZWRTYXZlZENvbXBvbmVudDogYW55ID0gbnVsbFxyXG5cclxuICAvLyBOZXc6IGVtb2ppIG1hcCBmb3IgY2F0ZWdvcmllc1xyXG4gIGNhdGVnb3J5RW1vamlNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAvLyAnSGVybyc6ICfwn5a877iPJyxcclxuICAgIC8vICdTZXJ2aWNlcyc6ICfwn46BJyxcclxuICAgIC8vICdGZWF0dXJlJzogJ+KcqCcsXHJcbiAgICAvLyAnSG93IEl0IFdvcmtzJzogJ+KEue+4jycsXHJcbiAgICAvLyAnVGVzdGltb25pYWwnOiAn4q2QJyxcclxuICAgIC8vICdQcmljaW5nJzogJ/CfkrAnLFxyXG4gICAgLy8gJ0ZhcSc6ICfinZMnLFxyXG4gICAgLy8gJ0Jsb2dzJzogJ/Cfk50nLFxyXG4gICAgLy8gJ01pc2NlbGxhbmVvdXMnOiAn8J+UpycsXHJcbiAgICAvLyAnVGV4dCc6ICfwn5OEJyxcclxuICAgIC8vICdMb2dvJzogJ/Cfj7fvuI8nLFxyXG4gICAgLy8gJ0NvbnRhY3QnOiAn4pyJ77iPJyxcclxuICAgIC8vICdDVEEnOiAn8J+ToicsXHJcbiAgICAvLyAnVGVhbSc6ICfwn5GlJyxcclxuICAgIC8vICdWaWRlbyc6ICfwn46sJyxcclxuICAgIC8vICdJbWFnZSAnOiAn8J+WvO+4jycsXHJcbiAgICAnSGVybyc6ICfwn5qAJyxcclxuICAnU2VydmljZXMnOiAn8J+nsCcsXHJcbiAgJ0ZlYXR1cmUnOiAn4pyoJyxcclxuICAnSG93IEl0IFdvcmtzJzogJ/CfqoQnLFxyXG4gICdUZXN0aW1vbmlhbCc6ICfirZAnLFxyXG4gICdQcmljaW5nJzogJ/CfkrAnLFxyXG4gICdGYXEnOiAn4p2TJyxcclxuICAnQmxvZ3MnOiAn8J+TsCcsXHJcblxyXG4gICdDaG9vc2UgVXMnOiAn8J+boe+4jycsXHJcbiAgJ0xvZ28gQ2xvdWQnOiAn8J+PoicsXHJcbiAgJ05ld3NsZXR0ZXInOiAn8J+TqScsXHJcblxyXG4gICdNaXNjZWxsYW5lb3VzJzogJ/Cfk4InLFxyXG4gICdUZXh0JzogJ+Kcje+4jycsXHJcbiAgJ0xvZ28nOiAn8J+MiCcsXHJcblxyXG4gICdDb250YWN0JzogJ+KYju+4jycsXHJcbiAgJ0NvbnRhY3QgVXMnOiAn8J+TnicsXHJcblxyXG4gICdDVEEnOiAn8J+UpScsXHJcbiAgJ1RlYW0nOiAn8J+RpScsXHJcblxyXG4gICdBYm91dCc6ICfihLnvuI8nLFxyXG4gICdHYWxsZXJ5JzogJ/CflrzvuI8nLFxyXG5cclxuICAnVmlkZW8nOiAn8J+OrCcsXHJcbiAgJ0ltYWdlJzogJ/CflrzvuI8nXHJcbiAgfVxyXG5cclxuICBnZXRDYXRlZ29yeUVtb2ppKGNhdGVnb3J5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcnlFbW9qaU1hcFtjYXRlZ29yeV0gfHwgJ/Cfk6YnXHJcbiAgfVxyXG5cclxuICBnZXRGaXJzdFNlY3Rpb25OYW1lKGNhdGVnb3J5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zW2NhdGVnb3J5XVxyXG4gICAgaWYgKHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHNlY3Rpb25zWzBdLnNlY3Rpb25OYW1lIHx8IGNhdGVnb3J5XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2F0ZWdvcnlcclxuICB9XHJcblxyXG4gIC8vIENhbGxlZCBieSB0YWIgY2xpY2sg4oCUIHRyaWdnZXJzIHNhdmVkIEFQSSBvbiBmaXJzdCB2aXNpdFxyXG4gIG9uVGFiU2VsZWN0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIFVuc2VsZWN0IGFsbCBhY3RpdmUgY29tcG9uZW50IHNlbGVjdGlvbnMgd2hlbiBzd2l0Y2hpbmcgdGFic1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkQXBwQ29tcG9uZW50ID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRTYXZlZENvbXBvbmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkQXBwID0gXCJcIjtcclxuICAgIHRoaXMuZXhwYW5kZWRBcHBzID0ge307XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9IHZhbHVlO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5zZWxlY3RlZFRhYilcclxuICAgIGlmICh2YWx1ZSA9PT0gJ1NBVkVEJyAmJiAhdGhpcy5zYXZlZExvYWRlcikge1xyXG4gICAgICB0aGlzLmdldFNhdmVkU2VjdGlvbnMoKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZih2YWx1ZSA9PSAnQkFTSUMnKXtcclxuICAgICAgdGhpcy5nZXRBbGxTZWN0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodmFsdWUgPT09ICdBUFBTJykge1xyXG4gICAgICB0aGlzLmdldEFsbEFwcHMoKTsgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwc0xpc3Q6IGFueVtdID0gW107XHJcbiAgYXBwc0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXRBbGxBcHBzKCkge1xyXG4gICAgdGhpcy5hcHBzTG9hZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuYXBwc0xpc3QgPSBbXTtcclxuICAgIHRoaXMuZWxlbWVudFNlcnZpY2UuZ2V0QWxsYXBwcyh0aGlzLmJ1c2luZXNzSWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwc0xpc3QgPSByZXMuZGF0YSB8fCBbXTtcclxuICAgICAgICB0aGlzLmFwcHNMb2FkZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gQXV0by1leHBhbmQgYW5kIHNlbGVjdCBmaXJzdCBhcHAgaWYgYXZhaWxhYmxlIG9uIHRhYiBsb2FkXHJcbiAgICAgICAgaWYgKHRoaXMuYXBwc0xpc3QubGVuZ3RoID4gMCAmJiAhdGhpcy5zZWxlY3RlZEFwcCkge1xyXG4gICAgICAgICAgY29uc3QgZmlyc3RBcHAgPSB0aGlzLmFwcHNMaXN0WzBdO1xyXG4gICAgICAgICAgdGhpcy50b2dnbGVBcHBDYXRlZ29yeShmaXJzdEFwcC5hcHBOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIHRoaXMuYXBwc0xvYWRlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFwcENhdGVnb3J5KGFwcE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgYXBwID0gdGhpcy5hcHBzTGlzdC5maW5kKGEgPT4gYS5hcHBOYW1lID09PSBhcHBOYW1lKTtcclxuICAgIGlmICghYXBwKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuZXhwYW5kZWRBcHBzW2FwcE5hbWVdKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRBcHBzW2FwcE5hbWVdID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBcIlwiO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnMgPSBbXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEFwcENvbXBvbmVudCA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmV4cGFuZGVkQXBwcykuZm9yRWFjaChrID0+IHRoaXMuZXhwYW5kZWRBcHBzW2tdID0gZmFsc2UpO1xyXG5cclxuICAgICAgaWYgKGFwcC5hcHBJbnN0YWxsZWQpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZGVkQXBwc1thcHBOYW1lXSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFwcCA9IGFwcE5hbWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFwcFNlY3Rpb25zID0gYXBwLmNvbXBvbmVudHMgfHwgW107XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRBcHBTZWN0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQgPSB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnNbMF0uZGF0YTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEFwcENvbXBvbmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBhcHBOYW1lO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBcHBTZWN0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wbGV0ZUluc3RhbGxhdGlvbihhcHA6IGFueSwgcHJvZ3Jlc3NSZWY6IGFueSkge1xyXG4gICAgYXBwLmFwcEluc3RhbGxlZCA9IHRydWU7XHJcbiAgICB0aGlzLmV4cGFuZGVkQXBwc1thcHAuYXBwTmFtZV0gPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZEFwcCA9IGFwcC5hcHBOYW1lO1xyXG4gICAgdGhpcy5zZWxlY3RlZEFwcFNlY3Rpb25zID0gYXBwLmNvbXBvbmVudHMgfHwgW107XHJcbiAgICBwcm9ncmVzc1JlZi5jbG9zZSgpO1xyXG4gICAgXHJcbiAgICBpZiAoYXBwLmFwcE5hbWUgPT09ICdBcHBvaW50bWVudCcpIHtcclxuICAgICAgdGhpcy5vcGVuSW5zdGFsbENvbXBsZXRlRGlhbG9nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnN0YWxsQXBwKGFwcDogYW55LCBldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMuaW5zdGFsbGluZ0FwcCA9IGFwcDtcclxuXHJcbiAgICAvLyAxLiBSZXNldCBzdGVwcyB0byBzdGVwIDAgYWN0aXZlXHJcbiAgICB0aGlzLmluc3RhbGxTdGVwcyA9IFtcclxuICAgICAgeyBsYWJlbDogYEluc3RhbGxpbmcgJHthcHAuYXBwTmFtZX0gYXBwYCwgc3RhdHVzOiAnYWN0aXZlJyB9LFxyXG4gICAgICB7IGxhYmVsOiAnQ3JlYXRpbmcgcmVxdWlyZWQgcGFnZXMgZm9yIHlvdXIgYXBwJywgc3RhdHVzOiAncGVuZGluZycgfVxyXG4gICAgXTtcclxuXHJcbiAgICBpZiAoYXBwLmFwcE5hbWUgPT09ICdBcHBvaW50bWVudCcpIHtcclxuICAgICAgdGhpcy5pbnN0YWxsU3RlcHMucHVzaCh7IGxhYmVsOiAnQ3JlYXRpbmcgb25lIHN0b3JlJywgc3RhdHVzOiAncGVuZGluZycgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAvLyAyLiBPcGVuIHByb2dyZXNzIGRpYWxvZyBpbiBjZW50ZXIgb2YgdGhlIHBhZ2VcclxuICAgIGNvbnN0IHByb2dyZXNzUmVmID0gdGhpcy5tYXREaWFsb2cub3Blbih0aGlzLmluc3RhbGxQcm9ncmVzc1RlbXBsYXRlLCB7XHJcbiAgICAgIHdpZHRoOiAnNDgwcHgnLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdzaW1wby1pbnN0YWxsLWRpYWxvZy1wYW5lbCdcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBhcGlEb25lID0gZmFsc2U7XHJcbiAgICBsZXQgcHJvZ3Jlc3NEb25lID0gZmFsc2U7XHJcblxyXG4gICAgLy8gMy4gVHJpZ2dlciBBUEkgQ2FsbFxyXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmluc3RhbGxBcHAoYXBwLmFwcElkLCB0aGlzLmJ1c2luZXNzSWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGFwaURvbmUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAocHJvZ3Jlc3NEb25lKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlSW5zdGFsbGF0aW9uKGFwcCwgcHJvZ3Jlc3NSZWYpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcCBpbnN0YWxsYXRpb24gZmFpbGVkJywgZXJyKTtcclxuICAgICAgICBwcm9ncmVzc1JlZi5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyA0LiBBbmltYXRlZCBwcm9ncmVzc2lvbiBiYXNlZCBvbiBudW1iZXIgb2Ygc3RlcHNcclxuICAgIGlmIChhcHAuYXBwTmFtZSA9PT0gJ0FwcG9pbnRtZW50Jykge1xyXG4gICAgICAvLyAzLXN0ZXAgZmxvdyAoNiBzZWNvbmRzIHRvdGFsKVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMF0pIHRoaXMuaW5zdGFsbFN0ZXBzWzBdLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMV0pIHRoaXMuaW5zdGFsbFN0ZXBzWzFdLnN0YXR1cyA9ICdhY3RpdmUnO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSwgMjAwMCk7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMV0pIHRoaXMuaW5zdGFsbFN0ZXBzWzFdLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMl0pIHRoaXMuaW5zdGFsbFN0ZXBzWzJdLnN0YXR1cyA9ICdhY3RpdmUnO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSwgNDAwMCk7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMl0pIHRoaXMuaW5zdGFsbFN0ZXBzWzJdLnN0YXR1cyA9ICdzdWNjZXNzJztcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcHJvZ3Jlc3NEb25lID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGFwaURvbmUpIHtcclxuICAgICAgICAgIHRoaXMuY29tcGxldGVJbnN0YWxsYXRpb24oYXBwLCBwcm9ncmVzc1JlZik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA2MDAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIDItc3RlcCBmbG93ICg0IHNlY29uZHMgdG90YWwpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbGxTdGVwc1swXSkgdGhpcy5pbnN0YWxsU3RlcHNbMF0uc3RhdHVzID0gJ3N1Y2Nlc3MnO1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbGxTdGVwc1sxXSkgdGhpcy5pbnN0YWxsU3RlcHNbMV0uc3RhdHVzID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LCAyMDAwKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbGxTdGVwc1sxXSkgdGhpcy5pbnN0YWxsU3RlcHNbMV0uc3RhdHVzID0gJ3N1Y2Nlc3MnO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBwcm9ncmVzc0RvbmUgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoYXBpRG9uZSkge1xyXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUluc3RhbGxhdGlvbihhcHAsIHByb2dyZXNzUmVmKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDQwMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0T3ZlcmFsbFByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKCF0aGlzLmluc3RhbGxTdGVwcyB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmluc3RhbGxTdGVwcykgfHwgdGhpcy5pbnN0YWxsU3RlcHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29tcGxldGVkQ291bnQgPSB0aGlzLmluc3RhbGxTdGVwcy5maWx0ZXIocyA9PiBzICYmIHMuc3RhdHVzID09PSAnc3VjY2VzcycpLmxlbmd0aDtcclxuICAgIGNvbnN0IGFjdGl2ZUNvdW50ID0gdGhpcy5pbnN0YWxsU3RlcHMuZmlsdGVyKHMgPT4gcyAmJiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aDtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5pbnN0YWxsU3RlcHMubGVuZ3RoO1xyXG4gICAgcmV0dXJuIChjb21wbGV0ZWRDb3VudCAvIHRvdGFsKSAqIDEwMCArIChhY3RpdmVDb3VudCA+IDAgPyAoMSAvIHRvdGFsKSAqIDUwIDogMCk7XHJcbiAgfVxyXG5cclxuICBvcGVuSW5zdGFsbENvbXBsZXRlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cub3Blbih0aGlzLmluc3RhbGxDb21wbGV0ZVRlbXBsYXRlLCB7XHJcbiAgICAgIHdpZHRoOiAnNTIwcHgnLFxyXG4gICAgICBwYW5lbENsYXNzOiAnc2ltcG8tY29tcGxldGUtZGlhbG9nLXBhbmVsJ1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWRpcmVjdFRvQXBwb2ludG1lbnRzKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICAgIC8vIHdpbmRvdy5vcGVuKCdodHRwczovL2Rldi1hcHAuc2ltcG8uYWkvYWRtaW4vYXBwb2ludG1lbnRzL21hbmFnZS1hcHBvaW50bWVudHMnLCAnX2JsYW5rJyk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZG1pbi9hcHBvaW50bWVudHMvbWFuYWdlLWFwcG9pbnRtZW50cyddKVxyXG4gIH1cclxuXHJcbiAgY2xvc2VBbGxEaWFsb2dzKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcclxuICAgICAgY29uc3QgY3VycmVudFVybCA9IHRoaXMucm91dGVyLnVybDtcclxuXHJcbiAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsKTtcclxuICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFwcENvbXBvbmVudChzZWNEYXRhOiBhbnksIGFwcE5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZWxlY3RlZEFwcENvbXBvbmVudCA9IHNlY0RhdGE7XHJcbiAgICBjb25zdCBhcHAgPSB0aGlzLmFwcHNMaXN0LmZpbmQoYSA9PiBhLmFwcE5hbWUgPT09IGFwcE5hbWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEFwcFNlY3Rpb25zID0gYXBwID8gKGFwcC5jb21wb25lbnRzIHx8IFtdKSA6IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEFwcCA9IGFwcE5hbWU7XHJcblxyXG4gICAgT2JqZWN0LmtleXModGhpcy5leHBhbmRlZEFwcHMpLmZvckVhY2goayA9PiB0aGlzLmV4cGFuZGVkQXBwc1trXSA9IGZhbHNlKTtcclxuICAgIHRoaXMuZXhwYW5kZWRBcHBzW2FwcE5hbWVdID0gdHJ1ZTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtY29tcC0nICsgc2VjRGF0YS5jb21wb25lbnRJZCk7XHJcbiAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QXBwQ29tcG9uZW50QW5kSGlnaGxpZ2h0KGVsZTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQXBwQ29tcG9uZW50ID0gZWxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRBcHBPYmooKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBzTGlzdC5maW5kKGEgPT4gYS5hcHBOYW1lID09PSB0aGlzLnNlbGVjdGVkQXBwKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllc1tjYXRlZ29yeV0pIHtcclxuICAgICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXNbY2F0ZWdvcnldID0gZmFsc2VcclxuICAgICAgdGhpcy5zZWxlY3RlZFNlY3Rpb24gPSBbXVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbk5hbWUgPSBcIlwiXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcykuZm9yRWFjaChrID0+IHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzW2tdID0gZmFsc2UpXHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzW2NhdGVnb3J5XSA9IHRydWVcclxuICAgICAgdGhpcy5zZWxlY3RTZWN0aW9uKGNhdGVnb3J5KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2F2ZWRTZWN0aW9ucygpIHtcclxuICAgIHRoaXMuc2F2ZWRMb2FkZXIgPSB0cnVlXHJcbiAgICB0aGlzLnNhdmVkU2VjdGlvbnMgPSB7fVxyXG4gICAgdGhpcy5zYXZlZENhdGVnb3J5S2V5cyA9IFtdXHJcbiAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDYXRlZ29yeSA9ICcnXHJcbiAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQgPSBudWxsXHJcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UuZ2V0QWxsU2F2ZWRTZWN0aW9uc0FwaSh0aGlzLmJ1c2luZXNzSWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/LmFkZE5ld1NlY3Rpb24pIHtcclxuICAgICAgICAgIGRlbGV0ZSByZXMuZGF0YS5hZGROZXdTZWN0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNhdmVkU2VjdGlvbnMgPSByZXMuZGF0YSB8fCB7fVxyXG4gICAgICAgIHRoaXMuc2F2ZWRDYXRlZ29yeUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnNhdmVkU2VjdGlvbnMpXHJcbiAgICAgICAgaWYgKHRoaXMuc2F2ZWRDYXRlZ29yeUtleXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFNhdmVkQ2F0ZWdvcnkgPSB0aGlzLnNhdmVkQ2F0ZWdvcnlLZXlzWzBdXHJcbiAgICAgICAgICBpZiAodGhpcy5zYXZlZFNlY3Rpb25zW3RoaXMuc2VsZWN0ZWRTYXZlZENhdGVnb3J5XT8uY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTYXZlZENvbXBvbmVudCA9IHRoaXMuc2F2ZWRTZWN0aW9uc1t0aGlzLnNlbGVjdGVkU2F2ZWRDYXRlZ29yeV0uY29tcG9uZW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNhdmVkTG9hZGVyID0gZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5zYXZlZExvYWRlciA9IGZhbHNlIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZWxlY3RTYXZlZENhdGVnb3J5KGNhdGVnb3J5S2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTYXZlZENhdGVnb3J5ID0gY2F0ZWdvcnlLZXlcclxuICAgIGlmICh0aGlzLnNhdmVkU2VjdGlvbnNbY2F0ZWdvcnlLZXldPy5jb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFNhdmVkQ29tcG9uZW50ID0gdGhpcy5zYXZlZFNlY3Rpb25zW2NhdGVnb3J5S2V5XS5jb21wb25lbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2F2ZWRDb21wb25lbnQoY29tcDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQgPSBjb21wO1xyXG4gIH1cclxuXHJcbiAgYWRkU2F2ZWRTZWN0aW9uKGNvbXBvbmVudDogYW55LCBldmVudDogYW55KSB7XHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2UuYWRkTmV3U2VjdGlvbkNsaWNrLmVtaXQoe1xyXG4gICAgICBjb21wb25lbnRJZDogY29tcG9uZW50LmNvbXBvbmVudElkLFxyXG4gICAgICBpZDogY29tcG9uZW50LmlkLFxyXG4gICAgICBpbmRleDogdGhpcy5kYXRhLmluZGV4LFxyXG4gICAgICBwb3NpdGlvbjogdGhpcy5kYXRhLnBvc2l0aW9uLFxyXG4gICAgICBzdGF0dXM6IHRydWUsXHJcbiAgICAgIHNlY3Rpb25UeXBlOiBjb21wb25lbnQuc2VjdGlvblR5cGUsXHJcbiAgICAgIHNhdmVkQ29tcG9uZW50OiBjb21wb25lbnRcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2cuY2xvc2UoKTtcclxuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDb21wb25lbnQoc2VjOiBhbnksIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWNcclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gdGhpcy5zZWN0aW9uc1tjYXRlZ29yeV1cclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uTmFtZSA9IGNhdGVnb3J5XHJcblxyXG4gICAgT2JqZWN0LmtleXModGhpcy5leHBhbmRlZENhdGVnb3JpZXMpLmZvckVhY2goayA9PiB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllc1trXSA9IGZhbHNlKVxyXG4gICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXNbY2F0ZWdvcnldID0gdHJ1ZVxyXG5cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wLScgKyBzZWMuY29tcG9uZW50SWQpO1xyXG4gICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENvbXBvbmVudEFuZEhpZ2hsaWdodChlbGU6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IGVsZVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2VjdGlvbihlbGU6IGFueSkge1xyXG4gICAgdGhpcy50YWJTaGlmdExvYWRlciA9IHRydWVcclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gdGhpcy5zZWN0aW9uc1tlbGVdO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lID0gZWxlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTZWN0aW9uPy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IHRoaXMuc2VsZWN0ZWRTZWN0aW9uWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy50YWJTaGlmdExvYWRlciA9IGZhbHNlXHJcbiAgICB9LCA4MDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsU2VjdGlvbnMoKSB7XHJcbiAgICB0aGlzLmNoZWNrQXBwSW5zdGFsbGVkKClcclxuICAgIHRoaXMubG9hZGVyID0gdHJ1ZVxyXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmdldENvbXBvbmVudEFwaSh0aGlzLmJ1c2luZXNzVHlwZSA9PT0gJ1NUQVRJQycgPyB0aGlzLmJ1c2luZXNzVHlwZSA6IHVuZGVmaW5lZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgZGF0YSA9IHJlcy5kYXRhXHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8uQXBwb2ludG1lbnQpIHtcclxuICAgICAgICAgIGRlbGV0ZSByZXMuZGF0YS5BcHBvaW50bWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlZmVyRWFybkV4aXN0KSB7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgZGF0YVtrZXldID0gZGF0YVtrZXldLmZpbHRlcihcclxuICAgICAgICAgICAgICAoc2VjdGlvbjogYW55KSA9PiBzZWN0aW9uLnNlY3Rpb25UeXBlICE9PSAncmVmZXJlYXJuJ1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlY3Rpb25zID0gZGF0YVxyXG4gICAgICAgIHRoaXMuZHVtbXlTZWN0aW9ucyA9IGRhdGFcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbk5hbWUgPSBPYmplY3Qua2V5cyh0aGlzLnNlY3Rpb25zKVswXVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gdGhpcy5zZWN0aW9uc1t0aGlzLnNlbGVjdGVkU2VjdGlvbk5hbWVdXHJcblxyXG4gICAgICAgIC8vIEF1dG8tZXhwYW5kIGZpcnN0IGNhdGVnb3J5XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTZWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXNbdGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lXSA9IHRydWVcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2VjdGlvbj8ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLnNlbGVjdGVkU2VjdGlvblswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgY2hlY2tBcHBJbnN0YWxsZWQoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNoZWNrQXBwSW5zdGFsbGVkKHRoaXMuYnVzaW5lc3NJZCwgJ1JlZmVyIGFuZCBFYXJuJykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWZlckVhcm5FeGlzdCA9IHJlcy5kYXRhXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHsgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldE9iamVjdEtleXMob2JqOiBhbnkpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKSA6IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VjdGlvbkxlbmd0aChzZWN0aW9uOiBhbnkpIHtcclxuICAgIHJldHVybiBOdW1iZXIoT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoKVxyXG4gIH1cclxuXHJcbiAgYWRkTmV3U2VjdGlvbihjb21wb25lbnRJZDogYW55LCBzZWN0aW9uVHlwZTogYW55LCBldmVudDogYW55KSB7XHJcbiAgICB0aGlzLl9ldmVudFNlcnZpY2UuYWRkTmV3U2VjdGlvbkNsaWNrLmVtaXQoe1xyXG4gICAgICBjb21wb25lbnRJZDogY29tcG9uZW50SWQsXHJcbiAgICAgIGluZGV4OiB0aGlzLmRhdGEuaW5kZXgsXHJcbiAgICAgIHBvc2l0aW9uOiB0aGlzLmRhdGEucG9zaXRpb24sXHJcbiAgICAgIHN0YXR1czogdHJ1ZSxcclxuICAgICAgc2VjdGlvblR5cGU6IHNlY3Rpb25UeXBlXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nLmNsb3NlKCk7XHJcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgYWRkQXBwU2VjdGlvbihjb21wb25lbnQ6IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmFkZE5ld1NlY3Rpb25DbGljay5lbWl0KHtcclxuICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudC5jb21wb25lbnRJZCxcclxuICAgICAgaWQ6IGNvbXBvbmVudC5pZCB8fCBudWxsLFxyXG4gICAgICBpbmRleDogdGhpcy5kYXRhLmluZGV4LFxyXG4gICAgICBwb3NpdGlvbjogdGhpcy5kYXRhLnBvc2l0aW9uLFxyXG4gICAgICBzdGF0dXM6IHRydWUsXHJcbiAgICAgIHNlY3Rpb25UeXBlOiBjb21wb25lbnQuc2VjdGlvblR5cGUsXHJcbiAgICAgIHNhdmVkQ29tcG9uZW50OiBjb21wb25lbnRcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2cuY2xvc2UoKTtcclxuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVBZGRTZWN0aW9uKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnQkFTSUMnICYmIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5hZGROZXdTZWN0aW9uKHRoaXMuc2VsZWN0ZWRDb21wb25lbnQuY29tcG9uZW50SWQsIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQuc2VjdGlvblR5cGUsIGV2ZW50KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ0FQUFMnICYmIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5hZGRBcHBTZWN0aW9uKHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQsIGV2ZW50KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ1NBVkVEJyAmJiB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5hZGRTYXZlZFNlY3Rpb24odGhpcy5zZWxlY3RlZFNhdmVkQ29tcG9uZW50LCBldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSBcIlwiXHJcbiAgZHVtbXlTZWN0aW9uczogYW55XHJcbiAgZHVtbXkyOiBhbnkgPSB7fVxyXG4gIGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgc2VhcmNoU2VjdGlvbnMoKSB7XHJcbiAgICB0aGlzLmlzU2VhcmNoID0gZmFsc2VcclxuICAgIGlmICh0aGlzLnNlYXJjaFRleHQubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWN0aW9ucyA9IHRoaXMuZHVtbXlTZWN0aW9uc1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZHVtbXkyID0ge31cclxuICAgIGZvciAobGV0IGVsZSBvZiBPYmplY3Qua2V5cyh0aGlzLmR1bW15U2VjdGlvbnMpKSB7XHJcbiAgICAgIGlmIChlbGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICB0aGlzLmR1bW15MltlbGVdID0gWy4uLnRoaXMuZHVtbXlTZWN0aW9uc1tlbGVdXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBqIG9mIHRoaXMuZHVtbXlTZWN0aW9uc1tlbGVdKSB7XHJcbiAgICAgICAgICBpZiAoai5zZWN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZHVtbXkyW2VsZV0pIHtcclxuICAgICAgICAgICAgICB0aGlzLmR1bW15MltlbGVdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kdW1teTJbZWxlXS5wdXNoKGopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWN0aW9ucyA9IHsgLi4udGhpcy5kdW1teTIgfTtcclxuICAgIGlmICh0aGlzLmdldFNlY3Rpb25MZW5ndGgodGhpcy5zZWN0aW9ucykgPT0gMClcclxuICAgICAgdGhpcy5pc1NlYXJjaCA9IHRydWVcclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuc2VjdGlvbnMpWzBdXHJcbiAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbiA9IHRoaXMuc2VjdGlvbnNbT2JqZWN0LmtleXModGhpcy5zZWN0aW9ucylbMF1dXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlY3Rpb24/Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50ID0gdGhpcy5zZWxlY3RlZFNlY3Rpb25bMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuZHVtbXkyID0ge31cclxuICB9XHJcbn0iLCI8IS0tIDxzZWN0aW9uIGNsYXNzPVwibWFpbi1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICA8ZGl2PlNlbGVjdCBUZW1wbGF0ZTwvZGl2PlxyXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmLTE4IGNwXCIgKGNsaWNrKT1cImRpYWxvZy5jbG9zZSgpXCI+XHJcbiAgICAgICAgICAgIGNsb3NlXHJcbiAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInBhcmVudC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXIgZC1mbGV4IGdhcC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzMxNDY2MWMxNzQxODQ0MjM0NDQyVmVjdG9yJTIwJTI4MSUyOS5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cInNlYXJjaC1iYXItaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggZm9yIFNlY3Rpb25zXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoU2VjdGlvbnMoKVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRhaW5lciBkLWZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIHRhYnNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzXCIgKGNsaWNrKT1cInNlbGVjdGVkVGFiID0gZWxlLnZhbHVlXCIgW2NsYXNzLmFjdGl2ZS10YWJdPVwiZWxlLnZhbHVlID09IHNlbGVjdGVkVGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tlbGUudmlld1ZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlLnZhbHVlID09ICdQUk8nICYmIGVsZS52YWx1ZSAhPSBzZWxlY3RlZFRhYlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwidy0zMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzQ2ODI4MWMxNzQ0Njk5NjY0ODU4RnJhbWUlMjAxMjQ0ODMxNzQwJTIwJTI4MSUyOS5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwicHJvLWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdCQVNJQyc7IGVsc2UgcHJvVGFiQ29udGVudFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2VhcmNoO2Vsc2UgZW1wdHlTY3JlZW5cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLWNvbnRhaW5lciBkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zaWRlcGFuZWxcIiAqbmdJZj1cIiFsb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIGdldE9iamVjdEtleXMoc2VjdGlvbnMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZS1zZWN0aW9uIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNlY3Rpb24oZWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZS1zZWN0aW9uXT1cInNlbGVjdGVkU2VjdGlvbiA9PSBzZWN0aW9uc1tlbGVdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRTZWN0aW9uID09IHNlY3Rpb25zW2VsZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy85NTQzODNjMTc0MTg1MDM5MjgwMkdyb3VwJTIwMTcwNzQ4MTg3OS5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImljb24gdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkU2VjdGlvbiAhPSBzZWN0aW9uc1tlbGVdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvODQ2MTQ1YzE3NDE4NTA1NzQ4NjRJY29uJTIwJTI4MSUyOS5wbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImljb24gdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1yZW5kZXItc2VjdGlvblwiICpuZ0lmPVwiICFsb2FkZXIgJiYgIXRhYlNoaWZ0TG9hZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yaWVzLWhlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRTZWN0aW9uTmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHNlY3Rpb24gdG8gYWRkIHRvIHlvdXIgcGFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWxlIG9mIHNlbGVjdGVkU2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPnt7ZWxlLnNlY3Rpb25OYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taW1nLWNvbnRhaW5lciBjcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3U2VjdGlvbihlbGUuY29tcG9uZW50SWQsZWxlLnNlY3Rpb25UeXBlLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGU/LmltYWdlOyBlbHNlIG5vSW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZWxlPy5pbWFnZVwiIGFsdD1cInNlY3Rpb24gaW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9pbWcuZnJlZXBpay5jb20vcHJlbWl1bS12ZWN0b3IvZGVmYXVsdC1pbWFnZS1pY29uLXZlY3Rvci1taXNzaW5nLXBpY3R1cmUtcGFnZS13ZWJzaXRlLWRlc2lnbi1tb2JpbGUtYXBwLW5vLXBob3RvLWF2YWlsYWJsZV84NzU0My0xMTA5My5qcGdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJzZWN0aW9uIGltYWdlXCIgY2xhc3M9XCJoLTMwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zaWRlcGFuZWxcIiAqbmdJZj1cImxvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgWzEsMSwxLDEsMSwxLDEsMSwxXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICc4dmgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzY1JScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzEzcHgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFyZ2luLWJvdHRvbScgOiAnMTBweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtcmVuZGVyLXNlY3Rpb25cIiAqbmdJZj1cImxvYWRlciB8fCB0YWJTaGlmdExvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1oZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzIwJScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IDogJzN2aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICc2MCUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA6ICcydmgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgWzEsMSwxLDFdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4gICA8bmd4LXNrZWxldG9uLWxvYWRlciBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMjUlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA6ICcydmgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBbdGhlbWVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IDogJzI1dmgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmdpbic6JzJweCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNwcm9UYWJDb250ZW50PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZGl2IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lci0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzM3NzA3NmMxNzQzMTU0ODA3NjgzaW1hZ2UlMjAlMjg2JTI5LnBuZ1wiIGFsdD1cImVtcHR5LWltZ1wiIGNsYXNzPVwiZW1wdHktaW1nIFwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib29wcy10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQ29taW5nIFNvb25cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9vcHMtc3ViLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib29wcy1zdWItdGV4dC0xIHRleHQtY2VudGVyXCI+V29vZiEgU29tZXRoaW5nIHBhd3NvbWUgaXMgY29taW5nITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvb3BzLXN1Yi10ZXh0LTIgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSGV5IGhvb21hbiEgSSBqdXN0IHNuaWZmZWQgb3V0IHNvbWV0aGluZyBzdXBlciBleGNpdGluZy4uLiBhbmQgaXTigJlzIGFsbW9zdCBoZXJlISBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTY3JlZW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1kaXYgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvMzc3MDc2YzE3NDMxNTQ4MDc2ODNpbWFnZSUyMCUyODYlMjkucG5nXCIgYWx0PVwiZW1wdHktaW1nXCIgY2xhc3M9XCJlbXB0eS1pbWcgXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvb3BzLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICBPb3BzISBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9vcHMtc3ViLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib29wcy1zdWItdGV4dC0xIHRleHQtY2VudGVyXCI+SSBzbmlmZmVkIGV2ZXJ5d2hlcmUsIGJ1dCBJIGNvdWxkbid0IGZpbmQgd2hhdCB5b3UncmUgbG9va2luZyBmb3I8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib29wcy1zdWItdGV4dC0yIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE1heWJlIHRyeSBhIGRpZmZlcmVudCBzZWFyY2g/IFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuPC9zZWN0aW9uPiAtLT5cclxuXHJcbjxzZWN0aW9uIGNsYXNzPVwibWFpbi1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlci1jb250YWluZXIgZmFkZS1pblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5BZGQgYSBzZWN0aW9uPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1zdWJ0aXRsZVwiPkNob29zZSBhIHNlY3Rpb24g4oCUIHlvdSBjYW4gcmVvcmRlciBvciByZW1vdmUgaXQgYW55IHRpbWUuPC9kaXY+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xvc2UtYnRuXCIgKGNsaWNrKT1cImRpYWxvZy5jbG9zZSgpXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInBhcmVudC1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcblxyXG4gICAgICAgIDwhLS0gVGFicyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXRhYnMtY29udGFpbmVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBmYWRlLWluXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiB0YWJzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXRhYlwiIChjbGljayk9XCJvblRhYlNlbGVjdChlbGUudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlLXRvcC10YWJdPVwiZWxlLnZhbHVlID09IHNlbGVjdGVkVGFiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tlbGUudmlld1ZhbHVlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTZWFyY2ggLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXItY29udGFpbmVyIGZhZGUtaW5cIiAqbmdJZj1cInNlbGVjdGVkVGFiICE9ICdTQVZFRCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXIgZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvMzE0NjYxYzE3NDE4NDQyMzQ0NDJWZWN0b3IlMjAlMjgxJTI5LnBuZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9J1NlYXJjaCBzZWN0aW9uLi4uJyBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFNlY3Rpb25zKClcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ0JBU0lDJ1wiPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlYXJjaDsgZWxzZSBlbXB0eVNjcmVlblwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUXVpY2sgQWRkIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicXVpY2stYWRkLWNvbnRhaW5lciBmYWRlLWluIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cIiFsb2FkZXIgJiYgIXNlYXJjaFRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stYWRkLWxhYmVsXCI+UXVpY2sgYWRkOjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1hZGQtY2hpcHMgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGdldE9iamVjdEtleXMoc2VjdGlvbnMpOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA8IDZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stY2hpcCBzdGFnZ2VyLWl0ZW0gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZWN0aW9uKGNhdGVnb3J5KTsgdG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZS1xdWljay1jaGlwXT1cInNlbGVjdGVkU2VjdGlvbk5hbWUgPT09IGNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcC1lbW9qaVwiPnt7Z2V0Q2F0ZWdvcnlFbW9qaShjYXRlZ29yeSl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRGaXJzdFNlY3Rpb25OYW1lKGNhdGVnb3J5KX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBDT05URU5UIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGZhZGUtaW4gZC1mbGV4XCIgKm5nSWY9XCIhbG9hZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMRUZUIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGViYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pY29uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPuKcqDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTE0XCI+QUkgUmVjb21tZW5kZWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBnZXRPYmplY3RLZXlzKHNlY3Rpb25zKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDYXRlZ29yeUVtb2ppKGNhdGVnb3J5KX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLTEzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYXRlZ29yeX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LWNvdW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt7c2VjdGlvbnNbY2F0ZWdvcnldPy5sZW5ndGh9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNhdGVnb3J5LWFycm93XCIgKm5nSWY9XCJleHBhbmRlZENhdGVnb3JpZXNbY2F0ZWdvcnldXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfbGVzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjYXRlZ29yeS1hcnJvd1wiICpuZ0lmPVwiIWV4cGFuZGVkQ2F0ZWdvcmllc1tjYXRlZ29yeV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF9tb3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWl0ZW1zIGQtZmxleCBmbGV4LWNvbHVtblwiICpuZ0lmPVwiZXhwYW5kZWRDYXRlZ29yaWVzW2NhdGVnb3J5XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWMgb2Ygc2VjdGlvbnNbY2F0ZWdvcnldXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENvbXBvbmVudD8uY29tcG9uZW50SWQgPT09IHNlYy5jb21wb25lbnRJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENvbXBvbmVudChzZWMsIGNhdGVnb3J5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VjLnNlY3Rpb25OYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWdyb3VwLWxhYmVsXCI+e3tzZWxlY3RlZFNlY3Rpb25OYW1lIHx8ICdTZWN0aW9ucyd9fTwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLWxpc3QgZC1mbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJzZWxlY3RlZFNlY3Rpb24gJiYgc2VsZWN0ZWRTZWN0aW9uLmxlbmd0aCA+IDBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2Ygc2VsZWN0ZWRTZWN0aW9uOyBsZXQgaSA9IGluZGV4XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInY29tcC0nICsgZWxlLmNvbXBvbmVudElkXCIgY2xhc3M9XCJzZWN0aW9uLWNhcmQgc3RhZ2dlci1pdGVtXCIgW3N0eWxlLmFuaW1hdGlvbi1kZWxheV09XCJpICogNDAgKyAnbXMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWN0aW9uLWNhcmQtc2VsZWN0ZWRdPVwic2VsZWN0ZWRDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBlbGUuY29tcG9uZW50SWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENvbXBvbmVudEFuZEhpZ2hsaWdodChlbGUpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1iYWRnZVwiICpuZ0lmPVwiZWxlLnNlY3Rpb25UeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSArIHt7ZWxlLnNlY3Rpb25UeXBlIHwgdXBwZXJjYXNlfX0gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsge3tlbGUuc2VjdGlvbk5hbWUgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taW1nLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlPy5pbWFnZTsgZWxzZSBub0ltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbGU/LmltYWdlXCIgYWx0PVwic2VjdGlvbiBwcmV2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8taW1hZ2UtcGxhY2Vob2xkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW1hZ2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1pbmZvIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtbmFtZVwiPnt7ZWxlLnNlY3Rpb25OYW1lfX08L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtZGVzY1wiICpuZ0lmPVwiZWxlLmRlc2NcIj57e2VsZS5kZXNjIHwgdGl0bGVjYXNlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjYXJkLWNoZWNrLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkQ29tcG9uZW50Py5jb21wb25lbnRJZCA9PT0gZWxlLmNvbXBvbmVudElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmNsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGUgZmFkZS1pblwiICpuZ0lmPVwiIXNlbGVjdGVkU2VjdGlvbiB8fCBzZWxlY3RlZFNlY3Rpb24ubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJlbXB0eS1wYWdlLWljb25cIj5hdXRvX2F3ZXNvbWU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXRpdGxlXCI+U2VsZWN0IGEgY2F0ZWdvcnk8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdWJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob29zZSBhbnkgY2F0ZWdvcnkgZnJvbSB0aGUgbGVmdCBzaWRlYmFyIHRvIGV4cGxvcmUgYW5kIGFkZCBzZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGQtZmxleFwiICpuZ0lmPVwibG9hZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDEsMSwxLDEsMSwxLDFdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnOTAlJywgaGVpZ2h0OiAnMzZweCcsICdib3JkZXItcmFkaXVzJzogJzhweCcsICdtYXJnaW4tYm90dG9tJzogJzZweCcgfVwiPjwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwxLDEsMV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlbWVdPVwieyB3aWR0aDogJzQwJScsIGhlaWdodDogJzIwcHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnLCAnbWFyZ2luLWJvdHRvbSc6ICc4cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTgwcHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc4cHgnLCAnbWFyZ2luLWJvdHRvbSc6ICc4cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICc2MCUnLCBoZWlnaHQ6ICcxNnB4JywgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JyB9XCI+PC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnU0FWRUQnXCI+XHJcbiAgICAgICAgICAgIDwhLS0gTG9hZGVyIHNrZWxldG9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1sYXlvdXQgZC1mbGV4XCIgKm5nSWY9XCJzYXZlZExvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2YgWzEsMSwxLDEsMV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnOTAlJywgaGVpZ2h0OiAnMzZweCcsICdib3JkZXItcmFkaXVzJzogJzhweCcsICdtYXJnaW4tYm90dG9tJzogJzhweCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwxLDFdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmRcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlbWVdPVwieyB3aWR0aDogJzQwJScsIGhlaWdodDogJzE4cHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnLCAnbWFyZ2luLWJvdHRvbSc6ICc4cHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwcHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc4cHgnLCAnbWFyZ2luLWJvdHRvbSc6ICc4cHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICc2MCUnLCBoZWlnaHQ6ICcxNHB4JywgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBMb2FkZWQ6IGNhdGVnb3JpZXMgKyByaWdodCBjb21wb25lbnQgY2FyZCBwcmV2aWV3IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1sYXlvdXQgZmFkZS1pbiBkLWZsZXhcIiAqbmdJZj1cIiFzYXZlZExvYWRlciAmJiBzYXZlZENhdGVnb3J5S2V5cy5sZW5ndGggPiAwXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBMRUZUOiBjb21wb25lbnQgY2F0ZWdvcmllcyBsaXN0IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYXZlZC1wYWdlcy1sYWJlbFwiPlNhdmVkIFNlY3Rpb25zPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2F0S2V5IG9mIHNhdmVkQ2F0ZWdvcnlLZXlzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYXZlZC1wYWdlLWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZFNhdmVkQ2F0ZWdvcnkgPT09IGNhdEtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2F2ZWRDYXRlZ29yeShjYXRLZXkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzYXZlZC1wYWdlLWljb25cIj5hcnRpY2xlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2F2ZWQtcGFnZS1uYW1lXCI+e3tjYXRLZXl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWdyb3VwLWxhYmVsXCI+Q29tcG9uZW50IFByZXZpZXc8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLWxpc3QgZC1mbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBmYWRlLWluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWN0aW9uLWNhcmQtc2VsZWN0ZWRdPVwic2VsZWN0ZWRTYXZlZENvbXBvbmVudD8uaWQgPT09IHNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ/LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTYXZlZENvbXBvbmVudChzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV0uY29tcG9uZW50KVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjdGlvbiB0eXBlIGJhZGdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1iYWRnZVwiICpuZ0lmPVwic2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uc2VjdGlvblR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQuc2VjdGlvblR5cGUuc3BsaXQoJ18nKS5qb2luKCcgJykgfCB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQcmV2aWV3IGFyZWEgKFNob3cgaW1hZ2UgaWYgcHJlc2VudCwgZmFsbGJhY2sgdG8gcGxhY2Vob2xkZXIpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taW1nLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5pbWFnZSAmJiBzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV0uY29tcG9uZW50Py5zdHlsZXM/LmJhY2tncm91bmQ/LnNob3dJbWFnZTsgZWxzZSBzYXZlZE5vSW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQuc3R5bGVzLmJhY2tncm91bmQuaW1hZ2VcIiBhbHQ9XCJzZWN0aW9uIHByZXZpZXdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NhdmVkTm9JbWFnZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhdmVkLXByZXZpZXctcGxhY2Vob2xkZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bGF5ZXJzPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uc2VjdGlvblR5cGU/LnNwbGl0KCdfJyk/LmpvaW4oJyAnKSB8fCAnU2F2ZWQgQ29tcG9uZW50J319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYXJkIGluZm8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jYXJkLWluZm8gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtbmFtZVwiPnt7c2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uc2VjdGlvbk5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jYXJkLWRlc2NcIiAqbmdJZj1cInNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ/LmRlc2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudC5kZXNjfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2FyZC1jaGVjay1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFNhdmVkQ29tcG9uZW50Py5pZCA9PT0gc2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfY2lyY2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlZCBJbiBmb290ZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2F2ZWQtY2FyZC1mb290ZXJcIiAqbmdJZj1cInNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS51c2VkSW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlZC1pbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ1c2VkLWluLWljb25cIj53ZWI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZWQtaW4tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5Vc2VkIEluICh7e3NhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS51c2VkSW4ubGVuZ3RofX0gUGFnZXMpOjwvc3Ryb25nPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLnVzZWRJbi5qb2luKCcsICcpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEVtcHR5OiBubyBzYXZlZCBkYXRhIGF0IGFsbCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlIGZhZGUtaW5cIiAqbmdJZj1cIiFzYXZlZExvYWRlciAmJiBzYXZlZENhdGVnb3J5S2V5cy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9jZG4taWNvbnMtcG5nLmZsYXRpY29uLmNvbS81MTIvNDA3Ni80MDc2NTQ5LnBuZ1wiIGFsdD1cImVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktdGl0bGVcIj5ObyBzYXZlZCBzZWN0aW9uczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN1YnRpdGxlXCI+U2VjdGlvbnMgeW91IHNhdmUgZnJvbSBwYWdlcyB3aWxsIGFwcGVhciBoZXJlPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnQVBQUydcIj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwhLS0gU2tlbGV0b24gTG9hZGVyIGR1cmluZyBBUEkgbG9hZCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGQtZmxleFwiICpuZ0lmPVwiYXBwc0xvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2YgWzEsMSwxLDFdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlbWVdPVwieyB3aWR0aDogJzkwJScsIGhlaWdodDogJzM2cHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc4cHgnLCAnbWFyZ2luLWJvdHRvbSc6ICc4cHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2YgWzEsMSwxXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jYXJkXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjEycHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICc0MCUnLCBoZWlnaHQ6ICcxOHB4JywgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JywgJ21hcmdpbi1ib3R0b20nOiAnOHB4JyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMHB4JywgJ2JvcmRlci1yYWRpdXMnOiAnOHB4JywgJ21hcmdpbi1ib3R0b20nOiAnOHB4JyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBMb2FkZWQgYXBwcyBsaXN0IGFuZCBwcmV2aWV3IGJvYXJkcyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGZhZGUtaW4gZC1mbGV4XCIgKm5nSWY9XCIhYXBwc0xvYWRlciAmJiBhcHBzTGlzdC5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIExFRlQgU0lERUJBUiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGViYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhcHAgb2YgYXBwc0xpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFwcCBIZWFkZXIgUm93IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXBwQ2F0ZWdvcnkoYXBwLmFwcE5hbWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIm1pbi13aWR0aDogMDsgZmxleDogMTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCI+e3thcHBJY29uTWFwW2FwcC5hcHBOYW1lXSB8fCAn8J+Tpid9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy0xMyBmdy1zZW1pYm9sZFwiIHN0eWxlPVwidGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IG92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IG1pbi13aWR0aDogMDsgZmxleDogMTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwLmFwcE5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29tcGFjdCBhY3RpdmUgZ3JlZW4gc3RhdHVzIGRvdCBmb3IgaW5zdGFsbGVkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwcC1kb3QtaW5zdGFsbGVkXCIgKm5nSWY9XCJhcHAuYXBwSW5zdGFsbGVkXCIgdGl0bGU9XCJJbnN0YWxsZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5zdGFsbCBCdXR0b24gaWYgbm90IGluc3RhbGxlZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hcHAtaW5zdGFsbC1zbWFsbFwiICpuZ0lmPVwiIWFwcC5hcHBJbnN0YWxsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluc3RhbGxBcHAoYXBwLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2F0ZWdvcnktYXJyb3dcIiAqbmdJZj1cImV4cGFuZGVkQXBwc1thcHAuYXBwTmFtZV0gJiYgYXBwLmFwcEluc3RhbGxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2F0ZWdvcnktYXJyb3dcIiAqbmdJZj1cIiFleHBhbmRlZEFwcHNbYXBwLmFwcE5hbWVdICYmIGFwcC5hcHBJbnN0YWxsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF9tb3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3ViY29tcG9uZW50cyBsaXN0IHVuZGVyIGluc3RhbGxlZCBhcHAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaXRlbXMgZC1mbGV4IGZsZXgtY29sdW1uIGFuaW1hdGUtZHJvcGRvd25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHBhbmRlZEFwcHNbYXBwLmFwcE5hbWVdICYmIGFwcC5hcHBJbnN0YWxsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXBwLmNvbXBvbmVudHM/Lmxlbmd0aCA+IDA7IGVsc2Ugbm9BcHBTZWNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlYyBvZiBhcHAuY29tcG9uZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VjPy5kYXRhPy5jb21wb25lbnRJZCAhPSBudWxsICYmIHNlbGVjdGVkQXBwQ29tcG9uZW50Py5jb21wb25lbnRJZCA9PT0gc2VjPy5kYXRhPy5jb21wb25lbnRJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFwcENvbXBvbmVudChzZWMuZGF0YSwgYXBwLmFwcE5hbWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e3NlYy5kYXRhLnNlY3Rpb25OYW1lfX0gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzZWM/LmRhdGE/LnNlY3Rpb25OYW1lIHx8ICdObyBDb21wb25lbnQnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0FwcFNlY3M+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pdGVtLWRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBzZWN0aW9ucyBhdmFpbGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUklHSFQgQ09OVEVOVCBQUkVWSUVXIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8IS0tIElGIEFOIEFQUCBJUyBTRUxFQ1RFRCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRBcHBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSU5TVEFMTEVEIEFQUCBTRUNUSU9OUyBMSVNUIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0U2VsZWN0ZWRBcHBPYmooKSBhcyBhY3RpdmVBcHBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVBcHAuYXBwSW5zdGFsbGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tZ3JvdXAtbGFiZWxcIj57e3NlbGVjdGVkQXBwfX0gU2VjdGlvbnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbnMtbGlzdCBkLWZsZXggZmxleC1jb2x1bW5cIiAqbmdJZj1cInNlbGVjdGVkQXBwU2VjdGlvbnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2Ygc2VsZWN0ZWRBcHBTZWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInYXBwLWNvbXAtJyArIGVsZT8uZGF0YT8uY29tcG9uZW50SWQgIT0gbnVsbFwiIGNsYXNzPVwic2VjdGlvbi1jYXJkIHN0YWdnZXItaXRlbVwiIFtzdHlsZS5hbmltYXRpb24tZGVsYXldPVwiaSAqIDQwICsgJ21zJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlY3Rpb24tY2FyZC1zZWxlY3RlZF09XCJlbGU/LmRhdGE/LmNvbXBvbmVudElkICE9IG51bGwgJiYgc2VsZWN0ZWRBcHBDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBlbGUuZGF0YS5jb21wb25lbnRJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFwcENvbXBvbmVudEFuZEhpZ2hsaWdodChlbGUuZGF0YSlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCYWRnZSBzaG93aW5nIGNvbXBvbmVudCBzZWN0aW9uIG5hbWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1iYWRnZVwiICpuZ0lmPVwiZWxlPy5kYXRhPy5zZWN0aW9uVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB7eyhlbGU/LmRhdGE/LnNlY3Rpb25OYW1lIHwgdGl0bGVjYXNlKSB8fCBcIk5vIENvbXBvbmVudFwifX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbWFnZSBQcmV2aWV3IEFyZWEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taW1nLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZT8uZGF0YT8uaW1hZ2U7IGVsc2Ugbm9JbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImVsZS5kYXRhLmltYWdlXCIgYWx0PVwic2VjdGlvbiBwcmV2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSW1hZ2U+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8taW1hZ2UtcGxhY2Vob2xkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmltYWdlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhcmQgSW5mbyAoRGVzY3JpcHRpb24gYW5kIFRhZ3MpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtaW5mbyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtaW4td2lkdGg6IDA7IGZsZXg6IDE7IHBhZGRpbmctcmlnaHQ6IDhweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtZGVzY1wiICpuZ0lmPVwiZWxlPy5kYXRhPy5kZXNjXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA2cHg7XCI+e3tlbGUuZGF0YS5kZXNjfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGFncyBhcnJheSByZW5kZXJpbmcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtMVwiICpuZ0lmPVwiZWxlPy5kYXRhPy50YWdzPy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHAtYmFkZ2VcIiBzdHlsZT1cImJhY2tncm91bmQ6ICNlZWYyZmY7IGNvbG9yOiAjNGY0NmU1OyBtYXJnaW46IDA7IGZvbnQtc2l6ZTogOC41cHg7XCIgKm5nRm9yPVwibGV0IHRhZyBvZiBlbGUuZGF0YS50YWdzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNhcmQtY2hlY2staWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVsZT8uZGF0YSAhPSBudWxsICYmIHNlbGVjdGVkQXBwQ29tcG9uZW50Py5jb21wb25lbnRJZCA9PT0gZWxlLmRhdGEuY29tcG9uZW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmNsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gc2VjdGlvbnMgZW1wdHkgc3RhdGUgaW5zaWRlIHJpZ2h0IHBhbmVsIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZSBmYWRlLWluXCIgKm5nSWY9XCJzZWxlY3RlZEFwcFNlY3Rpb25zLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJlbXB0eS1wYWdlLWljb25cIj5pbmJveDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS10aXRsZVwiPk5vIHNlY3Rpb25zIGF2YWlsYWJsZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIj5UaGlzIGFwcCBkb2VzIG5vdCBwcm92aWRlIGFueSBwcmUtYnVpbHQgc2VjdGlvbnMgYXQgdGhlIG1vbWVudDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOT1QgSU5TVEFMTEVEIEVNUFRZIFNUQVRFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhY3RpdmVBcHAuYXBwSW5zdGFsbGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0YXRlIGZhZGUtaW4gZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImVtcHR5LXBhZ2UtaWNvblwiIHN0eWxlPVwiZm9udC1zaXplOiA1NnB4ICFpbXBvcnRhbnQ7IHdpZHRoOiA1NnB4ICFpbXBvcnRhbnQ7IGhlaWdodDogNTZweCAhaW1wb3J0YW50OyBjb2xvcjogIzdjNmNmMDsgb3BhY2l0eTogMC44O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FwcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktdGl0bGVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTZweDsgbWFyZ2luLXRvcDogMTJweDtcIj5QbGVhc2UgaW5zdGFsbCB0byB2aWV3IHNlY3Rpb25zPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgbWF4LXdpZHRoOiAyODBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCB0aGUge3tzZWxlY3RlZEFwcH19IHBsdWdpbiB0byB1bmxvY2sgcHJlbWl1bSwgcHJlLWJ1aWx0IHNlY3Rpb25zIGZvciB5b3VyIHdlYnNpdGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFwcC1pbnN0YWxsLWxhcmdlXCIgKGNsaWNrKT1cImluc3RhbGxBcHAoYWN0aXZlQXBwLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDimqEgSW5zdGFsbCB7e3NlbGVjdGVkQXBwfX0gQXBwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBOTyBBQ1RJVkUgQVBQIFNFTEVDVEVEIChGQUxMQkFDSykgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RlZEFwcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGUgZmFkZS1pbiBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBzdHlsZT1cImhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImVtcHR5LXBhZ2UtaWNvblwiPmFwcHM8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXRpdGxlXCI+RXhwbG9yZSBQbHVnaW5zICYgQXBwczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN1YnRpdGxlXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDI2MHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBhbnkgYXBwbGljYXRpb24gZnJvbSB0aGUgbGVmdCBzaWRlYmFyIHRvIGJyb3dzZSBhbmQgY29uZmlndXJlIGl0cyBjdXN0b20gbGF5b3V0IGNvbXBvbmVudHMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDwhLS0gRU1QVFkgU0VBUkNIIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTY3JlZW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZSBmYWRlLWluIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Nkbi1pY29ucy1wbmcuZmxhdGljb24uY29tLzUxMi83NDg2Lzc0ODY4MDMucG5nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktdGl0bGVcIj5ObyBzZWN0aW9ucyBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN1YnRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVHJ5IHNlYXJjaGluZyBzb21ldGhpbmcgZWxzZSBvciBleHBsb3JlIGNhdGVnb3JpZXNcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRm9vdGVyIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvb3Rlci1jb250YWluZXIgZmFkZS1pblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItaGludFwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgWW91IGNhbiByZWFycmFuZ2Ugb3IgcmVtb3ZlIHRoaXMgc2VjdGlvbiBhbnkgdGltZS5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jYW5jZWxcIiAoY2xpY2spPVwiZGlhbG9nLmNsb3NlKClcIj5DYW5jZWw8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1hZGRcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInNlbGVjdGVkVGFiID09PSAnQkFTSUMnID8gIXNlbGVjdGVkQ29tcG9uZW50IDogKHNlbGVjdGVkVGFiID09PSAnQVBQUycgPyAhc2VsZWN0ZWRBcHBDb21wb25lbnQgOiAhc2VsZWN0ZWRTYXZlZENvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFkZFNlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgKyBBZGQgc2VjdGlvblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBCZWF1dGlmdWwgSW5zdGFsbGF0aW9uIFByb2dyZXNzIERpYWxvZyBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNpbnN0YWxsUHJvZ3Jlc3NUZW1wbGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwic2ltcG8tZGlhbG9nLWNvbnRhaW5lciBhbmltYXRlLWNvbXBsZXRlLXBvcFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNpbXBvLWRpYWxvZy1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImFwcC1pY29uLWJhZGdlXCI+e3sgYXBwSWNvbk1hcFtpbnN0YWxsaW5nQXBwPy5hcHBOYW1lXSB8fCAn8J+UjCcgfX08L2Rpdj5cclxuICAgICAgPGgzPlNldHRpbmcgVXAge3sgaW5zdGFsbGluZ0FwcD8uYXBwTmFtZSB9fSBBcHA8L2gzPlxyXG4gICAgICA8cD5QbGVhc2Ugd2FpdCB3aGlsZSB3ZSBjb25maWd1cmUgeW91ciBwcmVtaXVtIHNjaGVkdWxpbmcgc3lzdGVtLjwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzaW1wby1kaWFsb2ctYm9keVwiPlxyXG4gICAgICA8IS0tIEFuaW1hdGVkIFByb2dyZXNzIEJhciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInNpbXBvLWRpYWxvZy1wcm9ncmVzcy1iYXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ltcG8tZGlhbG9nLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwiZ2V0T3ZlcmFsbFByb2dyZXNzUGVyY2VudCgpICsgJyUnXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBTdGVwcyBMaXN0IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2ltcG8tc3RlcHMtbGlzdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwLXJvd1wiICpuZ0Zvcj1cImxldCBzdGVwIG9mIGluc3RhbGxTdGVwczsgbGV0IGlkeCA9IGluZGV4XCIgW25nQ2xhc3NdPVwic3RlcD8uc3RhdHVzIHx8ICcnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1pY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8IS0tIEFjdGl2ZSBTdGVwIEljb24gKFB1bHNpbmcgZ2xvd2luZyBkb3QpIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1pY29uIGFjdGl2ZS1pY29uXCIgKm5nSWY9XCJzdGVwPy5zdGF0dXMgPT09ICdhY3RpdmUnXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLW51bWJlclwiPnt7IGlkeCArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bHNlLXJpbmdcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFN1Y2Nlc3MgU3RlcCBJY29uIChHcmVlbiBjaGVja21hcmsgd2l0aCBzcHJpbmctdXAgYW5pbWF0aW9uKSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtaWNvbiBzdWNjZXNzLWljb24gYW5pbWF0ZS1zdWNjZXNzXCIgKm5nSWY9XCJzdGVwPy5zdGF0dXMgPT09ICdzdWNjZXNzJ1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQZW5kaW5nIFN0ZXAgSWNvbiAoRGltbWVkIHNpbXBsZSBudW1iZXIvZG90KSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtaWNvbiBwZW5kaW5nLWljb25cIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ3BlbmRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLW51bWJlclwiPnt7IGlkeCArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtY29udGVudFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1sYWJlbFwiPnt7IHN0ZXA/LmxhYmVsIHx8ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwLWRlc2NcIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ2FjdGl2ZSdcIj5Qcm9jZXNzaW5nLCBwbGVhc2Ugd2FpdDxzcGFuIGNsYXNzPVwiZG90cy1wdWxzZVwiPjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtZGVzYyBzdWNjZXNzLWRlc2NcIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+Q29tcGxldGVkIHN1Y2Nlc3NmdWxseTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1kZXNjIHBlbmRpbmctZGVzY1wiICpuZ0lmPVwic3RlcD8uc3RhdHVzID09PSAncGVuZGluZydcIj5VcGNvbWluZy4uLjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIEJlYXV0aWZ1bCBJbnN0YWxsYXRpb24gQ29tcGxldGUgRGlhbG9nIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2luc3RhbGxDb21wbGV0ZVRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJzaW1wby1kaWFsb2ctY29udGFpbmVyIGNvbXBsZXRlLWRpYWxvZy1jYXJkIGFuaW1hdGUtY29tcGxldGUtcG9wXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGUtaGVhZGVyLWFydFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3BhcmtsZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIG9uZVwiPuKcqDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgdHdvXCI+4pyoPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSB0aHJlZVwiPvCfjok8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGUtaWNvbi13cmFwcGVyXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnZlcmlmaWVkPC9tYXQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic2ltcG8tZGlhbG9nLWhlYWRlciB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3VjY2Vzcy1iYWRnZS10ZXh0XCI+SU5TVEFMTEFUSU9OIENPTVBMRVRFRDwvZGl2PlxyXG4gICAgICA8aDMgY2xhc3M9XCJjb21wbGV0ZS10aXRsZVwiPllvdXIgQXBwb2ludG1lbnQgQXBwIGlzIFJlYWR5ITwvaDM+XHJcbiAgICAgIDxwIGNsYXNzPVwiY29tcGxldGUtbWVzc2FnZVwiPlxyXG4gICAgICAgIEZvciBiZXR0ZXIgZXhwZXJpZW5jZSBjcmVhdGUgc2VydmljZSBhbmQgYXNzaWduIHN0YWZmIHRvIGNyZWF0ZWQgc2VydmljZVxyXG4gICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic2ltcG8tZGlhbG9nLWJvZHkgdGV4dC1jZW50ZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICA8IS0tIERpcmVjdGluZyBBY3Rpb24gQnV0dG9uIC0tPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXJlZGlyZWN0IHctMTAwXCIgKGNsaWNrKT1cInJlZGlyZWN0VG9BcHBvaW50bWVudHMoKVwiPlxyXG4gICAgICAgIDxzcGFuPkNyZWF0ZSBTZXJ2aWNlICYgQXNzaWduIFN0YWZmPC9zcGFuPlxyXG4gICAgICAgIDxtYXQtaWNvbj5hcnJvd19mb3J3YXJkPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8IS0tIERpc21pc3MgYnV0dG9uIC0tPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWRpc21pc3NcIiAoY2xpY2spPVwiY2xvc2VBbGxEaWFsb2dzKClcIj5cclxuICAgICAgICBNYXliZSBMYXRlclxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
564
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXNlY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9hZGQtc2VjdGlvbi9hZGQtc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL2FkZC1zZWN0aW9uL2FkZC1zZWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBWSxTQUFTLEVBQWtDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxlQUFlLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUl2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQWUsV0FBVyxFQUFXLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQVluRSxNQUFNLE9BQU8sbUJBQW1CO0lBYTlCLFlBQW1CLE1BQXlDLEVBQzFCLElBQVMsRUFDakMsSUFBZ0IsRUFDaEIsYUFBNEIsRUFDNUIsYUFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsU0FBb0IsRUFDcEIsTUFBZSxFQUNmLEdBQXNCO1FBVGIsV0FBTSxHQUFOLE1BQU0sQ0FBbUM7UUFDMUIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixtQkFB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LENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDbEIsQ0FBQzsrR0Eva0JVLG1CQUFtQiw4Q0FjcEIsZUFBZTttR0FkZCxtQkFBbUIsc1VDcEJoQyw4cTNDQTB1QmMsMDZuQkQxdEJGLFlBQVksMFpBQUUsYUFBYSxtTEFBRSx1QkFBdUIsOE1BQUUsV0FBVyxpbkJBQUUsZUFBZTs7NEZBSWpGLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDOzswQkFrQjFGLE1BQU07MkJBQUMsZUFBZTs2UUFWYSx1QkFBdUI7c0JBQTVELFNBQVM7dUJBQUMseUJBQXlCO2dCQUNFLHVCQUF1QjtzQkFBNUQsU0FBUzt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE5nTW9kdWxlLCBWaWV3Q2hpbGQsIFRlbXBsYXRlUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYsIE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudFNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vZWRpdG9yLXNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3hTa2VsZXRvbkxvYWRlck1vZHVsZSB9IGZyb20gJ25neC1za2VsZXRvbi1sb2FkZXInO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLWFkZC1zZWN0aW9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTmd4U2tlbGV0b25Mb2FkZXJNb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXREaWFsb2dNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYWRkLXNlY3Rpb24uY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgQWRkU2VjdGlvbkNvbXBvbmVudCB7XG5cbiAgT2JqZWN0PzogT2JqZWN0XG5cbiAgQFZpZXdDaGlsZCgnaW5zdGFsbFByb2dyZXNzVGVtcGxhdGUnKSBpbnN0YWxsUHJvZ3Jlc3NUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ2luc3RhbGxDb21wbGV0ZVRlbXBsYXRlJykgaW5zdGFsbENvbXBsZXRlVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGluc3RhbGxTdGVwcyA9IFtcbiAgICB7IGxhYmVsOiAnSW5zdGFsbGluZyBhcHBvaW50bWVudCBhcHAnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgIHsgbGFiZWw6ICdDcmVhdGluZyByZXF1aXJlZCBwYWdlcyBmb3IgeW91ciBhcHAnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgIHsgbGFiZWw6ICdDcmVhdGluZyBvbmUgc3RvcmUnLCBzdGF0dXM6ICdwZW5kaW5nJyB9XG4gIF07XG5cbiAgY29uc3RydWN0b3IocHVibGljIGRpYWxvZzogTWF0RGlhbG9nUmVmPEFkZFNlY3Rpb25Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBFbGVtZW50U2VydmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50U2VydmljZTogRWxlbWVudFNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByb3V0ZXIgOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgYnVzaW5lc3NUeXBlOiAnU1RBVElDJyB8ICdFX0NPTU1FUkNFJyA9ICdFX0NPTU1FUkNFJztcblxuICBpbnN0YWxsaW5nQXBwOiBhbnkgPSBudWxsO1xuXG4gIC8vIOKUgOKUgCBBcHBzIHRhYiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZXhwYW5kZWRBcHBzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9ICAgIC8vIHRyYWNrcyB3aGljaCBhcHAgY2F0ZWdvcnkgaXMgZXhwYW5kZWQgaW4gbGVmdCBzaWRlYmFyXG4gIHNlbGVjdGVkQXBwOiBzdHJpbmcgPSBcIlwiICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFja3Mgd2hpY2ggYXBwIGlzIGN1cnJlbnRseSBzZWxlY3RlZC9hY3RpdmVcbiAgc2VsZWN0ZWRBcHBTZWN0aW9uczogYW55W10gPSBbXSAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSBzZWN0aW9ucyBvZiB0aGUgc2VsZWN0ZWQgYXBwXG4gIHNlbGVjdGVkQXBwQ29tcG9uZW50OiBhbnkgPSBudWxsICAgICAgICAgICAgICAgICAvLyB0cmFja3Mgd2hpY2ggY29tcG9uZW50IGluc2lkZSB0aGUgc2VsZWN0ZWQgYXBwIGlzIGN1cnJlbnRseSBzZWxlY3RlZC9oaWdobGlnaHRlZFxuXG4gIGFwcEljb25NYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCJFLWNvbW1lcmNlXCI6IFwi8J+bje+4j1wiLFxuICAgIFwiQXBwb2ludG1lbnRcIjogXCLwn5OFXCIsXG4gICAgXCJDUk1cIjogXCLwn5GlXCIsXG4gICAgXCJQYXNzQm9va1wiOiBcIvCfkrNcIixcbiAgICBcIlBhc3Nib29rXCI6IFwi8J+Ss1wiLFxuICAgIFwiUmVmZXIgYW5kIEVhcm5cIjogXCLwn46BXCJcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGJ1c2luZXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JEZXRhaWxzJykgfHwgJyc7XG4gICAgdGhpcy5idXNpbmVzc1R5cGUgPSBidXNpbmVzcyA/IEpTT04ucGFyc2UoYnVzaW5lc3MpPy50eXBlIDogJ1NUQVRJQydcbiAgICB0aGlzLmdldEFsbFNlY3Rpb25zKCk7XG4gIH1cblxuICBzZWxlY3RlZFRhYjogc3RyaW5nID0gXCJCQVNJQ1wiXG4gIHB1YmxpYyBidXNpbmVzc0lkOiBzdHJpbmcgfCBudWxsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJidXNpbmVzc0lkXCIpO1xuICB0YWJzOiBhbnkgPSBbXG4gICAgeyB2YWx1ZTogXCJCQVNJQ1wiLCB2aWV3VmFsdWU6IFwiU2VjdGlvbiBTdHVkaW9cIiB9LFxuICAgIC8vIHsgdmFsdWU6IFwiSU5URUdSQVRJT05TXCIsIHZpZXdWYWx1ZTogXCJEeW5hbWljXCIgfSxcbiAgICB7IHZhbHVlOiBcIkFQUFNcIiwgdmlld1ZhbHVlOiBcIkFwcHNcIiB9LFxuICAgIHsgdmFsdWU6IFwiU0FWRURcIiwgdmlld1ZhbHVlOiBcIlNhdmVkXCIgfVxuICBdXG5cbiAgc2VjdGlvbnM6IGFueSA9IFtdXG4gIHNlbGVjdGVkU2VjdGlvbjogYW55ID0gW11cbiAgc2VsZWN0ZWRTZWN0aW9uTmFtZTogYW55ID0gXCJcIlxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZVxuICB0YWJTaGlmdExvYWRlcjogYm9vbGVhbiA9IGZhbHNlXG4gIHJlZmVyRWFybkV4aXN0OiBib29sZWFuID0gZmFsc2VcbiAgZXhwYW5kZWRDYXRlZ29yaWVzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XG5cblxuICBzZWxlY3RlZENvbXBvbmVudDogYW55ID0gbnVsbFxuXG4gIC8vIOKUgOKUgCBTYXZlZCB0YWIgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNhdmVkU2VjdGlvbnM6IGFueSA9IHt9XG4gIHNhdmVkQ2F0ZWdvcnlLZXlzOiBzdHJpbmdbXSA9IFtdXG4gIHNhdmVkTG9hZGVyOiBib29sZWFuID0gZmFsc2VcbiAgc2VsZWN0ZWRTYXZlZENhdGVnb3J5OiBzdHJpbmcgPSAnJ1xuICBzZWxlY3RlZFNhdmVkQ29tcG9uZW50OiBhbnkgPSBudWxsXG5cbiAgLy8gTmV3OiBlbW9qaSBtYXAgZm9yIGNhdGVnb3JpZXNcbiAgY2F0ZWdvcnlFbW9qaU1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAvLyAnSGVybyc6ICfwn5a877iPJyxcbiAgICAvLyAnU2VydmljZXMnOiAn8J+OgScsXG4gICAgLy8gJ0ZlYXR1cmUnOiAn4pyoJyxcbiAgICAvLyAnSG93IEl0IFdvcmtzJzogJ+KEue+4jycsXG4gICAgLy8gJ1Rlc3RpbW9uaWFsJzogJ+KtkCcsXG4gICAgLy8gJ1ByaWNpbmcnOiAn8J+SsCcsXG4gICAgLy8gJ0ZhcSc6ICfinZMnLFxuICAgIC8vICdCbG9ncyc6ICfwn5OdJyxcbiAgICAvLyAnTWlzY2VsbGFuZW91cyc6ICfwn5SnJyxcbiAgICAvLyAnVGV4dCc6ICfwn5OEJyxcbiAgICAvLyAnTG9nbyc6ICfwn4+377iPJyxcbiAgICAvLyAnQ29udGFjdCc6ICfinInvuI8nLFxuICAgIC8vICdDVEEnOiAn8J+ToicsXG4gICAgLy8gJ1RlYW0nOiAn8J+RpScsXG4gICAgLy8gJ1ZpZGVvJzogJ/CfjqwnLFxuICAgIC8vICdJbWFnZSAnOiAn8J+WvO+4jycsXG4gICAgJ0hlcm8nOiAn8J+agCcsXG4gICdTZXJ2aWNlcyc6ICfwn6ewJyxcbiAgJ0ZlYXR1cmUnOiAn4pyoJyxcbiAgJ0hvdyBJdCBXb3Jrcyc6ICfwn6qEJyxcbiAgJ1Rlc3RpbW9uaWFsJzogJ+KtkCcsXG4gICdQcmljaW5nJzogJ/CfkrAnLFxuICAnRmFxJzogJ+KdkycsXG4gICdCbG9ncyc6ICfwn5OwJyxcblxuICAnQ2hvb3NlIFVzJzogJ/Cfm6HvuI8nLFxuICAnTG9nbyBDbG91ZCc6ICfwn4+iJyxcbiAgJ05ld3NsZXR0ZXInOiAn8J+TqScsXG5cbiAgJ01pc2NlbGxhbmVvdXMnOiAn8J+TgicsXG4gICdUZXh0JzogJ+Kcje+4jycsXG4gICdMb2dvJzogJ/CfjIgnLFxuXG4gICdDb250YWN0JzogJ+KYju+4jycsXG4gICdDb250YWN0IFVzJzogJ/Cfk54nLFxuXG4gICdDVEEnOiAn8J+UpScsXG4gICdUZWFtJzogJ/CfkaUnLFxuXG4gICdBYm91dCc6ICfihLnvuI8nLFxuICAnR2FsbGVyeSc6ICfwn5a877iPJyxcblxuICAnVmlkZW8nOiAn8J+OrCcsXG4gICdJbWFnZSc6ICfwn5a877iPJ1xuICB9XG5cbiAgZ2V0Q2F0ZWdvcnlFbW9qaShjYXRlZ29yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYXRlZ29yeUVtb2ppTWFwW2NhdGVnb3J5XSB8fCAn8J+TpidcbiAgfVxuXG4gIGdldEZpcnN0U2VjdGlvbk5hbWUoY2F0ZWdvcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zW2NhdGVnb3J5XVxuICAgIGlmIChzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc2VjdGlvbnNbMF0uc2VjdGlvbk5hbWUgfHwgY2F0ZWdvcnlcbiAgICB9XG4gICAgcmV0dXJuIGNhdGVnb3J5XG4gIH1cblxuICAvLyBDYWxsZWQgYnkgdGFiIGNsaWNrIOKAlCB0cmlnZ2VycyBzYXZlZCBBUEkgb24gZmlyc3QgdmlzaXRcbiAgb25UYWJTZWxlY3QodmFsdWU6IHN0cmluZykge1xuICAgIC8vIFVuc2VsZWN0IGFsbCBhY3RpdmUgY29tcG9uZW50IHNlbGVjdGlvbnMgd2hlbiBzd2l0Y2hpbmcgdGFic1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuc2VsZWN0ZWRTYXZlZENvbXBvbmVudCA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZEFwcCA9IFwiXCI7XG4gICAgdGhpcy5leHBhbmRlZEFwcHMgPSB7fTtcblxuICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSB2YWx1ZTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkVGFiKVxuICAgIGlmICh2YWx1ZSA9PT0gJ1NBVkVEJyAmJiAhdGhpcy5zYXZlZExvYWRlcikge1xuICAgICAgdGhpcy5nZXRTYXZlZFNlY3Rpb25zKClcbiAgICB9XG4gICAgZWxzZSBpZih2YWx1ZSA9PSAnQkFTSUMnKXtcbiAgICAgIHRoaXMuZ2V0QWxsU2VjdGlvbnMoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUgPT09ICdBUFBTJykge1xuICAgICAgdGhpcy5nZXRBbGxBcHBzKCk7ICBcbiAgICB9XG4gIH1cblxuICBhcHBzTGlzdDogYW55W10gPSBbXTtcbiAgYXBwc0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldEFsbEFwcHMoKSB7XG4gICAgdGhpcy5hcHBzTG9hZGVyID0gdHJ1ZTtcbiAgICB0aGlzLmFwcHNMaXN0ID0gW107XG4gICAgdGhpcy5lbGVtZW50U2VydmljZS5nZXRBbGxhcHBzKHRoaXMuYnVzaW5lc3NJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFwcHNMaXN0ID0gcmVzLmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMuYXBwc0xvYWRlciA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEF1dG8tZXhwYW5kIGFuZCBzZWxlY3QgZmlyc3QgYXBwIGlmIGF2YWlsYWJsZSBvbiB0YWIgbG9hZFxuICAgICAgICBpZiAodGhpcy5hcHBzTGlzdC5sZW5ndGggPiAwICYmICF0aGlzLnNlbGVjdGVkQXBwKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RBcHAgPSB0aGlzLmFwcHNMaXN0WzBdO1xuICAgICAgICAgIHRoaXMudG9nZ2xlQXBwQ2F0ZWdvcnkoZmlyc3RBcHAuYXBwTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgIHRoaXMuYXBwc0xvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlQXBwQ2F0ZWdvcnkoYXBwTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXBwID0gdGhpcy5hcHBzTGlzdC5maW5kKGEgPT4gYS5hcHBOYW1lID09PSBhcHBOYW1lKTtcbiAgICBpZiAoIWFwcCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZXhwYW5kZWRBcHBzW2FwcE5hbWVdKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQXBwc1thcHBOYW1lXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZEFwcCA9IFwiXCI7XG4gICAgICB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmV4cGFuZGVkQXBwcykuZm9yRWFjaChrID0+IHRoaXMuZXhwYW5kZWRBcHBzW2tdID0gZmFsc2UpO1xuXG4gICAgICBpZiAoYXBwLmFwcEluc3RhbGxlZCkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkQXBwc1thcHBOYW1lXSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBhcHBOYW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnMgPSBhcHAuY29tcG9uZW50cyB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRBcHBTZWN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQXBwQ29tcG9uZW50ID0gdGhpcy5zZWxlY3RlZEFwcFNlY3Rpb25zWzBdLmRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEFwcENvbXBvbmVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBhcHBOYW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFwcENvbXBvbmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVJbnN0YWxsYXRpb24oYXBwOiBhbnksIHByb2dyZXNzUmVmOiBhbnkpIHtcbiAgICBhcHAuYXBwSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmV4cGFuZGVkQXBwc1thcHAuYXBwTmFtZV0gPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRBcHAgPSBhcHAuYXBwTmFtZTtcbiAgICB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnMgPSBhcHAuY29tcG9uZW50cyB8fCBbXTtcbiAgICBwcm9ncmVzc1JlZi5jbG9zZSgpO1xuICAgIFxuICAgIGlmIChhcHAuYXBwTmFtZSA9PT0gJ0FwcG9pbnRtZW50Jykge1xuICAgICAgdGhpcy5vcGVuSW5zdGFsbENvbXBsZXRlRGlhbG9nKCk7XG4gICAgfVxuICB9XG5cbiAgaW5zdGFsbEFwcChhcHA6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmluc3RhbGxpbmdBcHAgPSBhcHA7XG5cbiAgICAvLyAxLiBSZXNldCBzdGVwcyB0byBzdGVwIDAgYWN0aXZlXG4gICAgdGhpcy5pbnN0YWxsU3RlcHMgPSBbXG4gICAgICB7IGxhYmVsOiBgSW5zdGFsbGluZyAke2FwcC5hcHBOYW1lfSBhcHBgLCBzdGF0dXM6ICdhY3RpdmUnIH0sXG4gICAgICB7IGxhYmVsOiAnQ3JlYXRpbmcgcmVxdWlyZWQgcGFnZXMgZm9yIHlvdXIgYXBwJywgc3RhdHVzOiAncGVuZGluZycgfVxuICAgIF07XG5cbiAgICBpZiAoYXBwLmFwcE5hbWUgPT09ICdBcHBvaW50bWVudCcpIHtcbiAgICAgIHRoaXMuaW5zdGFsbFN0ZXBzLnB1c2goeyBsYWJlbDogJ0NyZWF0aW5nIG9uZSBzdG9yZScsIHN0YXR1czogJ3BlbmRpbmcnIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAvLyAyLiBPcGVuIHByb2dyZXNzIGRpYWxvZyBpbiBjZW50ZXIgb2YgdGhlIHBhZ2VcbiAgICBjb25zdCBwcm9ncmVzc1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4odGhpcy5pbnN0YWxsUHJvZ3Jlc3NUZW1wbGF0ZSwge1xuICAgICAgd2lkdGg6ICc0ODBweCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBwYW5lbENsYXNzOiAnc2ltcG8taW5zdGFsbC1kaWFsb2ctcGFuZWwnXG4gICAgfSk7XG5cbiAgICBsZXQgYXBpRG9uZSA9IGZhbHNlO1xuICAgIGxldCBwcm9ncmVzc0RvbmUgPSBmYWxzZTtcblxuICAgIC8vIDMuIFRyaWdnZXIgQVBJIENhbGxcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UuaW5zdGFsbEFwcChhcHAuYXBwSWQsIHRoaXMuYnVzaW5lc3NJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBhcGlEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBpZiAocHJvZ3Jlc3NEb25lKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUluc3RhbGxhdGlvbihhcHAsIHByb2dyZXNzUmVmKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXBwIGluc3RhbGxhdGlvbiBmYWlsZWQnLCBlcnIpO1xuICAgICAgICBwcm9ncmVzc1JlZi5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gNC4gQW5pbWF0ZWQgcHJvZ3Jlc3Npb24gYmFzZWQgb24gbnVtYmVyIG9mIHN0ZXBzXG4gICAgaWYgKGFwcC5hcHBOYW1lID09PSAnQXBwb2ludG1lbnQnKSB7XG4gICAgICAvLyAzLXN0ZXAgZmxvdyAoNiBzZWNvbmRzIHRvdGFsKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3RhbGxTdGVwc1swXSkgdGhpcy5pbnN0YWxsU3RlcHNbMF0uc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMV0pIHRoaXMuaW5zdGFsbFN0ZXBzWzFdLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCAyMDAwKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3RhbGxTdGVwc1sxXSkgdGhpcy5pbnN0YWxsU3RlcHNbMV0uc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMl0pIHRoaXMuaW5zdGFsbFN0ZXBzWzJdLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LCA0MDAwKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3RhbGxTdGVwc1syXSkgdGhpcy5pbnN0YWxsU3RlcHNbMl0uc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHByb2dyZXNzRG9uZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKGFwaURvbmUpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlSW5zdGFsbGF0aW9uKGFwcCwgcHJvZ3Jlc3NSZWYpO1xuICAgICAgICB9XG4gICAgICB9LCA2MDAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMi1zdGVwIGZsb3cgKDQgc2Vjb25kcyB0b3RhbClcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMF0pIHRoaXMuaW5zdGFsbFN0ZXBzWzBdLnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFsbFN0ZXBzWzFdKSB0aGlzLmluc3RhbGxTdGVwc1sxXS5zdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSwgMjAwMCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnN0YWxsU3RlcHNbMV0pIHRoaXMuaW5zdGFsbFN0ZXBzWzFdLnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBwcm9ncmVzc0RvbmUgPSB0cnVlO1xuXG4gICAgICAgIGlmIChhcGlEb25lKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUluc3RhbGxhdGlvbihhcHAsIHByb2dyZXNzUmVmKTtcbiAgICAgICAgfVxuICAgICAgfSwgNDAwMCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0T3ZlcmFsbFByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pbnN0YWxsU3RlcHMgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5pbnN0YWxsU3RlcHMpIHx8IHRoaXMuaW5zdGFsbFN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gdGhpcy5pbnN0YWxsU3RlcHMuZmlsdGVyKHMgPT4gcyAmJiBzLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKS5sZW5ndGg7XG4gICAgY29uc3QgYWN0aXZlQ291bnQgPSB0aGlzLmluc3RhbGxTdGVwcy5maWx0ZXIocyA9PiBzICYmIHMuc3RhdHVzID09PSAnYWN0aXZlJykubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5pbnN0YWxsU3RlcHMubGVuZ3RoO1xuICAgIHJldHVybiAoY29tcGxldGVkQ291bnQgLyB0b3RhbCkgKiAxMDAgKyAoYWN0aXZlQ291bnQgPiAwID8gKDEgLyB0b3RhbCkgKiA1MCA6IDApO1xuICB9XG5cbiAgb3Blbkluc3RhbGxDb21wbGV0ZURpYWxvZygpIHtcbiAgICB0aGlzLm1hdERpYWxvZy5vcGVuKHRoaXMuaW5zdGFsbENvbXBsZXRlVGVtcGxhdGUsIHtcbiAgICAgIHdpZHRoOiAnNTIwcHgnLFxuICAgICAgcGFuZWxDbGFzczogJ3NpbXBvLWNvbXBsZXRlLWRpYWxvZy1wYW5lbCdcbiAgICB9KTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9BcHBvaW50bWVudHMoKSB7XG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcbiAgICAvLyB3aW5kb3cub3BlbignaHR0cHM6Ly9kZXYtYXBwLnNpbXBvLmFpL2FkbWluL2FwcG9pbnRtZW50cy9tYW5hZ2UtYXBwb2ludG1lbnRzJywgJ19ibGFuaycpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2FwcG9pbnRtZW50cy9tYW5hZ2UtYXBwb2ludG1lbnRzJ10pXG4gIH1cblxuICBjbG9zZUFsbERpYWxvZ3MoKSB7XG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XG5cbiAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoY3VycmVudFVybCk7XG4gIH0pO1xuICB9XG5cbiAgc2VsZWN0QXBwQ29tcG9uZW50KHNlY0RhdGE6IGFueSwgYXBwTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZEFwcENvbXBvbmVudCA9IHNlY0RhdGE7XG4gICAgY29uc3QgYXBwID0gdGhpcy5hcHBzTGlzdC5maW5kKGEgPT4gYS5hcHBOYW1lID09PSBhcHBOYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkQXBwU2VjdGlvbnMgPSBhcHAgPyAoYXBwLmNvbXBvbmVudHMgfHwgW10pIDogW107XG4gICAgdGhpcy5zZWxlY3RlZEFwcCA9IGFwcE5hbWU7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmV4cGFuZGVkQXBwcykuZm9yRWFjaChrID0+IHRoaXMuZXhwYW5kZWRBcHBzW2tdID0gZmFsc2UpO1xuICAgIHRoaXMuZXhwYW5kZWRBcHBzW2FwcE5hbWVdID0gdHJ1ZTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtY29tcC0nICsgc2VjRGF0YS5jb21wb25lbnRJZCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHNlbGVjdEFwcENvbXBvbmVudEFuZEhpZ2hsaWdodChlbGU6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQgPSBlbGU7XG4gIH1cblxuICBnZXRTZWxlY3RlZEFwcE9iaigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBzTGlzdC5maW5kKGEgPT4gYS5hcHBOYW1lID09PSB0aGlzLnNlbGVjdGVkQXBwKTtcbiAgfVxuXG4gIHRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5leHBhbmRlZENhdGVnb3JpZXNbY2F0ZWdvcnldKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllc1tjYXRlZ29yeV0gPSBmYWxzZVxuICAgICAgdGhpcy5zZWxlY3RlZFNlY3Rpb24gPSBbXVxuICAgICAgdGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lID0gXCJcIlxuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5leHBhbmRlZENhdGVnb3JpZXMpLmZvckVhY2goayA9PiB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllc1trXSA9IGZhbHNlKVxuICAgICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXNbY2F0ZWdvcnldID0gdHJ1ZVxuICAgICAgdGhpcy5zZWxlY3RTZWN0aW9uKGNhdGVnb3J5KVxuICAgIH1cbiAgfVxuXG4gIGdldFNhdmVkU2VjdGlvbnMoKSB7XG4gICAgdGhpcy5zYXZlZExvYWRlciA9IHRydWVcbiAgICB0aGlzLnNhdmVkU2VjdGlvbnMgPSB7fVxuICAgIHRoaXMuc2F2ZWRDYXRlZ29yeUtleXMgPSBbXVxuICAgIHRoaXMuc2VsZWN0ZWRTYXZlZENhdGVnb3J5ID0gJydcbiAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQgPSBudWxsXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEFsbFNhdmVkU2VjdGlvbnNBcGkodGhpcy5idXNpbmVzc0lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGE/LmFkZE5ld1NlY3Rpb24pIHtcbiAgICAgICAgICBkZWxldGUgcmVzLmRhdGEuYWRkTmV3U2VjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhdmVkU2VjdGlvbnMgPSByZXMuZGF0YSB8fCB7fVxuICAgICAgICB0aGlzLnNhdmVkQ2F0ZWdvcnlLZXlzID0gT2JqZWN0LmtleXModGhpcy5zYXZlZFNlY3Rpb25zKVxuICAgICAgICBpZiAodGhpcy5zYXZlZENhdGVnb3J5S2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFNhdmVkQ2F0ZWdvcnkgPSB0aGlzLnNhdmVkQ2F0ZWdvcnlLZXlzWzBdXG4gICAgICAgICAgaWYgKHRoaXMuc2F2ZWRTZWN0aW9uc1t0aGlzLnNlbGVjdGVkU2F2ZWRDYXRlZ29yeV0/LmNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNhdmVkQ29tcG9uZW50ID0gdGhpcy5zYXZlZFNlY3Rpb25zW3RoaXMuc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2F2ZWRMb2FkZXIgPSBmYWxzZVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuc2F2ZWRMb2FkZXIgPSBmYWxzZSB9XG4gICAgfSlcbiAgfVxuXG4gIHNlbGVjdFNhdmVkQ2F0ZWdvcnkoY2F0ZWdvcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRTYXZlZENhdGVnb3J5ID0gY2F0ZWdvcnlLZXlcbiAgICBpZiAodGhpcy5zYXZlZFNlY3Rpb25zW2NhdGVnb3J5S2V5XT8uY29tcG9uZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQgPSB0aGlzLnNhdmVkU2VjdGlvbnNbY2F0ZWdvcnlLZXldLmNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNhdmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RTYXZlZENvbXBvbmVudChjb21wOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkU2F2ZWRDb21wb25lbnQgPSBjb21wO1xuICB9XG5cbiAgYWRkU2F2ZWRTZWN0aW9uKGNvbXBvbmVudDogYW55LCBldmVudDogYW55KSB7XG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmFkZE5ld1NlY3Rpb25DbGljay5lbWl0KHtcbiAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnQuY29tcG9uZW50SWQsXG4gICAgICBpZDogY29tcG9uZW50LmlkLFxuICAgICAgaW5kZXg6IHRoaXMuZGF0YS5pbmRleCxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLmRhdGEucG9zaXRpb24sXG4gICAgICBzdGF0dXM6IHRydWUsXG4gICAgICBzZWN0aW9uVHlwZTogY29tcG9uZW50LnNlY3Rpb25UeXBlLFxuICAgICAgc2F2ZWRDb21wb25lbnQ6IGNvbXBvbmVudFxuICAgIH0pO1xuICAgIHRoaXMuZGlhbG9nLmNsb3NlKCk7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHNlbGVjdENvbXBvbmVudChzZWM6IGFueSwgY2F0ZWdvcnk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWNcbiAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbiA9IHRoaXMuc2VjdGlvbnNbY2F0ZWdvcnldXG4gICAgdGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lID0gY2F0ZWdvcnlcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzKS5mb3JFYWNoKGsgPT4gdGhpcy5leHBhbmRlZENhdGVnb3JpZXNba10gPSBmYWxzZSlcbiAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllc1tjYXRlZ29yeV0gPSB0cnVlXG5cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wLScgKyBzZWMuY29tcG9uZW50SWQpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBzZWxlY3RDb21wb25lbnRBbmRIaWdobGlnaHQoZWxlOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50ID0gZWxlXG4gIH1cblxuICBzZWxlY3RTZWN0aW9uKGVsZTogYW55KSB7XG4gICAgdGhpcy50YWJTaGlmdExvYWRlciA9IHRydWVcbiAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbiA9IHRoaXMuc2VjdGlvbnNbZWxlXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbk5hbWUgPSBlbGU7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTZWN0aW9uPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLnNlbGVjdGVkU2VjdGlvblswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50YWJTaGlmdExvYWRlciA9IGZhbHNlXG4gICAgfSwgODAwKTtcbiAgfVxuXG4gIGdldEFsbFNlY3Rpb25zKCkge1xuICAgIHRoaXMuY2hlY2tBcHBJbnN0YWxsZWQoKVxuICAgIHRoaXMubG9hZGVyID0gdHJ1ZVxuICAgIHRoaXMuZWRpdG9yU2VydmljZS5nZXRDb21wb25lbnRBcGkodGhpcy5idXNpbmVzc1R5cGUgPT09ICdTVEFUSUMnID8gdGhpcy5idXNpbmVzc1R5cGUgOiB1bmRlZmluZWQpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IHJlcy5kYXRhXG4gICAgICAgIGlmIChyZXM/LmRhdGE/LkFwcG9pbnRtZW50KSB7XG4gICAgICAgICAgZGVsZXRlIHJlcy5kYXRhLkFwcG9pbnRtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZWZlckVhcm5FeGlzdCkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgZGF0YVtrZXldID0gZGF0YVtrZXldLmZpbHRlcihcbiAgICAgICAgICAgICAgKHNlY3Rpb246IGFueSkgPT4gc2VjdGlvbi5zZWN0aW9uVHlwZSAhPT0gJ3JlZmVyZWFybidcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBkYXRhXG4gICAgICAgIHRoaXMuZHVtbXlTZWN0aW9ucyA9IGRhdGFcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lID0gT2JqZWN0LmtleXModGhpcy5zZWN0aW9ucylbMF1cbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlY3Rpb24gPSB0aGlzLnNlY3Rpb25zW3RoaXMuc2VsZWN0ZWRTZWN0aW9uTmFtZV1cblxuICAgICAgICAvLyBBdXRvLWV4cGFuZCBmaXJzdCBjYXRlZ29yeVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lKSB7XG4gICAgICAgICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXNbdGhpcy5zZWxlY3RlZFNlY3Rpb25OYW1lXSA9IHRydWVcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNlY3Rpb24/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IHRoaXMuc2VsZWN0ZWRTZWN0aW9uWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2VcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBjaGVja0FwcEluc3RhbGxlZCgpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNoZWNrQXBwSW5zdGFsbGVkKHRoaXMuYnVzaW5lc3NJZCwgJ1JlZmVyIGFuZCBFYXJuJykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnJlZmVyRWFybkV4aXN0ID0gcmVzLmRhdGFcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7IH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0T2JqZWN0S2V5cyhvYmo6IGFueSk6IGFueVtdIHtcbiAgICByZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKSA6IFtdO1xuICB9XG5cbiAgZ2V0U2VjdGlvbkxlbmd0aChzZWN0aW9uOiBhbnkpIHtcbiAgICByZXR1cm4gTnVtYmVyKE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aClcbiAgfVxuXG4gIGFkZE5ld1NlY3Rpb24oY29tcG9uZW50SWQ6IGFueSwgc2VjdGlvblR5cGU6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuX2V2ZW50U2VydmljZS5hZGROZXdTZWN0aW9uQ2xpY2suZW1pdCh7XG4gICAgICBjb21wb25lbnRJZDogY29tcG9uZW50SWQsXG4gICAgICBpbmRleDogdGhpcy5kYXRhLmluZGV4LFxuICAgICAgcG9zaXRpb246IHRoaXMuZGF0YS5wb3NpdGlvbixcbiAgICAgIHN0YXR1czogdHJ1ZSxcbiAgICAgIHNlY3Rpb25UeXBlOiBzZWN0aW9uVHlwZVxuICAgIH0pO1xuICAgIHRoaXMuZGlhbG9nLmNsb3NlKCk7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIGFkZEFwcFNlY3Rpb24oY29tcG9uZW50OiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLl9ldmVudFNlcnZpY2UuYWRkTmV3U2VjdGlvbkNsaWNrLmVtaXQoe1xuICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudC5jb21wb25lbnRJZCxcbiAgICAgIGlkOiBjb21wb25lbnQuaWQgfHwgbnVsbCxcbiAgICAgIGluZGV4OiB0aGlzLmRhdGEuaW5kZXgsXG4gICAgICBwb3NpdGlvbjogdGhpcy5kYXRhLnBvc2l0aW9uLFxuICAgICAgc3RhdHVzOiB0cnVlLFxuICAgICAgc2VjdGlvblR5cGU6IGNvbXBvbmVudC5zZWN0aW9uVHlwZSxcbiAgICAgIHNhdmVkQ29tcG9uZW50OiBjb21wb25lbnRcbiAgICB9KTtcbiAgICB0aGlzLmRpYWxvZy5jbG9zZSgpO1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBoYW5kbGVBZGRTZWN0aW9uKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ0JBU0lDJyAmJiB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmFkZE5ld1NlY3Rpb24odGhpcy5zZWxlY3RlZENvbXBvbmVudC5jb21wb25lbnRJZCwgdGhpcy5zZWxlY3RlZENvbXBvbmVudC5zZWN0aW9uVHlwZSwgZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ0FQUFMnICYmIHRoaXMuc2VsZWN0ZWRBcHBDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuYWRkQXBwU2VjdGlvbih0aGlzLnNlbGVjdGVkQXBwQ29tcG9uZW50LCBldmVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnU0FWRUQnICYmIHRoaXMuc2VsZWN0ZWRTYXZlZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5hZGRTYXZlZFNlY3Rpb24odGhpcy5zZWxlY3RlZFNhdmVkQ29tcG9uZW50LCBldmVudCk7XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoVGV4dDogc3RyaW5nID0gXCJcIlxuICBkdW1teVNlY3Rpb25zOiBhbnlcbiAgZHVtbXkyOiBhbnkgPSB7fVxuICBpc1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgc2VhcmNoU2VjdGlvbnMoKSB7XG4gICAgdGhpcy5pc1NlYXJjaCA9IGZhbHNlXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5zZWN0aW9ucyA9IHRoaXMuZHVtbXlTZWN0aW9uc1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZHVtbXkyID0ge31cbiAgICBmb3IgKGxldCBlbGUgb2YgT2JqZWN0LmtleXModGhpcy5kdW1teVNlY3Rpb25zKSkge1xuICAgICAgaWYgKGVsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aGlzLmR1bW15MltlbGVdID0gWy4uLnRoaXMuZHVtbXlTZWN0aW9uc1tlbGVdXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGogb2YgdGhpcy5kdW1teVNlY3Rpb25zW2VsZV0pIHtcbiAgICAgICAgICBpZiAoai5zZWN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmR1bW15MltlbGVdKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXkyW2VsZV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHVtbXkyW2VsZV0ucHVzaChqKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWN0aW9ucyA9IHsgLi4udGhpcy5kdW1teTIgfTtcbiAgICBpZiAodGhpcy5nZXRTZWN0aW9uTGVuZ3RoKHRoaXMuc2VjdGlvbnMpID09IDApXG4gICAgICB0aGlzLmlzU2VhcmNoID0gdHJ1ZVxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuc2VjdGlvbnMpWzBdXG4gICAgdGhpcy5zZWxlY3RlZFNlY3Rpb24gPSB0aGlzLnNlY3Rpb25zW09iamVjdC5rZXlzKHRoaXMuc2VjdGlvbnMpWzBdXVxuICAgIGlmICh0aGlzLnNlbGVjdGVkU2VjdGlvbj8ubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50ID0gdGhpcy5zZWxlY3RlZFNlY3Rpb25bMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmR1bW15MiA9IHt9XG4gIH1cbn0iLCI8IS0tIDxzZWN0aW9uIGNsYXNzPVwibWFpbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXY+U2VsZWN0IFRlbXBsYXRlPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmLTE4IGNwXCIgKGNsaWNrKT1cImRpYWxvZy5jbG9zZSgpXCI+XG4gICAgICAgICAgICBjbG9zZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwYXJlbnQtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXIgZC1mbGV4IGdhcC0xMFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy8zMTQ2NjFjMTc0MTg0NDIzNDQ0MlZlY3RvciUyMCUyODElMjkucG5nXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwic2VhcmNoLWJhci1pY29uXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggZm9yIFNlY3Rpb25zXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoU2VjdGlvbnMoKVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRhaW5lciBkLWZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiB0YWJzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYnNcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWIgPSBlbGUudmFsdWVcIiBbY2xhc3MuYWN0aXZlLXRhYl09XCJlbGUudmFsdWUgPT0gc2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAge3tlbGUudmlld1ZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZS52YWx1ZSA9PSAnUFJPJyAmJiBlbGUudmFsdWUgIT0gc2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJ3LTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzQ2ODI4MWMxNzQ0Njk5NjY0ODU4RnJhbWUlMjAxMjQ0ODMxNzQwJTIwJTI4MSUyOS5wbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInByby1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdCQVNJQyc7IGVsc2UgcHJvVGFiQ29udGVudFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlYXJjaDtlbHNlIGVtcHR5U2NyZWVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtY29udGFpbmVyIGQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1zaWRlcGFuZWxcIiAqbmdJZj1cIiFsb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiBnZXRPYmplY3RLZXlzKHNlY3Rpb25zKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlLXNlY3Rpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNlY3Rpb24oZWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmUtc2VjdGlvbl09XCJzZWxlY3RlZFNlY3Rpb24gPT0gc2VjdGlvbnNbZWxlXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRTZWN0aW9uID09IHNlY3Rpb25zW2VsZV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvOTU0MzgzYzE3NDE4NTAzOTI4MDJHcm91cCUyMDE3MDc0ODE4NzkucG5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiaWNvbiB0ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFNlY3Rpb24gIT0gc2VjdGlvbnNbZWxlXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9wcm9kLXNpbXBvLnMzLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbS9wcm9kLWltYWdlcy84NDYxNDVjMTc0MTg1MDU3NDg2NEljb24lMjAlMjgxJTI5LnBuZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImljb24gdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2VsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1yZW5kZXItc2VjdGlvblwiICpuZ0lmPVwiICFsb2FkZXIgJiYgIXRhYlNoaWZ0TG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZFNlY3Rpb25OYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgc2VjdGlvbiB0byBhZGQgdG8geW91ciBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2Ygc2VsZWN0ZWRTZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj57e2VsZS5zZWN0aW9uTmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1pbWctY29udGFpbmVyIGNwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3U2VjdGlvbihlbGUuY29tcG9uZW50SWQsZWxlLnNlY3Rpb25UeXBlLCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlPy5pbWFnZTsgZWxzZSBub0ltYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbGU/LmltYWdlXCIgYWx0PVwic2VjdGlvbiBpbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2ltZy5mcmVlcGlrLmNvbS9wcmVtaXVtLXZlY3Rvci9kZWZhdWx0LWltYWdlLWljb24tdmVjdG9yLW1pc3NpbmctcGljdHVyZS1wYWdlLXdlYnNpdGUtZGVzaWduLW1vYmlsZS1hcHAtbm8tcGhvdG8tYXZhaWxhYmxlXzg3NTQzLTExMDkzLmpwZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJzZWN0aW9uIGltYWdlXCIgY2xhc3M9XCJoLTMwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3JpZXMtc2lkZXBhbmVsXCIgKm5nSWY9XCJsb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiBbMSwxLDEsMSwxLDEsMSwxLDFdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzh2aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzY1JScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1cyc6ICcxM3B4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJnaW4tYm90dG9tJyA6ICcxMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1yZW5kZXItc2VjdGlvblwiICpuZ0lmPVwibG9hZGVyIHx8IHRhYlNoaWZ0TG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcmllcy1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMjAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IDogJzN2aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IDogJzJ2aCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiBbMSwxLDEsMV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+ICAgPG5neC1za2VsZXRvbi1sb2FkZXIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcyNSUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA6ICcydmgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyIFt0aGVtZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA6ICcyNXZoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmdpbic6JzJweCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3Byb1RhYkNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZGl2IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1jb250YWluZXItMVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvMzc3MDc2YzE3NDMxNTQ4MDc2ODNpbWFnZSUyMCUyODYlMjkucG5nXCIgYWx0PVwiZW1wdHktaW1nXCIgY2xhc3M9XCJlbXB0eS1pbWcgXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9vcHMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICBDb21pbmcgU29vblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvb3BzLXN1Yi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvb3BzLXN1Yi10ZXh0LTEgdGV4dC1jZW50ZXJcIj5Xb29mISBTb21ldGhpbmcgcGF3c29tZSBpcyBjb21pbmchPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvb3BzLXN1Yi10ZXh0LTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEhleSBob29tYW4hIEkganVzdCBzbmlmZmVkIG91dCBzb21ldGhpbmcgc3VwZXIgZXhjaXRpbmcuLi4gYW5kIGl04oCZcyBhbG1vc3QgaGVyZSEgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTY3JlZW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZGl2IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1jb250YWluZXItMVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvMzc3MDc2YzE3NDMxNTQ4MDc2ODNpbWFnZSUyMCUyODYlMjkucG5nXCIgYWx0PVwiZW1wdHktaW1nXCIgY2xhc3M9XCJlbXB0eS1pbWcgXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9vcHMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICBPb3BzISBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib29wcy1zdWItdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib29wcy1zdWItdGV4dC0xIHRleHQtY2VudGVyXCI+SSBzbmlmZmVkIGV2ZXJ5d2hlcmUsIGJ1dCBJIGNvdWxkbid0IGZpbmQgd2hhdCB5b3UncmUgbG9va2luZyBmb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9vcHMtc3ViLXRleHQtMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgTWF5YmUgdHJ5IGEgZGlmZmVyZW50IHNlYXJjaD8gXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG48L3NlY3Rpb24+IC0tPlxuXG48c2VjdGlvbiBjbGFzcz1cIm1haW4tY29udGFpbmVyIGQtZmxleCBmbGV4LWNvbHVtblwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlci1jb250YWluZXIgZmFkZS1pblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+QWRkIGEgc2VjdGlvbjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXN1YnRpdGxlXCI+Q2hvb3NlIGEgc2VjdGlvbiDigJQgeW91IGNhbiByZW9yZGVyIG9yIHJlbW92ZSBpdCBhbnkgdGltZS48L2Rpdj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xvc2UtYnRuXCIgKGNsaWNrKT1cImRpYWxvZy5jbG9zZSgpXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInBhcmVudC1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uXCI+XG5cbiAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXRhYnMtY29udGFpbmVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBmYWRlLWluXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2YgdGFic1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtdGFiXCIgKGNsaWNrKT1cIm9uVGFiU2VsZWN0KGVsZS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlLXRvcC10YWJdPVwiZWxlLnZhbHVlID09IHNlbGVjdGVkVGFiXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ZWxlLnZpZXdWYWx1ZX19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTZWFyY2ggLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYmFyLWNvbnRhaW5lciBmYWRlLWluXCIgKm5nSWY9XCJzZWxlY3RlZFRhYiAhPSAnU0FWRUQnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhciBkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL3Byb2Qtc2ltcG8uczMuYXAtc291dGgtMS5hbWF6b25hd3MuY29tL3Byb2QtaW1hZ2VzLzMxNDY2MWMxNzQxODQ0MjM0NDQyVmVjdG9yJTIwJTI4MSUyOS5wbmdcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj0nU2VhcmNoIHNlY3Rpb24uLi4nIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFNlY3Rpb25zKClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdCQVNJQydcIj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlYXJjaDsgZWxzZSBlbXB0eVNjcmVlblwiPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBRdWljayBBZGQgLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicXVpY2stYWRkLWNvbnRhaW5lciBmYWRlLWluIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cIiFsb2FkZXIgJiYgIXNlYXJjaFRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWFkZC1sYWJlbFwiPlF1aWNrIGFkZDo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWFkZC1jaGlwcyBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGdldE9iamVjdEtleXMoc2VjdGlvbnMpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPCA2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1jaGlwIHN0YWdnZXItaXRlbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZWN0aW9uKGNhdGVnb3J5KTsgdG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmUtcXVpY2stY2hpcF09XCJzZWxlY3RlZFNlY3Rpb25OYW1lID09PSBjYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWVtb2ppXCI+e3tnZXRDYXRlZ29yeUVtb2ppKGNhdGVnb3J5KX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRGaXJzdFNlY3Rpb25OYW1lKGNhdGVnb3J5KX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgIDwhLS0gQ09OVEVOVCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1sYXlvdXQgZmFkZS1pbiBkLWZsZXhcIiAqbmdJZj1cIiFsb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMRUZUIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pY29uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPuKcqDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy0xNFwiPkFJIFJlY29tbWVuZGVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBnZXRPYmplY3RLZXlzKHNlY3Rpb25zKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDYXRlZ29yeUVtb2ppKGNhdGVnb3J5KX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYXRlZ29yeX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktY291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt7c2VjdGlvbnNbY2F0ZWdvcnldPy5sZW5ndGh9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNhdGVnb3J5LWFycm93XCIgKm5nSWY9XCJleHBhbmRlZENhdGVnb3JpZXNbY2F0ZWdvcnldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjYXRlZ29yeS1hcnJvd1wiICpuZ0lmPVwiIWV4cGFuZGVkQ2F0ZWdvcmllc1tjYXRlZ29yeV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pdGVtcyBkLWZsZXggZmxleC1jb2x1bW5cIiAqbmdJZj1cImV4cGFuZGVkQ2F0ZWdvcmllc1tjYXRlZ29yeV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlYyBvZiBzZWN0aW9uc1tjYXRlZ29yeV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBzZWMuY29tcG9uZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q29tcG9uZW50KHNlYywgY2F0ZWdvcnkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VjLnNlY3Rpb25OYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1ncm91cC1sYWJlbFwiPnt7c2VsZWN0ZWRTZWN0aW9uTmFtZSB8fCAnU2VjdGlvbnMnfX08L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLWxpc3QgZC1mbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJzZWxlY3RlZFNlY3Rpb24gJiYgc2VsZWN0ZWRTZWN0aW9uLmxlbmd0aCA+IDBcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZSBvZiBzZWxlY3RlZFNlY3Rpb247IGxldCBpID0gaW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ2NvbXAtJyArIGVsZS5jb21wb25lbnRJZFwiIGNsYXNzPVwic2VjdGlvbi1jYXJkIHN0YWdnZXItaXRlbVwiIFtzdHlsZS5hbmltYXRpb24tZGVsYXldPVwiaSAqIDQwICsgJ21zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlY3Rpb24tY2FyZC1zZWxlY3RlZF09XCJzZWxlY3RlZENvbXBvbmVudD8uY29tcG9uZW50SWQgPT09IGVsZS5jb21wb25lbnRJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENvbXBvbmVudEFuZEhpZ2hsaWdodChlbGUpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jYXJkLWJhZGdlXCIgKm5nSWY9XCJlbGUuc2VjdGlvblR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSArIHt7ZWxlLnNlY3Rpb25UeXBlIHwgdXBwZXJjYXNlfX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHt7ZWxlLnNlY3Rpb25OYW1lIHwgdGl0bGVjYXNlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWltZy1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGU/LmltYWdlOyBlbHNlIG5vSW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbGU/LmltYWdlXCIgYWx0PVwic2VjdGlvbiBwcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8taW1hZ2UtcGxhY2Vob2xkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmltYWdlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1pbmZvIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1uYW1lXCI+e3tlbGUuc2VjdGlvbk5hbWV9fTwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtZGVzY1wiICpuZ0lmPVwiZWxlLmRlc2NcIj57e2VsZS5kZXNjIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNhcmQtY2hlY2staWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkQ29tcG9uZW50Py5jb21wb25lbnRJZCA9PT0gZWxlLmNvbXBvbmVudElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19jaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZSBmYWRlLWluXCIgKm5nSWY9XCIhc2VsZWN0ZWRTZWN0aW9uIHx8IHNlbGVjdGVkU2VjdGlvbi5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJlbXB0eS1wYWdlLWljb25cIj5hdXRvX2F3ZXNvbWU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS10aXRsZVwiPlNlbGVjdCBhIGNhdGVnb3J5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob29zZSBhbnkgY2F0ZWdvcnkgZnJvbSB0aGUgbGVmdCBzaWRlYmFyIHRvIGV4cGxvcmUgYW5kIGFkZCBzZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGQtZmxleFwiICpuZ0lmPVwibG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGViYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2YgWzEsMSwxLDEsMSwxLDEsMV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlbWVdPVwieyB3aWR0aDogJzkwJScsIGhlaWdodDogJzM2cHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc4cHgnLCAnbWFyZ2luLWJvdHRvbSc6ICc2cHgnIH1cIj48L25neC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDEsMSwxXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnNDAlJywgaGVpZ2h0OiAnMjBweCcsICdib3JkZXItcmFkaXVzJzogJzRweCcsICdtYXJnaW4tYm90dG9tJzogJzhweCcgfVwiPjwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzE4MHB4JywgJ2JvcmRlci1yYWRpdXMnOiAnOHB4JywgJ21hcmdpbi1ib3R0b20nOiAnOHB4JyB9XCI+PC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICc2MCUnLCBoZWlnaHQ6ICcxNnB4JywgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JyB9XCI+PC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnU0FWRUQnXCI+XG4gICAgICAgICAgICA8IS0tIExvYWRlciBza2VsZXRvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWxheW91dCBkLWZsZXhcIiAqbmdJZj1cInNhdmVkTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZWJhclwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDEsMSwxLDFdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnOTAlJywgaGVpZ2h0OiAnMzZweCcsICdib3JkZXItcmFkaXVzJzogJzhweCcsICdtYXJnaW4tYm90dG9tJzogJzhweCcgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIFsxLDEsMV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmRcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MTJweFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnNDAlJywgaGVpZ2h0OiAnMThweCcsICdib3JkZXItcmFkaXVzJzogJzRweCcsICdtYXJnaW4tYm90dG9tJzogJzhweCcgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlbWVdPVwieyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDBweCcsICdib3JkZXItcmFkaXVzJzogJzhweCcsICdtYXJnaW4tYm90dG9tJzogJzhweCcgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNrZWxldG9uLWxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlbWVdPVwieyB3aWR0aDogJzYwJScsIGhlaWdodDogJzE0cHgnLCAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBMb2FkZWQ6IGNhdGVnb3JpZXMgKyByaWdodCBjb21wb25lbnQgY2FyZCBwcmV2aWV3IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGZhZGUtaW4gZC1mbGV4XCIgKm5nSWY9XCIhc2F2ZWRMb2FkZXIgJiYgc2F2ZWRDYXRlZ29yeUtleXMubGVuZ3RoID4gMFwiPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBMRUZUOiBjb21wb25lbnQgY2F0ZWdvcmllcyBsaXN0IC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGViYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhdmVkLXBhZ2VzLWxhYmVsXCI+U2F2ZWQgU2VjdGlvbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2F0S2V5IG9mIHNhdmVkQ2F0ZWdvcnlLZXlzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2F2ZWQtcGFnZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkU2F2ZWRDYXRlZ29yeSA9PT0gY2F0S2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2F2ZWRDYXRlZ29yeShjYXRLZXkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2F2ZWQtcGFnZS1pY29uXCI+YXJ0aWNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYXZlZC1wYWdlLW5hbWVcIj57e2NhdEtleX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tZ3JvdXAtbGFiZWxcIj5Db21wb25lbnQgUHJldmlldzwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9ucy1saXN0IGQtZmxleCBmbGV4LWNvbHVtblwiICpuZ0lmPVwic2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jYXJkIGZhZGUtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWN0aW9uLWNhcmQtc2VsZWN0ZWRdPVwic2VsZWN0ZWRTYXZlZENvbXBvbmVudD8uaWQgPT09IHNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ/LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2F2ZWRDb21wb25lbnQoc2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjdGlvbiB0eXBlIGJhZGdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtYmFkZ2VcIiAqbmdJZj1cInNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ/LnNlY3Rpb25UeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudC5zZWN0aW9uVHlwZS5zcGxpdCgnXycpLmpvaW4oJyAnKSB8IHRpdGxlY2FzZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFByZXZpZXcgYXJlYSAoU2hvdyBpbWFnZSBpZiBwcmVzZW50LCBmYWxsYmFjayB0byBwbGFjZWhvbGRlcikgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taW1nLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ/LnN0eWxlcz8uYmFja2dyb3VuZD8uaW1hZ2UgJiYgc2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5zaG93SW1hZ2U7IGVsc2Ugc2F2ZWROb0ltYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwic2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudC5zdHlsZXMuYmFja2dyb3VuZC5pbWFnZVwiIGFsdD1cInNlY3Rpb24gcHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzYXZlZE5vSW1hZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2F2ZWQtcHJldmlldy1wbGFjZWhvbGRlciBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bGF5ZXJzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3NhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS5jb21wb25lbnQ/LnNlY3Rpb25UeXBlPy5zcGxpdCgnXycpPy5qb2luKCcgJykgfHwgJ1NhdmVkIENvbXBvbmVudCd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYXJkIGluZm8gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1pbmZvIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtbmFtZVwiPnt7c2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uc2VjdGlvbk5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1kZXNjXCIgKm5nSWY9XCJzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV0uY29tcG9uZW50Py5kZXNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV0uY29tcG9uZW50LmRlc2N9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjYXJkLWNoZWNrLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFNhdmVkQ29tcG9uZW50Py5pZCA9PT0gc2F2ZWRTZWN0aW9uc1tzZWxlY3RlZFNhdmVkQ2F0ZWdvcnldLmNvbXBvbmVudD8uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmNsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VkIEluIGZvb3RlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2F2ZWQtY2FyZC1mb290ZXJcIiAqbmdJZj1cInNhdmVkU2VjdGlvbnNbc2VsZWN0ZWRTYXZlZENhdGVnb3J5XS51c2VkSW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZWQtaW4tY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInVzZWQtaW4taWNvblwiPndlYjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZWQtaW4tdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+VXNlZCBJbiAoe3tzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV0udXNlZEluLmxlbmd0aH19IFBhZ2VzKTo8L3N0cm9uZz4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzYXZlZFNlY3Rpb25zW3NlbGVjdGVkU2F2ZWRDYXRlZ29yeV0udXNlZEluLmpvaW4oJywgJyl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBFbXB0eTogbm8gc2F2ZWQgZGF0YSBhdCBhbGwgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGUgZmFkZS1pblwiICpuZ0lmPVwiIXNhdmVkTG9hZGVyICYmIHNhdmVkQ2F0ZWdvcnlLZXlzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9jZG4taWNvbnMtcG5nLmZsYXRpY29uLmNvbS81MTIvNDA3Ni80MDc2NTQ5LnBuZ1wiIGFsdD1cImVtcHR5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXRpdGxlXCI+Tm8gc2F2ZWQgc2VjdGlvbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIj5TZWN0aW9ucyB5b3Ugc2F2ZSBmcm9tIHBhZ2VzIHdpbGwgYXBwZWFyIGhlcmU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnQVBQUydcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBTa2VsZXRvbiBMb2FkZXIgZHVyaW5nIEFQSSBsb2FkIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbGF5b3V0IGQtZmxleFwiICpuZ0lmPVwiYXBwc0xvYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGViYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBbMSwxLDEsMV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICc5MCUnLCBoZWlnaHQ6ICczNnB4JywgJ2JvcmRlci1yYWRpdXMnOiAnOHB4JywgJ21hcmdpbi1ib3R0b20nOiAnOHB4JyB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25neC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2YgWzEsMSwxXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZFwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbToxMnB4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1za2VsZXRvbi1sb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoZW1lXT1cInsgd2lkdGg6ICc0MCUnLCBoZWlnaHQ6ICcxOHB4JywgJ2JvcmRlci1yYWRpdXMnOiAnNHB4JywgJ21hcmdpbi1ib3R0b20nOiAnOHB4JyB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2tlbGV0b24tbG9hZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJ7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMHB4JywgJ2JvcmRlci1yYWRpdXMnOiAnOHB4JywgJ21hcmdpbi1ib3R0b20nOiAnOHB4JyB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTG9hZGVkIGFwcHMgbGlzdCBhbmQgcHJldmlldyBib2FyZHMgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1sYXlvdXQgZmFkZS1pbiBkLWZsZXhcIiAqbmdJZj1cIiFhcHBzTG9hZGVyICYmIGFwcHNMaXN0Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICA8IS0tIExFRlQgU0lERUJBUiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFwcCBvZiBhcHBzTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBcHAgSGVhZGVyIFJvdyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXBwQ2F0ZWdvcnkoYXBwLmFwcE5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwibWluLXdpZHRoOiAwOyBmbGV4OiAxO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCI+e3thcHBJY29uTWFwW2FwcC5hcHBOYW1lXSB8fCAn8J+Tpid9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMTMgZnctc2VtaWJvbGRcIiBzdHlsZT1cInRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBtaW4td2lkdGg6IDA7IGZsZXg6IDE7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHAuYXBwTmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbXBhY3QgYWN0aXZlIGdyZWVuIHN0YXR1cyBkb3QgZm9yIGluc3RhbGxlZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwLWRvdC1pbnN0YWxsZWRcIiAqbmdJZj1cImFwcC5hcHBJbnN0YWxsZWRcIiB0aXRsZT1cIkluc3RhbGxlZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5zdGFsbCBCdXR0b24gaWYgbm90IGluc3RhbGxlZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYXBwLWluc3RhbGwtc21hbGxcIiAqbmdJZj1cIiFhcHAuYXBwSW5zdGFsbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5zdGFsbEFwcChhcHAsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2F0ZWdvcnktYXJyb3dcIiAqbmdJZj1cImV4cGFuZGVkQXBwc1thcHAuYXBwTmFtZV0gJiYgYXBwLmFwcEluc3RhbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF9sZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2F0ZWdvcnktYXJyb3dcIiAqbmdJZj1cIiFleHBhbmRlZEFwcHNbYXBwLmFwcE5hbWVdICYmIGFwcC5hcHBJbnN0YWxsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFN1YmNvbXBvbmVudHMgbGlzdCB1bmRlciBpbnN0YWxsZWQgYXBwIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pdGVtcyBkLWZsZXggZmxleC1jb2x1bW4gYW5pbWF0ZS1kcm9wZG93blwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJleHBhbmRlZEFwcHNbYXBwLmFwcE5hbWVdICYmIGFwcC5hcHBJbnN0YWxsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFwcC5jb21wb25lbnRzPy5sZW5ndGggPiAwOyBlbHNlIG5vQXBwU2Vjc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjIG9mIGFwcC5jb21wb25lbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlYz8uZGF0YT8uY29tcG9uZW50SWQgIT0gbnVsbCAmJiBzZWxlY3RlZEFwcENvbXBvbmVudD8uY29tcG9uZW50SWQgPT09IHNlYz8uZGF0YT8uY29tcG9uZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXBwQ29tcG9uZW50KHNlYy5kYXRhLCBhcHAuYXBwTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e3NlYy5kYXRhLnNlY3Rpb25OYW1lfX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VjPy5kYXRhPy5zZWN0aW9uTmFtZSB8fCAnTm8gQ29tcG9uZW50JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vQXBwU2Vjcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pdGVtLWRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gc2VjdGlvbnMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gUklHSFQgQ09OVEVOVCBQUkVWSUVXIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8IS0tIElGIEFOIEFQUCBJUyBTRUxFQ1RFRCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkQXBwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSU5TVEFMTEVEIEFQUCBTRUNUSU9OUyBMSVNUIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFNlbGVjdGVkQXBwT2JqKCkgYXMgYWN0aXZlQXBwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUFwcC5hcHBJbnN0YWxsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tZ3JvdXAtbGFiZWxcIj57e3NlbGVjdGVkQXBwfX0gU2VjdGlvbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9ucy1saXN0IGQtZmxleCBmbGV4LWNvbHVtblwiICpuZ0lmPVwic2VsZWN0ZWRBcHBTZWN0aW9ucy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGUgb2Ygc2VsZWN0ZWRBcHBTZWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidhcHAtY29tcC0nICsgZWxlPy5kYXRhPy5jb21wb25lbnRJZCAhPSBudWxsXCIgY2xhc3M9XCJzZWN0aW9uLWNhcmQgc3RhZ2dlci1pdGVtXCIgW3N0eWxlLmFuaW1hdGlvbi1kZWxheV09XCJpICogNDAgKyAnbXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlY3Rpb24tY2FyZC1zZWxlY3RlZF09XCJlbGU/LmRhdGE/LmNvbXBvbmVudElkICE9IG51bGwgJiYgc2VsZWN0ZWRBcHBDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBlbGUuZGF0YS5jb21wb25lbnRJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBcHBDb21wb25lbnRBbmRIaWdobGlnaHQoZWxlLmRhdGEpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCYWRnZSBzaG93aW5nIGNvbXBvbmVudCBzZWN0aW9uIG5hbWUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtYmFkZ2VcIiAqbmdJZj1cImVsZT8uZGF0YT8uc2VjdGlvblR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHt7KGVsZT8uZGF0YT8uc2VjdGlvbk5hbWUgfCB0aXRsZWNhc2UpIHx8IFwiTm8gQ29tcG9uZW50XCJ9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEltYWdlIFByZXZpZXcgQXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taW1nLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGU/LmRhdGE/LmltYWdlOyBlbHNlIG5vSW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZWxlLmRhdGEuaW1hZ2VcIiBhbHQ9XCJzZWN0aW9uIHByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1pbWFnZS1wbGFjZWhvbGRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmltYWdlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FyZCBJbmZvIChEZXNjcmlwdGlvbiBhbmQgVGFncykgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQtaW5mbyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWluLXdpZHRoOiAwOyBmbGV4OiAxOyBwYWRkaW5nLXJpZ2h0OiA4cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZC1kZXNjXCIgKm5nSWY9XCJlbGU/LmRhdGE/LmRlc2NcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDZweDtcIj57e2VsZS5kYXRhLmRlc2N9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGFncyBhcnJheSByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgZ2FwLTFcIiAqbmdJZj1cImVsZT8uZGF0YT8udGFncz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwcC1iYWRnZVwiIHN0eWxlPVwiYmFja2dyb3VuZDogI2VlZjJmZjsgY29sb3I6ICM0ZjQ2ZTU7IG1hcmdpbjogMDsgZm9udC1zaXplOiA4LjVweDtcIiAqbmdGb3I9XCJsZXQgdGFnIG9mIGVsZS5kYXRhLnRhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjYXJkLWNoZWNrLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZWxlPy5kYXRhICE9IG51bGwgJiYgc2VsZWN0ZWRBcHBDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBlbGUuZGF0YS5jb21wb25lbnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmNsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gc2VjdGlvbnMgZW1wdHkgc3RhdGUgaW5zaWRlIHJpZ2h0IHBhbmVsIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGUgZmFkZS1pblwiICpuZ0lmPVwic2VsZWN0ZWRBcHBTZWN0aW9ucy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImVtcHR5LXBhZ2UtaWNvblwiPmluYm94PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS10aXRsZVwiPk5vIHNlY3Rpb25zIGF2YWlsYWJsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN1YnRpdGxlXCI+VGhpcyBhcHAgZG9lcyBub3QgcHJvdmlkZSBhbnkgcHJlLWJ1aWx0IHNlY3Rpb25zIGF0IHRoZSBtb21lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5PVCBJTlNUQUxMRUQgRU1QVFkgU1RBVEUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhY3RpdmVBcHAuYXBwSW5zdGFsbGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZSBmYWRlLWluIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZW1wdHktcGFnZS1pY29uXCIgc3R5bGU9XCJmb250LXNpemU6IDU2cHggIWltcG9ydGFudDsgd2lkdGg6IDU2cHggIWltcG9ydGFudDsgaGVpZ2h0OiA1NnB4ICFpbXBvcnRhbnQ7IGNvbG9yOiAjN2M2Y2YwOyBvcGFjaXR5OiAwLjg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FwcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS10aXRsZVwiIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4OyBtYXJnaW4tdG9wOiAxMnB4O1wiPlBsZWFzZSBpbnN0YWxsIHRvIHZpZXcgc2VjdGlvbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgbWF4LXdpZHRoOiAyODBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbGwgdGhlIHt7c2VsZWN0ZWRBcHB9fSBwbHVnaW4gdG8gdW5sb2NrIHByZW1pdW0sIHByZS1idWlsdCBzZWN0aW9ucyBmb3IgeW91ciB3ZWJzaXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFwcC1pbnN0YWxsLWxhcmdlXCIgKGNsaWNrKT1cImluc3RhbGxBcHAoYWN0aXZlQXBwLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pqhIEluc3RhbGwge3tzZWxlY3RlZEFwcH19IEFwcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBOTyBBQ1RJVkUgQVBQIFNFTEVDVEVEIChGQUxMQkFDSykgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0ZWRBcHBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZSBmYWRlLWluIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImVtcHR5LXBhZ2UtaWNvblwiPmFwcHM8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS10aXRsZVwiPkV4cGxvcmUgUGx1Z2lucyAmIEFwcHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIiBzdHlsZT1cIm1heC13aWR0aDogMjYwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBhbnkgYXBwbGljYXRpb24gZnJvbSB0aGUgbGVmdCBzaWRlYmFyIHRvIGJyb3dzZSBhbmQgY29uZmlndXJlIGl0cyBjdXN0b20gbGF5b3V0IGNvbXBvbmVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPCEtLSBFTVBUWSBTRUFSQ0ggLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTY3JlZW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGUgZmFkZS1pbiBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vY2RuLWljb25zLXBuZy5mbGF0aWNvbi5jb20vNTEyLzc0ODYvNzQ4NjgwMy5wbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktdGl0bGVcIj5ObyBzZWN0aW9ucyBmb3VuZDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICBUcnkgc2VhcmNoaW5nIHNvbWV0aGluZyBlbHNlIG9yIGV4cGxvcmUgY2F0ZWdvcmllc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9vdGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb290ZXItY29udGFpbmVyIGZhZGUtaW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1oaW50XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIFlvdSBjYW4gcmVhcnJhbmdlIG9yIHJlbW92ZSB0aGlzIHNlY3Rpb24gYW55IHRpbWUuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY2FuY2VsXCIgKGNsaWNrKT1cImRpYWxvZy5jbG9zZSgpXCI+Q2FuY2VsPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWFkZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInNlbGVjdGVkVGFiID09PSAnQkFTSUMnID8gIXNlbGVjdGVkQ29tcG9uZW50IDogKHNlbGVjdGVkVGFiID09PSAnQVBQUycgPyAhc2VsZWN0ZWRBcHBDb21wb25lbnQgOiAhc2VsZWN0ZWRTYXZlZENvbXBvbmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBZGRTZWN0aW9uKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICArIEFkZCBzZWN0aW9uXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvc2VjdGlvbj5cblxuPCEtLSBCZWF1dGlmdWwgSW5zdGFsbGF0aW9uIFByb2dyZXNzIERpYWxvZyBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjaW5zdGFsbFByb2dyZXNzVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJzaW1wby1kaWFsb2ctY29udGFpbmVyIGFuaW1hdGUtY29tcGxldGUtcG9wXCI+XG4gICAgPGRpdiBjbGFzcz1cInNpbXBvLWRpYWxvZy1oZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhcHAtaWNvbi1iYWRnZVwiPnt7IGFwcEljb25NYXBbaW5zdGFsbGluZ0FwcD8uYXBwTmFtZV0gfHwgJ/CflIwnIH19PC9kaXY+XG4gICAgICA8aDM+U2V0dGluZyBVcCB7eyBpbnN0YWxsaW5nQXBwPy5hcHBOYW1lIH19IEFwcDwvaDM+XG4gICAgICA8cD5QbGVhc2Ugd2FpdCB3aGlsZSB3ZSBjb25maWd1cmUgeW91ciBwcmVtaXVtIHNjaGVkdWxpbmcgc3lzdGVtLjwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzaW1wby1kaWFsb2ctYm9keVwiPlxuICAgICAgPCEtLSBBbmltYXRlZCBQcm9ncmVzcyBCYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2ltcG8tZGlhbG9nLXByb2dyZXNzLWJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2ltcG8tZGlhbG9nLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwiZ2V0T3ZlcmFsbFByb2dyZXNzUGVyY2VudCgpICsgJyUnXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwcyBMaXN0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNpbXBvLXN0ZXBzLWxpc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtcm93XCIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgaW5zdGFsbFN0ZXBzOyBsZXQgaWR4ID0gaW5kZXhcIiBbbmdDbGFzc109XCJzdGVwPy5zdGF0dXMgfHwgJydcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1pY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSBBY3RpdmUgU3RlcCBJY29uIChQdWxzaW5nIGdsb3dpbmcgZG90KSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwLWljb24gYWN0aXZlLWljb25cIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ2FjdGl2ZSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLW51bWJlclwiPnt7IGlkeCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxzZS1yaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTdWNjZXNzIFN0ZXAgSWNvbiAoR3JlZW4gY2hlY2ttYXJrIHdpdGggc3ByaW5nLXVwIGFuaW1hdGlvbikgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcC1pY29uIHN1Y2Nlc3MtaWNvbiBhbmltYXRlLXN1Y2Nlc3NcIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBQZW5kaW5nIFN0ZXAgSWNvbiAoRGltbWVkIHNpbXBsZSBudW1iZXIvZG90KSAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwLWljb24gcGVuZGluZy1pY29uXCIgKm5nSWY9XCJzdGVwPy5zdGF0dXMgPT09ICdwZW5kaW5nJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ZXAtbnVtYmVyXCI+e3sgaWR4ICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtbGFiZWxcIj57eyBzdGVwPy5sYWJlbCB8fCAnJyB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtZGVzY1wiICpuZ0lmPVwic3RlcD8uc3RhdHVzID09PSAnYWN0aXZlJ1wiPlByb2Nlc3NpbmcsIHBsZWFzZSB3YWl0PHNwYW4gY2xhc3M9XCJkb3RzLXB1bHNlXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtZGVzYyBzdWNjZXNzLWRlc2NcIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+Q29tcGxldGVkIHN1Y2Nlc3NmdWxseTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtZGVzYyBwZW5kaW5nLWRlc2NcIiAqbmdJZj1cInN0ZXA/LnN0YXR1cyA9PT0gJ3BlbmRpbmcnXCI+VXBjb21pbmcuLi48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIEJlYXV0aWZ1bCBJbnN0YWxsYXRpb24gQ29tcGxldGUgRGlhbG9nIFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNpbnN0YWxsQ29tcGxldGVUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cInNpbXBvLWRpYWxvZy1jb250YWluZXIgY29tcGxldGUtZGlhbG9nLWNhcmQgYW5pbWF0ZS1jb21wbGV0ZS1wb3BcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGUtaGVhZGVyLWFydFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNwYXJrbGVzLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgb25lXCI+4pyoPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgdHdvXCI+4pyoPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgdGhyZWVcIj7wn46JPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGUtaWNvbi13cmFwcGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbj52ZXJpZmllZDwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzaW1wby1kaWFsb2ctaGVhZGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3VjY2Vzcy1iYWRnZS10ZXh0XCI+SU5TVEFMTEFUSU9OIENPTVBMRVRFRDwvZGl2PlxuICAgICAgPGgzIGNsYXNzPVwiY29tcGxldGUtdGl0bGVcIj5Zb3VyIEFwcG9pbnRtZW50IEFwcCBpcyBSZWFkeSE8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJjb21wbGV0ZS1tZXNzYWdlXCI+XG4gICAgICAgIEZvciBiZXR0ZXIgZXhwZXJpZW5jZSBjcmVhdGUgc2VydmljZSBhbmQgYXNzaWduIHN0YWZmIHRvIGNyZWF0ZWQgc2VydmljZVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNpbXBvLWRpYWxvZy1ib2R5IHRleHQtY2VudGVyIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgIDwhLS0gRGlyZWN0aW5nIEFjdGlvbiBCdXR0b24gLS0+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXJlZGlyZWN0IHctMTAwXCIgKGNsaWNrKT1cInJlZGlyZWN0VG9BcHBvaW50bWVudHMoKVwiPlxuICAgICAgICA8c3Bhbj5DcmVhdGUgU2VydmljZSAmIEFzc2lnbiBTdGFmZjwvc3Bhbj5cbiAgICAgICAgPG1hdC1pY29uPmFycm93X2ZvcndhcmQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gRGlzbWlzcyBidXR0b24gLS0+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWRpc21pc3NcIiAoY2xpY2spPVwiY2xvc2VBbGxEaWFsb2dzKClcIj5cbiAgICAgICAgTWF5YmUgTGF0ZXJcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|