ca-components 1.7.89 → 1.7.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2022/lib/ca-components.module.mjs +24 -6
  2. package/esm2022/lib/components/ca-confirmation-modals/components/ca-activate-modal/ca-active-modal.component.mjs +39 -0
  3. package/esm2022/lib/components/ca-confirmation-modals/components/ca-deactive-modal/ca-deactive-modal.component.mjs +39 -0
  4. package/esm2022/lib/components/ca-confirmation-modals/components/ca-delete-modal/ca-delete-modal.component.mjs +1 -1
  5. package/esm2022/lib/components/ca-confirmation-modals/components/ca-reset-table-modal/ca-reset-table-modal.component.mjs +39 -0
  6. package/esm2022/lib/components/ca-confirmation-modals/components/interfaces/modal-data.interface.mjs +2 -0
  7. package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +2 -2
  8. package/esm2022/lib/components/ca-main-table/ca-main-table.component.mjs +3 -3
  9. package/esm2022/lib/components/ca-map/ca-map.component.mjs +4 -3
  10. package/esm2022/lib/components/ca-payroll-list-summary-overview/ca-payroll-list-summary-overview.component.mjs +3 -3
  11. package/esm2022/lib/components/ca-period-content/ca-period-content.component.mjs +3 -3
  12. package/esm2022/lib/components/ca-period-content/components/ca-period-content-extra-info/ca-period-content-extra-info.component.mjs +3 -3
  13. package/esm2022/lib/components/ca-period-content/components/ca-period-content-payment/ca-period-content-payment.component.mjs +3 -3
  14. package/esm2022/lib/components/ca-period-content/components/ca-period-content-user-info/ca-period-content-user-info.component.mjs +3 -3
  15. package/esm2022/lib/components/ca-search-multiple-states-2/ca-search-multiple-states-2.component.mjs +4 -2
  16. package/esm2022/lib/components/ca-table-card-view/ca-table-card-view.component.mjs +3 -3
  17. package/esm2022/lib/utils/helpers/date-time.helper.mjs +2 -2
  18. package/esm2022/lib/utils/svg-routes/shared-svg.routes.mjs +7 -1
  19. package/esm2022/public-api.mjs +6 -2
  20. package/fesm2022/ca-components.mjs +234 -130
  21. package/fesm2022/ca-components.mjs.map +1 -1
  22. package/lib/ca-components.module.d.ts +4 -1
  23. package/lib/components/ca-confirmation-modals/components/ca-activate-modal/ca-active-modal.component.d.ts +15 -0
  24. package/lib/components/ca-confirmation-modals/components/ca-deactive-modal/ca-deactive-modal.component.d.ts +15 -0
  25. package/lib/components/ca-confirmation-modals/components/ca-delete-modal/ca-delete-modal.component.d.ts +1 -1
  26. package/lib/components/ca-confirmation-modals/components/ca-reset-table-modal/ca-reset-table-modal.component.d.ts +15 -0
  27. package/lib/components/ca-confirmation-modals/components/{ca-delete-modal/interfaces → interfaces}/modal-data.interface.d.ts +1 -1
  28. package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
  29. package/lib/utils/svg-routes/shared-svg.routes.d.ts +6 -0
  30. package/package.json +1 -1
  31. package/public-api.d.ts +4 -1
  32. package/esm2022/lib/components/ca-confirmation-modals/components/ca-delete-modal/interfaces/modal-data.interface.mjs +0 -2
@@ -183,6 +183,7 @@ export class CaMapComponent {
183
183
  icons: route.isDashed
184
184
  ? (route.dashedLineStyle ?? routePathDashedLine)
185
185
  : null,
186
+ clickable: false,
186
187
  zIndex: index,
187
188
  };
188
189
  this.routePolylines.push(routePolyline);
@@ -460,7 +461,7 @@ export class CaMapComponent {
460
461
  this.destroy$.complete();
461
462
  }
462
463
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaMapComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.MapMarkerIconService }], target: i0.ɵɵFactoryTarget.Component }); }
463
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CaMapComponent, isStandalone: true, selector: "app-ca-map", inputs: { data: "data" }, outputs: { resetSelectedMarkerItem: "resetSelectedMarkerItem", routingMarkerClick: "routingMarkerClick", clusterMarkerClick: "clusterMarkerClick", clusterListScrollEvent: "clusterListScrollEvent", getInfoWindowData: "getInfoWindowData", boundsChanged: "boundsChanged", openInMapEvent: "openInMapEvent" }, viewQueries: [{ propertyName: "maps", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "markerDropdown", first: true, predicate: ["markerDropdown"], descendants: true }, { propertyName: "clusterDropdown", first: true, predicate: ["clusterDropdown"], descendants: true }], ngImport: i0, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n [mapId]=\"mapStyleId\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track clusterMarker.position\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n @for (route of routePolylines; let i = $index; track i) {\n <map-polyline [options]=\"route\"></map-polyline>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (areaFilterData) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (routingMarker of mapData.routingMarkers; let i = $index; track i) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(routingMarker, selectedRoutingMarker)\n ? 999\n : i\n \"\n (mapClick)=\"\n routingMarker.hasClickEvent &&\n onRoutingMarkerClick(routingMarker)\n \"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex svg-size-18\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242}.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}@supports (-webkit-line-clamp: 1){.gm-style div[aria-hidden=true] .line-clamp-1,.marker-label .line-clamp-1{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#fff}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-icon.fuel-icon.fuel-color-1 .outside-circle{fill:#56b4ac}.marker-icon.fuel-icon.fuel-color-1 .marker-label-second-text{color:#259f94}.marker-icon.fuel-icon.fuel-color-2 .outside-circle{fill:#77bf56}.marker-icon.fuel-icon.fuel-color-2 .marker-label-second-text{color:#50ac25}.marker-icon.fuel-icon.fuel-color-3 .outside-circle{fill:#fab15c}.marker-icon.fuel-icon.fuel-color-3 .marker-label-second-text{color:#f89b2e}.marker-icon.fuel-icon.fuel-color-4 .outside-circle{fill:#ff906d}.marker-icon.fuel-icon.fuel-color-4 .marker-label-second-text{color:#ff7043}.marker-icon.fuel-icon.fuel-color-5 .outside-circle{fill:#e66767}.marker-icon.fuel-icon.fuel-color-5 .marker-label-second-text{color:#df3c3c}.marker-icon.fuel-icon.fuel-color-outdated .outside-circle{fill:#aaa}.marker-icon.fuel-icon.fuel-color-outdated .marker-label-second-text{color:#919191}.miles-icon{top:17px}.miles-icon .marker-svg{transform:scale(.5);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .white-circle{transform:scale(1.091);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .inside-circle{transform:scale(.889);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .marker-path,.miles-icon .marker-svg .marker-number{transition:opacity .2s ease-in-out;opacity:0}.miles-icon:hover .marker-svg,.miles-icon:hover .marker-svg .white-circle,.miles-icon:hover .marker-svg .inside-circle{transform:scale(1)}.miles-icon:hover .marker-svg .marker-path{opacity:1}.miles-icon.selected .marker-svg{transform:scale(1.3333)}.miles-icon.selected .marker-svg .white-circle{transform:scale(1.091)}.miles-icon.selected .marker-svg .inside-circle{transform:scale(1.1667)}.miles-icon.selected .marker-svg .marker-path{opacity:0!important}.miles-icon.selected .marker-svg .marker-number{opacity:1}.miles-icon.selected .marker-label{opacity:0!important}.miles-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.miles-icon.show-label-on-hover:hover .marker-label{opacity:1}.routing-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.routing-icon .marker-svg .outside-circle,.routing-icon .marker-svg .white-circle,.routing-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.routing-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.routing-icon.selected .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.routing-icon.selected .marker-svg .outside-circle{transform:scale(1.074)}.routing-icon.selected .marker-svg .shadow-circle{transform:scale(1.222)}.routing-icon.selected.show-label-on-hover .marker-label{top:8px;left:calc(100% + 4px);font-weight:700;opacity:1!important}.routing-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.routing-icon.show-label-on-hover:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}.cluster-icon.fuel-icon.selected .marker-svg g path{fill:#6692f1}\n"], dependencies: [{ kind: "ngmodule", type:
464
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CaMapComponent, isStandalone: true, selector: "app-ca-map", inputs: { data: "data" }, outputs: { resetSelectedMarkerItem: "resetSelectedMarkerItem", routingMarkerClick: "routingMarkerClick", clusterMarkerClick: "clusterMarkerClick", clusterListScrollEvent: "clusterListScrollEvent", getInfoWindowData: "getInfoWindowData", boundsChanged: "boundsChanged", openInMapEvent: "openInMapEvent" }, viewQueries: [{ propertyName: "maps", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "markerDropdown", first: true, predicate: ["markerDropdown"], descendants: true }, { propertyName: "clusterDropdown", first: true, predicate: ["clusterDropdown"], descendants: true }], ngImport: i0, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n [mapId]=\"mapStyleId\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track clusterMarker.position\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n @for (route of routePolylines; let i = $index; track i) {\n <map-polyline [options]=\"route\"></map-polyline>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (areaFilterData) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (routingMarker of mapData.routingMarkers; let i = $index; track i) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(routingMarker, selectedRoutingMarker)\n ? 999\n : i\n \"\n (mapClick)=\"\n routingMarker.hasClickEvent &&\n onRoutingMarkerClick(routingMarker)\n \"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex svg-size-18\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242}.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}@supports (-webkit-line-clamp: 1){.gm-style div[aria-hidden=true] .line-clamp-1,.marker-label .line-clamp-1{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#fff}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-icon.fuel-icon.fuel-color-1 .outside-circle{fill:#56b4ac}.marker-icon.fuel-icon.fuel-color-1 .marker-label-second-text{color:#259f94}.marker-icon.fuel-icon.fuel-color-2 .outside-circle{fill:#77bf56}.marker-icon.fuel-icon.fuel-color-2 .marker-label-second-text{color:#50ac25}.marker-icon.fuel-icon.fuel-color-3 .outside-circle{fill:#fab15c}.marker-icon.fuel-icon.fuel-color-3 .marker-label-second-text{color:#f89b2e}.marker-icon.fuel-icon.fuel-color-4 .outside-circle{fill:#ff906d}.marker-icon.fuel-icon.fuel-color-4 .marker-label-second-text{color:#ff7043}.marker-icon.fuel-icon.fuel-color-5 .outside-circle{fill:#e66767}.marker-icon.fuel-icon.fuel-color-5 .marker-label-second-text{color:#df3c3c}.marker-icon.fuel-icon.fuel-color-outdated .outside-circle{fill:#aaa}.marker-icon.fuel-icon.fuel-color-outdated .marker-label-second-text{color:#919191}.miles-icon{top:17px}.miles-icon .marker-svg{transform:scale(.5);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .white-circle{transform:scale(1.091);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .inside-circle{transform:scale(.889);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .marker-path,.miles-icon .marker-svg .marker-number{transition:opacity .2s ease-in-out;opacity:0}.miles-icon:hover .marker-svg,.miles-icon:hover .marker-svg .white-circle,.miles-icon:hover .marker-svg .inside-circle{transform:scale(1)}.miles-icon:hover .marker-svg .marker-path{opacity:1}.miles-icon.selected .marker-svg{transform:scale(1.3333)}.miles-icon.selected .marker-svg .white-circle{transform:scale(1.091)}.miles-icon.selected .marker-svg .inside-circle{transform:scale(1.1667)}.miles-icon.selected .marker-svg .marker-path{opacity:0!important}.miles-icon.selected .marker-svg .marker-number{opacity:1}.miles-icon.selected .marker-label{opacity:0!important}.miles-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.miles-icon.show-label-on-hover:hover .marker-label{opacity:1}.routing-icon{-webkit-user-select:none;user-select:none}.routing-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.routing-icon .marker-svg .outside-circle,.routing-icon .marker-svg .white-circle,.routing-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.routing-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.routing-icon.selected .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.routing-icon.selected .marker-svg .outside-circle{transform:scale(1.074)}.routing-icon.selected .marker-svg .shadow-circle{transform:scale(1.222)}.routing-icon.selected.show-label-on-hover .marker-label{top:8px;left:calc(100% + 4px);font-weight:700;opacity:1!important}.routing-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.routing-icon.show-label-on-hover:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}.cluster-icon.fuel-icon.selected .marker-svg g path{fill:#6692f1}\n"], dependencies: [{ kind: "ngmodule", type:
464
465
  // Modules
465
466
  GoogleMapsModule }, { kind: "component", type: i2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i2.MapCircle, selector: "map-circle", inputs: ["options", "center", "radius"], outputs: ["centerChanged", "circleClick", "circleDblclick", "circleDrag", "circleDragend", "circleDragstart", "circleMousedown", "circleMousemove", "circleMouseout", "circleMouseover", "circleMouseup", "radiusChanged", "circleRightclick", "circleInitialized"], exportAs: ["mapCircle"] }, { kind: "directive", type: i2.MapAdvancedMarker, selector: "map-advanced-marker", inputs: ["title", "position", "content", "gmpDraggable", "options", "zIndex"], outputs: ["mapClick", "mapDrag", "mapDragend", "mapDragstart", "markerInitialized"], exportAs: ["mapAdvancedMarker"] }, { kind: "directive", type: i2.MapPolyline, selector: "map-polyline", inputs: ["options", "path"], outputs: ["polylineClick", "polylineDblclick", "polylineDrag", "polylineDragend", "polylineDragstart", "polylineMousedown", "polylineMousemove", "polylineMouseout", "polylineMouseover", "polylineMouseup", "polylineRightclick", "polylineInitialized"], exportAs: ["mapPolyline"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i4.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type:
466
467
  // Components
@@ -477,7 +478,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
477
478
  // Components
478
479
  CaMapDropdownComponent,
479
480
  CaAppTooltipV2Component,
480
- ], encapsulation: ViewEncapsulation.None, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n [mapId]=\"mapStyleId\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track clusterMarker.position\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n @for (route of routePolylines; let i = $index; track i) {\n <map-polyline [options]=\"route\"></map-polyline>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (areaFilterData) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (routingMarker of mapData.routingMarkers; let i = $index; track i) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(routingMarker, selectedRoutingMarker)\n ? 999\n : i\n \"\n (mapClick)=\"\n routingMarker.hasClickEvent &&\n onRoutingMarkerClick(routingMarker)\n \"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex svg-size-18\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242}.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}@supports (-webkit-line-clamp: 1){.gm-style div[aria-hidden=true] .line-clamp-1,.marker-label .line-clamp-1{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#fff}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-icon.fuel-icon.fuel-color-1 .outside-circle{fill:#56b4ac}.marker-icon.fuel-icon.fuel-color-1 .marker-label-second-text{color:#259f94}.marker-icon.fuel-icon.fuel-color-2 .outside-circle{fill:#77bf56}.marker-icon.fuel-icon.fuel-color-2 .marker-label-second-text{color:#50ac25}.marker-icon.fuel-icon.fuel-color-3 .outside-circle{fill:#fab15c}.marker-icon.fuel-icon.fuel-color-3 .marker-label-second-text{color:#f89b2e}.marker-icon.fuel-icon.fuel-color-4 .outside-circle{fill:#ff906d}.marker-icon.fuel-icon.fuel-color-4 .marker-label-second-text{color:#ff7043}.marker-icon.fuel-icon.fuel-color-5 .outside-circle{fill:#e66767}.marker-icon.fuel-icon.fuel-color-5 .marker-label-second-text{color:#df3c3c}.marker-icon.fuel-icon.fuel-color-outdated .outside-circle{fill:#aaa}.marker-icon.fuel-icon.fuel-color-outdated .marker-label-second-text{color:#919191}.miles-icon{top:17px}.miles-icon .marker-svg{transform:scale(.5);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .white-circle{transform:scale(1.091);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .inside-circle{transform:scale(.889);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .marker-path,.miles-icon .marker-svg .marker-number{transition:opacity .2s ease-in-out;opacity:0}.miles-icon:hover .marker-svg,.miles-icon:hover .marker-svg .white-circle,.miles-icon:hover .marker-svg .inside-circle{transform:scale(1)}.miles-icon:hover .marker-svg .marker-path{opacity:1}.miles-icon.selected .marker-svg{transform:scale(1.3333)}.miles-icon.selected .marker-svg .white-circle{transform:scale(1.091)}.miles-icon.selected .marker-svg .inside-circle{transform:scale(1.1667)}.miles-icon.selected .marker-svg .marker-path{opacity:0!important}.miles-icon.selected .marker-svg .marker-number{opacity:1}.miles-icon.selected .marker-label{opacity:0!important}.miles-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.miles-icon.show-label-on-hover:hover .marker-label{opacity:1}.routing-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.routing-icon .marker-svg .outside-circle,.routing-icon .marker-svg .white-circle,.routing-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.routing-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.routing-icon.selected .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.routing-icon.selected .marker-svg .outside-circle{transform:scale(1.074)}.routing-icon.selected .marker-svg .shadow-circle{transform:scale(1.222)}.routing-icon.selected.show-label-on-hover .marker-label{top:8px;left:calc(100% + 4px);font-weight:700;opacity:1!important}.routing-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.routing-icon.show-label-on-hover:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}.cluster-icon.fuel-icon.selected .marker-svg g path{fill:#6692f1}\n"] }]
481
+ ], encapsulation: ViewEncapsulation.None, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n [mapId]=\"mapStyleId\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track clusterMarker.position\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n @for (route of routePolylines; let i = $index; track i) {\n <map-polyline [options]=\"route\"></map-polyline>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent!\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (areaFilterData) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (routingMarker of mapData.routingMarkers; let i = $index; track i) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(routingMarker, selectedRoutingMarker)\n ? 999\n : i\n \"\n (mapClick)=\"\n routingMarker.hasClickEvent &&\n onRoutingMarkerClick(routingMarker)\n \"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex svg-size-18\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex svg-size-14\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242}.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true] .marker-label-text,.marker-label .marker-label-text{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}@supports (-webkit-line-clamp: 1){.gm-style div[aria-hidden=true] .line-clamp-1,.marker-label .line-clamp-1{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#fff}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-icon.fuel-icon.fuel-color-1 .outside-circle{fill:#56b4ac}.marker-icon.fuel-icon.fuel-color-1 .marker-label-second-text{color:#259f94}.marker-icon.fuel-icon.fuel-color-2 .outside-circle{fill:#77bf56}.marker-icon.fuel-icon.fuel-color-2 .marker-label-second-text{color:#50ac25}.marker-icon.fuel-icon.fuel-color-3 .outside-circle{fill:#fab15c}.marker-icon.fuel-icon.fuel-color-3 .marker-label-second-text{color:#f89b2e}.marker-icon.fuel-icon.fuel-color-4 .outside-circle{fill:#ff906d}.marker-icon.fuel-icon.fuel-color-4 .marker-label-second-text{color:#ff7043}.marker-icon.fuel-icon.fuel-color-5 .outside-circle{fill:#e66767}.marker-icon.fuel-icon.fuel-color-5 .marker-label-second-text{color:#df3c3c}.marker-icon.fuel-icon.fuel-color-outdated .outside-circle{fill:#aaa}.marker-icon.fuel-icon.fuel-color-outdated .marker-label-second-text{color:#919191}.miles-icon{top:17px}.miles-icon .marker-svg{transform:scale(.5);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .white-circle{transform:scale(1.091);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .inside-circle{transform:scale(.889);transform-origin:center;transition:transform .2s ease-in-out}.miles-icon .marker-svg .marker-path,.miles-icon .marker-svg .marker-number{transition:opacity .2s ease-in-out;opacity:0}.miles-icon:hover .marker-svg,.miles-icon:hover .marker-svg .white-circle,.miles-icon:hover .marker-svg .inside-circle{transform:scale(1)}.miles-icon:hover .marker-svg .marker-path{opacity:1}.miles-icon.selected .marker-svg{transform:scale(1.3333)}.miles-icon.selected .marker-svg .white-circle{transform:scale(1.091)}.miles-icon.selected .marker-svg .inside-circle{transform:scale(1.1667)}.miles-icon.selected .marker-svg .marker-path{opacity:0!important}.miles-icon.selected .marker-svg .marker-number{opacity:1}.miles-icon.selected .marker-label{opacity:0!important}.miles-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.miles-icon.show-label-on-hover:hover .marker-label{opacity:1}.routing-icon{-webkit-user-select:none;user-select:none}.routing-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.routing-icon .marker-svg .outside-circle,.routing-icon .marker-svg .white-circle,.routing-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.routing-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.routing-icon.selected .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.routing-icon.selected .marker-svg .outside-circle{transform:scale(1.074)}.routing-icon.selected .marker-svg .shadow-circle{transform:scale(1.222)}.routing-icon.selected.show-label-on-hover .marker-label{top:8px;left:calc(100% + 4px);font-weight:700;opacity:1!important}.routing-icon.show-label-on-hover .marker-label{transition:left .2s ease-in-out,top .2s ease-in-out,opacity .2s ease-in-out;opacity:0}.routing-icon.show-label-on-hover:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}.cluster-icon.fuel-icon.selected .marker-svg g path{fill:#6692f1}\n"] }]
481
482
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.MapMarkerIconService }], propDecorators: { maps: [{
482
483
  type: ViewChild,
483
484
  args: [GoogleMap, { static: false }]
@@ -504,4 +505,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
504
505
  }], openInMapEvent: [{
505
506
  type: Output
506
507
  }] } });
507
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLW1hcC9jYS1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtbWFwL2NhLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLFVBQVU7QUFDVixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsYUFBYTtBQUNiLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRTNGLFFBQVE7QUFDUixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFqRCxVQUFVO0FBQ1YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9DQUFv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QUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQzsrR0Evb0JRLGNBQWM7bUdBQWQsY0FBYyx1YkFTWixTQUFTLHdQQzNFeEIscW5MQWlLQTtnQkQzR1EsVUFBVTtnQkFDVixnQkFBZ0IseWlEQUNoQixZQUFZLDRIQUNaLG9CQUFvQixnT0FDcEIsZ0JBQWdCO2dCQUVoQixhQUFhO2dCQUNiLHNCQUFzQiw4TUFDdEIsdUJBQXVCOzs0RkFJbEIsY0FBYztrQkFsQjFCLFNBQVM7K0JBQ0ksWUFBWSxjQUdWLElBQUksV0FDUDt3QkFDTCxVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixvQkFBb0I7d0JBQ3BCLGdCQUFnQjt3QkFFaEIsYUFBYTt3QkFDYixzQkFBc0I7d0JBQ3RCLHVCQUF1QjtxQkFDMUIsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSTswS0FXSSxJQUFJO3NCQUE1QyxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ1YsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0csZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBRWYsSUFBSTtzQkFBaEIsS0FBSztnQkFJSSx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuLy8gTW9kdWxlc1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IE5nYlRvb2x0aXBNb2R1bGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBHb29nbGVNYXAsIEdvb2dsZU1hcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9nb29nbGUtbWFwcyc7XG5cbi8vIENvbXBvbmVudHNcbmltcG9ydCB7IENhTWFwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi9jYS1tYXAtZHJvcGRvd24vY2EtbWFwLWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCB9IGZyb20gJy4uL2NhLWFwcC10b29sdGlwLXYyL2NhLWFwcC10b29sdGlwLXYyLmNvbXBvbmVudCc7XG5cbi8vIEVudW1zXG5pbXBvcnQgeyBHb29nbGVNYXBFbnVtIH0gZnJvbSAnLi4vY2EtbWFwL2VudW1zL2dvb2dsZS1tYXAuZW51bSc7XG5pbXBvcnQgeyBNYXBNYXJrZXJTdHJpbmdFbnVtIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBlU3RyaW5nUGxhY2Vob2xkZXIgfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5cbi8vIE1vZGVsc1xuaW1wb3J0IHtcbiAgICBJTWFwTWFya2VycyxcbiAgICBJQ2FNYXBQcm9wcyxcbiAgICBJTWFwT3B0aW9ucyxcbiAgICBJUm91dGVQYXRoLFxuICAgIElNYXBCb3VuZHNab29tLFxuICAgIElNYXBTZWxlY3RlZE1hcmtlckRhdGEsXG4gICAgSU1hcEFyZWFGaWx0ZXIsXG59IGZyb20gJy4uL2NhLW1hcC9tb2RlbHMnO1xuXG4vLyBIZWxwZXJzXG5pbXBvcnQgeyBNYXBIZWxwZXIgfSBmcm9tICcuLi9jYS1tYXAvdXRpbHMvaGVscGVycy9tYXAuaGVscGVyJztcblxuLy8gQ29uc3RhbnRzXG5pbXBvcnQgeyBNYXBPcHRpb25zQ29uc3RhbnRzLCBNYXBDb25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2NvbnN0YW50cyc7XG5cbi8vIFNlcnZpY2VzXG5pbXBvcnQgeyBNYXBNYXJrZXJJY29uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvc2VydmljZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1jYS1tYXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYS1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhLW1hcC5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICAvLyBNb2R1bGVzXG4gICAgICAgIEdvb2dsZU1hcHNNb2R1bGUsXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgQW5ndWxhclN2Z0ljb25Nb2R1bGUsXG4gICAgICAgIE5nYlRvb2x0aXBNb2R1bGUsXG5cbiAgICAgICAgLy8gQ29tcG9uZW50c1xuICAgICAgICBDYU1hcERyb3Bkb3duQ29tcG9uZW50LFxuICAgICAgICBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCxcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIENhTWFwQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXG4gICAgICAgIC8vIFNlcnZpY2VzXG4gICAgICAgIHByaXZhdGUgbWFya2VySWNvblNlcnZpY2U6IE1hcE1hcmtlckljb25TZXJ2aWNlXG4gICAgKSB7fVxuICAgIEBWaWV3Q2hpbGQoR29vZ2xlTWFwLCB7IHN0YXRpYzogZmFsc2UgfSkgbWFwcyE6IEdvb2dsZU1hcDtcbiAgICBAVmlld0NoaWxkKCdtYXJrZXJEcm9wZG93bicpIG1hcmtlckRyb3Bkb3duITogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdjbHVzdGVyRHJvcGRvd24nKSBjbHVzdGVyRHJvcGRvd24hOiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KCkgc2V0IGRhdGEodmFsdWVzOiBJQ2FNYXBQcm9wcykge1xuICAgICAgICB0aGlzLmhhbmRsZU1hcERhdGEodmFsdWVzKTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgcmVzZXRTZWxlY3RlZE1hcmtlckl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpIHJvdXRpbmdNYXJrZXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAgIEBPdXRwdXQoKSBjbHVzdGVyTWFya2VyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBNYXJrZXJzPigpO1xuICAgIEBPdXRwdXQoKSBjbHVzdGVyTGlzdFNjcm9sbEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxJTWFwTWFya2Vycz4oKTtcbiAgICBAT3V0cHV0KCkgZ2V0SW5mb1dpbmRvd0RhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICBAT3V0cHV0KCkgYm91bmRzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hcEJvdW5kc1pvb20+KCk7XG4gICAgQE91dHB1dCgpIG9wZW5Jbk1hcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwdWJsaWMgZGlyZWN0aW9uc1JlbmRlcmVyczogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlbmRlcmVyW10gPSBbXTtcblxuICAgIHB1YmxpYyBtYXBPcHRpb25zOiBJTWFwT3B0aW9ucyA9IE1hcE9wdGlvbnNDb25zdGFudHMuREVGQVVMVF9NQVBfT1BUSU9OUztcbiAgICBwdWJsaWMgbWFwWm9vbTogbnVtYmVyID0gTWFwT3B0aW9uc0NvbnN0YW50cy5ERUZBVUxUX01BUF9aT09NO1xuICAgIHB1YmxpYyBtYXBDZW50ZXI6IElSb3V0ZVBhdGggPSBNYXBPcHRpb25zQ29uc3RhbnRzLkRFRkFVTFRfTUFQX0NFTlRFUjtcbiAgICBwdWJsaWMgbWFwOiBnb29nbGUubWFwcy5NYXAgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgbWFwU3R5bGVJZDogc3RyaW5nID0gJ2Q2ODE5MDRhMzkwYTg0MDInO1xuICAgIHB1YmxpYyBtYXBEYXRhOiBJQ2FNYXBQcm9wcyA9IHt9O1xuXG4gICAgcHVibGljIG9wZW5lZEluZm9XaW5kb3dEYXRhOiBJTWFwTWFya2VycyB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBzZWxlY3RlZFJvdXRpbmdNYXJrZXI6IElNYXBNYXJrZXJzIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGFyZWFGaWx0ZXJEYXRhOiBJTWFwQXJlYUZpbHRlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByb3V0ZVBhdGhDb2xvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBwdWJsaWMgcm91dGVQb2x5bGluZXM6IGdvb2dsZS5tYXBzLlBvbHlsaW5lT3B0aW9uc1tdID0gW107XG5cbiAgICBwdWJsaWMgaXNNYXJrZXJEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNDbHVzdGVyRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGlzTWFwQ2VudGVyU2V0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgb3BlbkRyb3Bkb3duVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBzZWxlY3RSb3V0aW5nVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudW1iZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSBjbHVzdGVyTWFya2VySWRzOiBJTWFwTWFya2Vyc1tdID0gW107XG4gICAgcHJpdmF0ZSByb3V0aW5nTWFya2VySWRzOiBJTWFwTWFya2Vyc1tdID0gW107XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gUmVzZXQgYWxsIGljb25zIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUgb24gcGFnZSBsb2FkXG4gICAgICAgIHRoaXMucmVzZXRNYXJrZXJzSWNvbnMoKTtcblxuICAgICAgICB0aGlzLmdldE1hcmtlclNlcnZpY2VEYXRhKCk7XG5cbiAgICAgICAgdGhpcy5zdG9yZVJvdXRlUGF0aENvbG9ycygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5tYXBzLmdvb2dsZU1hcD8uYWRkTGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2x1c3Rlck1hcmtlckNsaWNrKG1hcmtlckl0ZW06IElNYXBNYXJrZXJzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghaXNJbmZvV2luZG93T3BlbmVkKSB0aGlzLmNsdXN0ZXJNYXJrZXJDbGljay5lbWl0KG1hcmtlckl0ZW0pO1xuICAgICAgICBlbHNlIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1hcmtlckluZm9XaW5kb3cobWFya2VySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAobWFya2VySWQpIHRoaXMuZ2V0SW5mb1dpbmRvd0RhdGEuZW1pdChtYXJrZXJJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTWFya2VyQ2xpY2sobWFya2VySXRlbTogSU1hcE1hcmtlcnMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNJbmZvV2luZG93T3BlbmVkID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgIG1hcmtlckl0ZW0sXG4gICAgICAgICAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHRoaXMuZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJdGVtLmRhdGEuaWQpO1xuICAgICAgICBlbHNlIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm91dGluZ01hcmtlckNsaWNrKG1hcmtlckl0ZW06IElNYXBNYXJrZXJzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzUm91dGluZ01hcmtlclNlbGVjdGVkID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgIG1hcmtlckl0ZW0sXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm91dGluZ01hcmtlclxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghaXNSb3V0aW5nTWFya2VyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChtYXJrZXJJdGVtPy5kYXRhPy5pZClcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRpbmdNYXJrZXJDbGljay5lbWl0KG1hcmtlckl0ZW0/LmRhdGE/LmlkKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5oYW5kbGVSb3V0aW5nTWFya2VyU2VsZWN0KG1hcmtlckl0ZW0pO1xuICAgICAgICB9IGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25NYXBSZWFkeShtYXBJbnN0YW5jZTogZ29vZ2xlLm1hcHMuTWFwKToge1xuICAgICAgICBmaWxsQ29sb3I/OiBzdHJpbmc7XG4gICAgICAgIHN0cm9rZUNvbG9yPzogc3RyaW5nO1xuICAgICAgICBzdHJva2VXZWlnaHQ/OiBudW1iZXI7XG4gICAgICAgIGZpbGxPcGFjaXR5PzogbnVtYmVyO1xuICAgIH0gfCB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXBJbnN0YW5jZTtcblxuICAgICAgICBpZiAodGhpcy5tYXBEYXRhPy5kYXJrTW9kZSkge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVkTWFwVHlwZSA9IG5ldyBnb29nbGUubWFwcy5TdHlsZWRNYXBUeXBlKFxuICAgICAgICAgICAgICAgIE1hcENvbnN0YW50cy5HT09HTEVfTUFQX0RBUktfU1RZTEVTXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5tYXAhLm1hcFR5cGVzLnNldChHb29nbGVNYXBFbnVtLkRBUktfTUFQLCBzdHlsZWRNYXBUeXBlKTtcbiAgICAgICAgICAgIHRoaXMubWFwIS5zZXRNYXBUeXBlSWQoR29vZ2xlTWFwRW51bS5EQVJLX01BUCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXBEYXRhLnN0YXRlQm91bmRhcmllc1VybCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVCb3VuZGFyaWVzVXJsID0gdGhpcy5tYXBEYXRhLnN0YXRlQm91bmRhcmllc1VybC51cmw7XG4gICAgICAgICAgICB0aGlzLm1hcHMuZ29vZ2xlTWFwPy5kYXRhLmxvYWRHZW9Kc29uKHN0YXRlQm91bmRhcmllc1VybCk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwcy5nb29nbGVNYXA/LmRhdGEuc2V0U3R5bGUoKGZlYXR1cmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZURlbnNpdHkgPSBmZWF0dXJlLmdldFByb3BlcnR5KCdkZW5zaXR5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBmaWxsQ29sb3IsIGZpbGxPcGFjaXR5IH0gPVxuICAgICAgICAgICAgICAgICAgICBNYXBIZWxwZXIuZ2V0RmlsbENvbG9yRm9yU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZURlbnNpdHkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBEYXRhLnZpZXcgfHwgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6IGZpbGxDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6ICcjRUVFRUVFJyxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAwLjYsXG4gICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiBmaWxsT3BhY2l0eSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbmRCb3VuZHNDaGFuZ2VkRXZlbnQoKTtcbiAgICAgICAgdGhpcy5zZXRNYXBTdHlsZXMoKTtcbiAgICAgICAgdGhpcy5nZXRNYXBJZGxlRXZlbnQobWFwSW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsdXN0ZXJCYWNrQnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZE1hcmtlckl0ZW0uZW1pdCh0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgIG1hcmtlckl0ZW06IElNYXBNYXJrZXJzLFxuICAgICAgICBtYXJrZXJJdGVtMj86IElNYXBNYXJrZXJzIHwgbnVsbFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbWFya2VySXRlbS5wb3NpdGlvbi5sYXQgPT09IG1hcmtlckl0ZW0yPy5wb3NpdGlvbj8ubGF0ICYmXG4gICAgICAgICAgICBtYXJrZXJJdGVtLnBvc2l0aW9uLmxuZyA9PT0gbWFya2VySXRlbTI/LnBvc2l0aW9uPy5sbmdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YSlcbiAgICAgICAgICAgIHRoaXMuY2x1c3Rlckxpc3RTY3JvbGxFdmVudC5lbWl0KHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblpvb21DaGFuZ2UoaXNNaW51c0NsaWNrPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50Wm9vbUxldmVsID0gdGhpcy5tYXA/LmdldFpvb20oKTtcblxuICAgICAgICBpZiAoY3VycmVudFpvb21MZXZlbCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFpvb21MZXZlbCA9IGlzTWludXNDbGlja1xuICAgICAgICAgICAgICAgID8gY3VycmVudFpvb21MZXZlbCAtIDFcbiAgICAgICAgICAgICAgICA6IGN1cnJlbnRab29tTGV2ZWwgKyAxO1xuICAgICAgICAgICAgdGhpcy5tYXA/LnNldFpvb20obmV4dFpvb21MZXZlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25PcGVuSW5NYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkluTWFwRXZlbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlQW5kRGlzcGxheVJvdXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tYXBEYXRhLnJvdXRlUGF0aHMpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIHJvdXRlIHBvbHlsaW5lc1xuICAgICAgICAgICAgdGhpcy5yb3V0ZVBvbHlsaW5lcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLm1hcERhdGEucm91dGVQYXRocyEuZm9yRWFjaCgocm91dGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJvdXRlLmRlY29kZWRTaGFwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2x5TGluZUNvb3JkaW5hdGVzID0gcm91dGUuZGVjb2RlZFNoYXBlPy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXQ6IGl0ZW0ubGF0aXR1ZGUhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbmc6IGl0ZW0ubG9uZ2l0dWRlISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBhdGhEYXNoZWRMaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLk1hcE9wdGlvbnNDb25zdGFudHMuUk9VVElOR19EQVNIRURfTElORV9JQ09OWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uTWFwT3B0aW9uc0NvbnN0YW50cy5ST1VUSU5HX0RBU0hFRF9MSU5FX1BBVEgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiByb3V0ZS5zdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBvbHlsaW5lOiBnb29nbGUubWFwcy5Qb2x5bGluZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBwb2x5TGluZUNvb3JkaW5hdGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvZGVzaWM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zdHJva2VDb2xvciB8fCBHb29nbGVNYXBFbnVtLlNUUk9LRV9DT0xPUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6ICFyb3V0ZS5pc0Rhc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm91dGUuc3Ryb2tlT3BhY2l0eSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlTWFwRW51bS5TVFJPS0VfT1BBQ0lUWVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdlaWdodDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zdHJva2VXZWlnaHQgfHwgR29vZ2xlTWFwRW51bS5TVFJPS0VfV0VJR0hULFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnM6IHJvdXRlLmlzRGFzaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAocm91dGUuZGFzaGVkTGluZVN0eWxlID8/IHJvdXRlUGF0aERhc2hlZExpbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlUG9seWxpbmVzLnB1c2gocm91dGVQb2x5bGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0TWFya2Vyc0ljb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcERhdGEubWFya2Vycz8ubWFwKChtYXJrZXI6IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgJyNtYXJrZXItJyArIG1hcmtlci5pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXJrZXJJY29uKVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24sXG4gICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLm1hcmtlcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7IHpJbmRleDogaW5kZXggKyAxIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1hcERhdGEuY2x1c3Rlck1hcmtlcnM/Lm1hcChcbiAgICAgICAgICAgIChjbHVzdGVyTWFya2VyOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IHRoaXMuZ2V0Q2x1c3RlcklkKGNsdXN0ZXJNYXJrZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgJyNjbHVzdGVyLScgKyBjbHVzdGVySWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXJJY29uKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2Vycz8ubWFwKChyb3V0aW5nTWFya2VyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWFya2VySWNvbiA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgIGVTdHJpbmdQbGFjZWhvbGRlci5IQVNIX1NJR04gKyByb3V0aW5nTWFya2VyLmNvbnRlbnQuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobWFya2VySWNvbilcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3V0aW5nTWFya2VyID0gbnVsbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZVBvbHlsaW5lcyA9IHRoaXMucm91dGVQb2x5bGluZXM/Lm1hcCgocG9seWxpbmUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoU3Ryb2tlQ29sb3IgPSB0aGlzLnJvdXRlUGF0aENvbG9yc1tpbmRleF07XG5cbiAgICAgICAgICAgIGlmIChwb2x5bGluZT8uaWNvbnM/LlswXT8uaWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlUGF0aERhc2hlZExpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLmljb25zWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLmljb25zWzBdLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHBhdGhTdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLFxuICAgICAgICAgICAgICAgICAgICBpY29uczogcm91dGVQYXRoRGFzaGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLFxuICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBwYXRoU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgekluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TWFwU3R5bGVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tYXBEYXRhPy5kYXJrTW9kZSlcbiAgICAgICAgICAgIHRoaXMubWFwT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLm1hcE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc3R5bGVzOiBNYXBDb25zdGFudHMuR09PR0xFX01BUF9EQVJLX1NUWUxFUyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWxsTWFya2Vyc0NvbWJpbmVkID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyA/PyBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5tYXBEYXRhLmNsdXN0ZXJNYXJrZXJzID8/IFtdKSxcbiAgICAgICAgICAgIC4uLih0aGlzLm1hcERhdGEubWFya2VycyA/PyBbXSksXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGFsbE1hcmtlcnNDb21iaW5lZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXBDZW50ZXJBbmRCb3VuZHMgPVxuICAgICAgICAgICAgICAgIE1hcEhlbHBlci5nZXRNYXBDZW50ZXJBbmRab29tKGFsbE1hcmtlcnNDb21iaW5lZCk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwIS5wYW5UbyhtYXBDZW50ZXJBbmRCb3VuZHMubWFwQ2VudGVyKTtcbiAgICAgICAgICAgIGlmIChtYXBDZW50ZXJBbmRCb3VuZHMuYm91bmRzKVxuICAgICAgICAgICAgICAgIHRoaXMubWFwPy5maXRCb3VuZHMobWFwQ2VudGVyQW5kQm91bmRzLmJvdW5kcyk7XG4gICAgICAgICAgICBpZiAobWFwQ2VudGVyQW5kQm91bmRzLm1hcFpvb20pXG4gICAgICAgICAgICAgICAgdGhpcy5tYXA/LnNldFpvb20obWFwQ2VudGVyQW5kQm91bmRzLm1hcFpvb20pO1xuXG4gICAgICAgICAgICB0aGlzLmlzTWFwQ2VudGVyU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWFwSWRsZUV2ZW50KG1hcDogZ29vZ2xlLm1hcHMuTWFwKTogdm9pZCB7XG4gICAgICAgIG1hcC5hZGRMaXN0ZW5lcignaWRsZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRCb3VuZHNDaGFuZ2VkRXZlbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgY29uc3QgbWFwQm91bmRzID0gdGhpcy5tYXAuZ2V0Qm91bmRzKCk7XG4gICAgICAgICAgICBjb25zdCBtYXBab29tID0gdGhpcy5tYXAuZ2V0Wm9vbSgpO1xuXG4gICAgICAgICAgICBpZiAobWFwQm91bmRzICYmIG1hcFpvb20pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZHNPYmplY3QgPSB7IGJvdW5kczogbWFwQm91bmRzLCB6b29tOiBtYXBab29tIH07XG4gICAgICAgICAgICAgICAgdGhpcy5ib3VuZHNDaGFuZ2VkLmVtaXQoYm91bmRzT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb3Blbk1hcmtlckluZm9XaW5kb3cobWFya2VySXRlbTogSU1hcFNlbGVjdGVkTWFya2VyRGF0YSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICAgICAgbWFya2VySXRlbSxcbiAgICAgICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjb21iaW5lZE1hcmtlcnMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLm1hcERhdGEubWFya2VycyEsXG4gICAgICAgICAgICAuLi50aGlzLm1hcERhdGEuY2x1c3Rlck1hcmtlcnMhLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbWJpbmVkTWFya2Vycy5mb3JFYWNoKChpdGVtOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZE1hcmtlciA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBtYXJrZXJJdGVtXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBpc0NsdXN0ZXJNYXJrZXIgPSBpdGVtPy5kYXRhPy5jb3VudCA+IDE7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IGlzQ2x1c3Rlck1hcmtlciA/IHRoaXMuZ2V0Q2x1c3RlcklkKGl0ZW0pIDogbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgbWFya2VySWNvbklkID0gaXNDbHVzdGVyTWFya2VyXG4gICAgICAgICAgICAgICAgPyAnI2NsdXN0ZXItJyArIGNsdXN0ZXJJZFxuICAgICAgICAgICAgICAgIDogJyNtYXJrZXItJyArIGl0ZW0uaWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duRWxlbWVudCA9IGlzQ2x1c3Rlck1hcmtlclxuICAgICAgICAgICAgICAgID8gdGhpcy5jbHVzdGVyRHJvcGRvd24ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgIDogdGhpcy5tYXJrZXJEcm9wZG93bi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZE1hcmtlcikge1xuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucyA9IHsgekluZGV4OiA5OTkgfTtcblxuICAgICAgICAgICAgICAgIGlmIChpc0NsdXN0ZXJNYXJrZXIpIHRoaXMuaXNNYXJrZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaXNDbHVzdGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3BlbkRyb3Bkb3duVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKG1hcmtlckljb25JZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobWFya2VySWNvbj8ucHJldmlvdXNTaWJsaW5nID09PSBkcm9wZG93bkVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbj8ucGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhbWFya2VySWNvbi5jbGFzc0xpc3Q/LmNvbnRhaW5zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9ICFpc0NsdXN0ZXJNYXJrZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDbHVzdGVyRHJvcGRvd25PcGVuID0gaXNDbHVzdGVyTWFya2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0sIDUwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VySWNvbiA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKG1hcmtlckljb25JZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24/LmNsYXNzTGlzdD8uY29udGFpbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucyA9IHsgekluZGV4OiBpbmRleCArIDEgfTtcbiAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSBtYXJrZXJJdGVtO1xuXG4gICAgICAgIGlmICghaXNJbmZvV2luZG93T3BlbmVkKSB0aGlzLm1hcCEucGFuVG8obWFya2VySXRlbS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbG9zZUluZm9XaW5kb3coKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRNYXJrZXJzSWNvbnMoKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhID0gbnVsbCksIDI1MCk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMub3BlbkRyb3Bkb3duVGltZW91dCk7XG4gICAgICAgIHRoaXMuaXNNYXJrZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0NsdXN0ZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRpbmdNYXJrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVJvdXRpbmdNYXJrZXJTZWxlY3QobWFya2VySXRlbTogSU1hcE1hcmtlcnMpOiB2b2lkIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkUGF0aEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAgICAgICB0aGlzLm1hcERhdGE/LnJvdXRpbmdNYXJrZXJzPy5tYXAoXG4gICAgICAgICAgICAoaXRlbTogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkTWFya2VyID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgbWFya2VySXRlbSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uSWQgPVxuICAgICAgICAgICAgICAgICAgICBlU3RyaW5nUGxhY2Vob2xkZXIuSEFTSF9TSUdOICsgaXRlbS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXRoSW5kZXggPSBpbmRleCAtIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFya2VySWNvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihtYXJrZXJJY29uSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFtYXJrZXJJY29uLmNsYXNzTGlzdD8uY29udGFpbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VySXRlbS5pbmZvV2luZG93Q29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24/LnByZXZpb3VzU2libGluZyA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbHVzdGVyRHJvcGRvd24ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbj8ucGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbHVzdGVyRHJvcGRvd24ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDbHVzdGVyRHJvcGRvd25PcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSB7IC4uLm1hcmtlckl0ZW0gfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogeyB6SW5kZXg6IDk5OSB9LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IobWFya2VySWNvbklkKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7IHpJbmRleDogaW5kZXggKyAxIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucm91dGVQb2x5bGluZXMgPSB0aGlzLnJvdXRlUG9seWxpbmVzPy5tYXAoKHBvbHlsaW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJva2VDb2xvciA9IHRoaXMucm91dGVQYXRoQ29sb3JzW2luZGV4XTtcblxuICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZFBhdGggPSBzZWxlY3RlZFBhdGhJbmRleCA9PT0gaW5kZXg7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzVG93aW5nUGF0aCA9XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZVBhdGhDb2xvcnNbaW5kZXhdID09PVxuICAgICAgICAgICAgICAgIE1hcE9wdGlvbnNDb25zdGFudHMuUk9VVElOR19QQVRIX0NPTE9SU1sncHVycGxlJ107XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBhdGhJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRQYXRoKVxuICAgICAgICAgICAgICAgICAgICBwYXRoU3Ryb2tlQ29sb3IgPSBpc1Rvd2luZ1BhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gTWFwT3B0aW9uc0NvbnN0YW50cy5ST1VUSU5HX1BBVEhfQ09MT1JTWydkYXJrcHVycGxlJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIDogTWFwT3B0aW9uc0NvbnN0YW50cy5ST1VUSU5HX1BBVEhfQ09MT1JTWydkYXJrZ3JheSddO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcGF0aFN0cm9rZUNvbG9yID0gaXNUb3dpbmdQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE1hcE9wdGlvbnNDb25zdGFudHMuUk9VVElOR19QQVRIX0NPTE9SU1snbGlnaHRwdXJwbGUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXBPcHRpb25zQ29uc3RhbnRzLlJPVVRJTkdfUEFUSF9DT0xPUlNbJ2xpZ2h0Z3JheSddO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9seWxpbmU/Lmljb25zPy5bMF0/Lmljb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBhdGhEYXNoZWRMaW5lID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5wb2x5bGluZS5pY29uc1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wb2x5bGluZS5pY29uc1swXS5pY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBwYXRoU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5wb2x5bGluZSxcbiAgICAgICAgICAgICAgICAgICAgaWNvbnM6IHJvdXRlUGF0aERhc2hlZExpbmUsXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleDogaXNTZWxlY3RlZFBhdGggPyA5OTkgOiBpbmRleCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLFxuICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBwYXRoU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgekluZGV4OiBpc1NlbGVjdGVkUGF0aCA/IDk5OSA6IGluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRpbmdNYXJrZXIgPSBtYXJrZXJJdGVtO1xuXG4gICAgICAgIHRoaXMubWFwIS5wYW5UbyhtYXJrZXJJdGVtLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZU1hcERhdGEobmV3RGF0YTogSUNhTWFwUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXBEYXRhID0geyAuLi5uZXdEYXRhIH07XG5cbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YS5zZWxlY3RlZE1hcmtlckRhdGEpXG4gICAgICAgICAgICB0aGlzLm9wZW5NYXJrZXJJbmZvV2luZG93KHRoaXMubWFwRGF0YS5zZWxlY3RlZE1hcmtlckRhdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcERhdGEuc2VsZWN0ZWRSb3V0aW5nTWFya2VyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUm91dGluZ01hcmtlclNlbGVjdChcbiAgICAgICAgICAgICAgICB0aGlzLm1hcERhdGEuc2VsZWN0ZWRSb3V0aW5nTWFya2VyRGF0YVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5tYXBEYXRhLnJvdXRlUGF0aHM/Lmxlbmd0aCAhPT0gdGhpcy5yb3V0ZVBhdGhDb2xvcnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zdG9yZVJvdXRlUGF0aENvbG9ycygpO1xuXG4gICAgICAgIHRoaXMuYXJlYUZpbHRlckRhdGEgPSB0aGlzLm1hcERhdGEuYXJlYUZpbHRlckRhdGEgfHwgbnVsbDtcblxuICAgICAgICBpZiAobmV3RGF0YSAmJiAhdGhpcy5pc01hcENlbnRlclNldCAmJiB0aGlzLm1hcCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG5ld0RhdGEubWFya2Vycz8ubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgbmV3RGF0YS5jbHVzdGVyTWFya2Vycz8ubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgbmV3RGF0YS5yb3V0aW5nTWFya2Vycz8ubGVuZ3RoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNYXBTdHlsZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc3BsYXkgcm91dGVzIGZvciByb3V0aW5nTWFya2Vyc1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUFuZERpc3BsYXlSb3V0ZSgpO1xuXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2x1c3RlcklkKGNsdXN0ZXJEYXRhOiBJTWFwTWFya2Vycyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBjbHVzdGVySWQgPSB0aGlzLmNsdXN0ZXJNYXJrZXJJZHMuZmluZChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIGNsdXN0ZXJEYXRhLnBvc2l0aW9uLmxhdCA9PT0gaXRlbS5wb3NpdGlvbi5sYXQgJiZcbiAgICAgICAgICAgICAgICBjbHVzdGVyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgICAgICk/LmlkO1xuXG4gICAgICAgIHJldHVybiBjbHVzdGVySWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJvdXRpbmdJZChtYXJrZXJEYXRhOiBJTWFwTWFya2Vycyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCByb3V0aW5nSWQgPSB0aGlzLnJvdXRpbmdNYXJrZXJJZHMuZmluZChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIG1hcmtlckRhdGEucG9zaXRpb24ubGF0ID09PSBpdGVtLnBvc2l0aW9uLmxhdCAmJlxuICAgICAgICAgICAgICAgIG1hcmtlckRhdGEucG9zaXRpb24ubG5nID09PSBpdGVtLnBvc2l0aW9uLmxuZ1xuICAgICAgICApPy5pZDtcblxuICAgICAgICByZXR1cm4gcm91dGluZ0lkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXJrZXJTZXJ2aWNlRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZXJJY29uU2VydmljZS5jbHVzdGVyTWFya2VySWRzJFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2x1c3RlcklkcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2x1c3Rlck1hcmtlcklkcyA9IGNsdXN0ZXJJZHM7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1hcmtlckljb25TZXJ2aWNlLnJvdXRpbmdNYXJrZXJJZHMkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyb3V0aW5nSWRzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nTWFya2VySWRzID0gcm91dGluZ0lkcztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RvcmVSb3V0ZVBhdGhDb2xvcnMoKTogdm9pZCB7XG4gICAgICAgIGxldCBwYXRoQ29sb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIHRoaXMubWFwRGF0YS5yb3V0ZVBhdGhzPy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICBwYXRoQ29sb3JzID0gWy4uLnBhdGhDb2xvcnMsIHBhdGguc3Ryb2tlQ29sb3JdO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJvdXRlUGF0aENvbG9ycyA9IFsuLi5wYXRoQ29sb3JzXTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8Z29vZ2xlLW1hcFxuICAgIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIlxuICAgIFtjbGFzcy5kYXJrLW1vZGUtbWFwXT1cIm1hcERhdGEuZGFya01vZGVcIlxuICAgIGhlaWdodD1cIjEwMCVcIlxuICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgW3pvb21dPVwibWFwWm9vbVwiXG4gICAgW2NlbnRlcl09XCJtYXBDZW50ZXJcIlxuICAgIFtvcHRpb25zXT1cIm1hcE9wdGlvbnNcIlxuICAgIFttYXBJZF09XCJtYXBTdHlsZUlkXCJcbiAgICAobWFwSW5pdGlhbGl6ZWQpPVwib25NYXBSZWFkeSgkZXZlbnQpXCJcbj5cbiAgICBAZm9yIChtYXJrZXIgb2YgbWFwRGF0YS5tYXJrZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgbWFya2VyLmRhdGEuaWQpIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJtYXJrZXIucG9zaXRpb25cIlxuICAgICAgICAgICAgW2NvbnRlbnRdPVwibWFya2VyLmNvbnRlbnRcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJcbiAgICAgICAgICAgICAgICBvcGVuZWRJbmZvV2luZG93RGF0YT8uZGF0YT8uaWQgPT09IG1hcmtlci5kYXRhLmlkID8gOTk5IDogaVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChtYXBDbGljayk9XCJvbk1hcmtlckNsaWNrKG1hcmtlcilcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWFwLWFkdmFuY2VkLW1hcmtlcj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgICNtYXJrZXJEcm9wZG93blxuICAgICAgICBjbGFzcz1cIm1hcmtlci1kcm9wZG93biBkcm9wZG93bi1oaWRkZW5cIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdkcm9wZG93bi1oaWRkZW4nOiAhaXNNYXJrZXJEcm9wZG93bk9wZW4gfVwiXG4gICAgPlxuICAgICAgICA8YXBwLWNhLW1hcC1kcm9wZG93blxuICAgICAgICAgICAgW2luZm9XaW5kb3dDb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICFpc0NsdXN0ZXJEcm9wZG93bk9wZW5cbiAgICAgICAgICAgICAgICAgICAgPyBvcGVuZWRJbmZvV2luZG93RGF0YT8uaW5mb1dpbmRvd0NvbnRlbnQhXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttYXJrZXJEYXRhXT1cIm9wZW5lZEluZm9XaW5kb3dEYXRhPy5kYXRhXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJJdGVtQ2xpY2spPVwiZ2V0TWFya2VySW5mb1dpbmRvdygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQpPVwib25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKClcIlxuICAgICAgICAgICAgKG9uQmFja0J1dHRvbkNsaWNrKT1cIm9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpXCJcbiAgICAgICAgPjwvYXBwLWNhLW1hcC1kcm9wZG93bj5cbiAgICA8L2Rpdj5cblxuICAgIEBmb3IgKFxuICAgICAgICBjbHVzdGVyTWFya2VyIG9mIG1hcERhdGEuY2x1c3Rlck1hcmtlcnM7XG4gICAgICAgIGxldCBpID0gJGluZGV4O1xuICAgICAgICB0cmFjayBjbHVzdGVyTWFya2VyLnBvc2l0aW9uXG4gICAgKSB7XG4gICAgICAgIDxtYXAtYWR2YW5jZWQtbWFya2VyXG4gICAgICAgICAgICBbcG9zaXRpb25dPVwiY2x1c3Rlck1hcmtlci5wb3NpdGlvblwiXG4gICAgICAgICAgICBbY29udGVudF09XCJjbHVzdGVyTWFya2VyLmNvbnRlbnRcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJcbiAgICAgICAgICAgICAgICBjaGVja0luZm9XaW5kb3dQb3NpdGlvbihjbHVzdGVyTWFya2VyLCBvcGVuZWRJbmZvV2luZG93RGF0YSlcbiAgICAgICAgICAgICAgICAgICAgPyA5OTlcbiAgICAgICAgICAgICAgICAgICAgOiBpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1hcENsaWNrKT1cIm9uQ2x1c3Rlck1hcmtlckNsaWNrKGNsdXN0ZXJNYXJrZXIpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hcC1hZHZhbmNlZC1tYXJrZXI+XG4gICAgfVxuXG4gICAgQGZvciAocm91dGUgb2Ygcm91dGVQb2x5bGluZXM7IGxldCBpID0gJGluZGV4OyB0cmFjayBpKSB7XG4gICAgICAgIDxtYXAtcG9seWxpbmUgW29wdGlvbnNdPVwicm91dGVcIj48L21hcC1wb2x5bGluZT5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgICNjbHVzdGVyRHJvcGRvd25cbiAgICAgICAgY2xhc3M9XCJtYXJrZXItZHJvcGRvd24gY2x1c3Rlci1kcm9wZG93biBkcm9wZG93bi1oaWRkZW5cIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdkcm9wZG93bi1oaWRkZW4nOiAhaXNDbHVzdGVyRHJvcGRvd25PcGVuIH1cIlxuICAgID5cbiAgICAgICAgPGFwcC1jYS1tYXAtZHJvcGRvd25cbiAgICAgICAgICAgIFtpbmZvV2luZG93Q29udGVudF09XCJcbiAgICAgICAgICAgICAgICAhaXNNYXJrZXJEcm9wZG93bk9wZW5cbiAgICAgICAgICAgICAgICAgICAgPyBvcGVuZWRJbmZvV2luZG93RGF0YT8uaW5mb1dpbmRvd0NvbnRlbnQhXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttYXJrZXJEYXRhXT1cIm9wZW5lZEluZm9XaW5kb3dEYXRhPy5kYXRhXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJJdGVtQ2xpY2spPVwiZ2V0TWFya2VySW5mb1dpbmRvdygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQpPVwib25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKClcIlxuICAgICAgICAgICAgKG9uQmFja0J1dHRvbkNsaWNrKT1cIm9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpXCJcbiAgICAgICAgPjwvYXBwLWNhLW1hcC1kcm9wZG93bj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoYXJlYUZpbHRlckRhdGEpIHtcbiAgICAgICAgPG1hcC1jaXJjbGVcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImFyZWFGaWx0ZXJEYXRhLm9wdGlvbnNcIlxuICAgICAgICAgICAgW2NlbnRlcl09XCJhcmVhRmlsdGVyRGF0YS5jZW50ZXJcIlxuICAgICAgICAgICAgW3JhZGl1c109XCJhcmVhRmlsdGVyRGF0YS5yYWRpdXNcIlxuICAgICAgICA+PC9tYXAtY2lyY2xlPlxuICAgIH1cblxuICAgIEBmb3IgKHJvdXRpbmdNYXJrZXIgb2YgbWFwRGF0YS5yb3V0aW5nTWFya2VyczsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJyb3V0aW5nTWFya2VyLnBvc2l0aW9uXCJcbiAgICAgICAgICAgIFtjb250ZW50XT1cInJvdXRpbmdNYXJrZXIuY29udGVudFwiXG4gICAgICAgICAgICBbekluZGV4XT1cIlxuICAgICAgICAgICAgICAgIGNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKHJvdXRpbmdNYXJrZXIsIHNlbGVjdGVkUm91dGluZ01hcmtlcilcbiAgICAgICAgICAgICAgICAgICAgPyA5OTlcbiAgICAgICAgICAgICAgICAgICAgOiBpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1hcENsaWNrKT1cIlxuICAgICAgICAgICAgICAgIHJvdXRpbmdNYXJrZXIuaGFzQ2xpY2tFdmVudCAmJlxuICAgICAgICAgICAgICAgICAgICBvblJvdXRpbmdNYXJrZXJDbGljayhyb3V0aW5nTWFya2VyKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hcC1hZHZhbmNlZC1tYXJrZXI+XG4gICAgfVxuXG4gICAgQGlmIChtYXBEYXRhLmlzT3BlbkluTWFwU2hvd24pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJvcGVuLWluLW1hcC1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcbiAgICAgICAgICAgIG5nYlRvb2x0aXBcbiAgICAgICAgICAgIG1haW5DYVRvb2x0aXA9XCJPcGVuIGluIE1hcFwiXG4gICAgICAgICAgICB0b29sdGlwQmFja2dyb3VuZD1cIiM0MjQyNDJcIlxuICAgICAgICAgICAgcG9zaXRpb249XCJib3R0b21cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3BlbkluTWFwKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBzdmctc2l6ZS0xOFwiXG4gICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2NhLWNvbXBvbmVudHMvc3ZnL2NvbW1vbi9pY19sb2NhdGlvbl9tYXAuc3ZnXCJcbiAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKG1hcERhdGEuaXNab29tU2hvd24pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtYXAtem9vbS1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWVuZCBnYXAtMVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2ZsZXgtY29sdW1uJzogIW1hcERhdGEuaXNWZXJ0aWNhbFpvb20sXG4gICAgICAgICAgICAgICAgJ3ZlcnRpY2FsLXpvb20tYnV0dG9ucyc6IG1hcERhdGEuaXNWZXJ0aWNhbFpvb20sXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWFwLXpvb20tYnV0dG9ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmxleC1jb2x1bW5dPVwibWFwRGF0YS5pc1ZlcnRpY2FsWm9vbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZSh0cnVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IHN2Zy1zaXplLTE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9wb3B1cC9NaW51cy5zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zdmctaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiem9vbS1idXR0b24tY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25ab29tQ2hhbmdlKGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IHN2Zy1zaXplLTE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9jb21tb24vaWNfcGx1cy5zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zdmctaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcC16b29tLXJhbmdlIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFuZ2UtbGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS10ZXh0IGNhLWZvbnQtbWVkaXVtXCI+NTAgbWk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFuZ2UtbGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbjwvZ29vZ2xlLW1hcD5cbiJdfQ==
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLW1hcC9jYS1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtbWFwL2NhLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLFVBQVU7QUFDVixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsYUFBYTtBQUNiLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRTNGLFFBQVE7QUFDUixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFqRCxVQUFVO0FBQ1YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9DQUFv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O1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7K0dBaHBCUSxjQUFjO21HQUFkLGNBQWMsdWJBU1osU0FBUyx3UEMzRXhCLHFuTEFpS0E7Z0JEM0dRLFVBQVU7Z0JBQ1YsZ0JBQWdCLHlpREFDaEIsWUFBWSw0SEFDWixvQkFBb0IsZ09BQ3BCLGdCQUFnQjtnQkFFaEIsYUFBYTtnQkFDYixzQkFBc0IsOE1BQ3RCLHVCQUF1Qjs7NEZBSWxCLGNBQWM7a0JBbEIxQixTQUFTOytCQUNJLFlBQVksY0FHVixJQUFJLFdBQ1A7d0JBQ0wsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBRWhCLGFBQWE7d0JBQ2Isc0JBQXNCO3dCQUN0Qix1QkFBdUI7cUJBQzFCLGlCQUNjLGlCQUFpQixDQUFDLElBQUk7MEtBV0ksSUFBSTtzQkFBNUMsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNWLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNHLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUVmLElBQUk7c0JBQWhCLEtBQUs7Z0JBSUksdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbi8vIE1vZHVsZXNcbmltcG9ydCB7IEFuZ3VsYXJTdmdJY29uTW9kdWxlIH0gZnJvbSAnYW5ndWxhci1zdmctaWNvbic7XG5pbXBvcnQgeyBOZ2JUb29sdGlwTW9kdWxlIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgR29vZ2xlTWFwLCBHb29nbGVNYXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xuXG4vLyBDb21wb25lbnRzXG5pbXBvcnQgeyBDYU1hcERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vY2EtbWFwLWRyb3Bkb3duL2NhLW1hcC1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FBcHBUb29sdGlwVjJDb21wb25lbnQgfSBmcm9tICcuLi9jYS1hcHAtdG9vbHRpcC12Mi9jYS1hcHAtdG9vbHRpcC12Mi5jb21wb25lbnQnO1xuXG4vLyBFbnVtc1xuaW1wb3J0IHsgR29vZ2xlTWFwRW51bSB9IGZyb20gJy4uL2NhLW1hcC9lbnVtcy9nb29nbGUtbWFwLmVudW0nO1xuaW1wb3J0IHsgTWFwTWFya2VyU3RyaW5nRW51bSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgZVN0cmluZ1BsYWNlaG9sZGVyIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuXG4vLyBNb2RlbHNcbmltcG9ydCB7XG4gICAgSU1hcE1hcmtlcnMsXG4gICAgSUNhTWFwUHJvcHMsXG4gICAgSU1hcE9wdGlvbnMsXG4gICAgSVJvdXRlUGF0aCxcbiAgICBJTWFwQm91bmRzWm9vbSxcbiAgICBJTWFwU2VsZWN0ZWRNYXJrZXJEYXRhLFxuICAgIElNYXBBcmVhRmlsdGVyLFxufSBmcm9tICcuLi9jYS1tYXAvbW9kZWxzJztcblxuLy8gSGVscGVyc1xuaW1wb3J0IHsgTWFwSGVscGVyIH0gZnJvbSAnLi4vY2EtbWFwL3V0aWxzL2hlbHBlcnMvbWFwLmhlbHBlcic7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHsgTWFwT3B0aW9uc0NvbnN0YW50cywgTWFwQ29uc3RhbnRzIH0gZnJvbSAnLi91dGlscy9jb25zdGFudHMnO1xuXG4vLyBTZXJ2aWNlc1xuaW1wb3J0IHsgTWFwTWFya2VySWNvblNlcnZpY2UgfSBmcm9tICcuL3V0aWxzL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtY2EtbWFwJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2EtbWFwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYS1tYXAuY29tcG9uZW50LnNjc3MnXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgLy8gTW9kdWxlc1xuICAgICAgICBHb29nbGVNYXBzTW9kdWxlLFxuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEFuZ3VsYXJTdmdJY29uTW9kdWxlLFxuICAgICAgICBOZ2JUb29sdGlwTW9kdWxlLFxuXG4gICAgICAgIC8vIENvbXBvbmVudHNcbiAgICAgICAgQ2FNYXBEcm9wZG93bkNvbXBvbmVudCxcbiAgICAgICAgQ2FBcHBUb29sdGlwVjJDb21wb25lbnQsXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBDYU1hcENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcblxuICAgICAgICAvLyBTZXJ2aWNlc1xuICAgICAgICBwcml2YXRlIG1hcmtlckljb25TZXJ2aWNlOiBNYXBNYXJrZXJJY29uU2VydmljZVxuICAgICkge31cbiAgICBAVmlld0NoaWxkKEdvb2dsZU1hcCwgeyBzdGF0aWM6IGZhbHNlIH0pIG1hcHMhOiBHb29nbGVNYXA7XG4gICAgQFZpZXdDaGlsZCgnbWFya2VyRHJvcGRvd24nKSBtYXJrZXJEcm9wZG93biE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY2x1c3RlckRyb3Bkb3duJykgY2x1c3RlckRyb3Bkb3duITogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlczogSUNhTWFwUHJvcHMpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNYXBEYXRhKHZhbHVlcyk7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIHJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKSByb3V0aW5nTWFya2VyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICBAT3V0cHV0KCkgY2x1c3Rlck1hcmtlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJTWFwTWFya2Vycz4oKTtcbiAgICBAT3V0cHV0KCkgY2x1c3Rlckxpc3RTY3JvbGxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hcE1hcmtlcnM+KCk7XG4gICAgQE91dHB1dCgpIGdldEluZm9XaW5kb3dEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgQE91dHB1dCgpIGJvdW5kc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBCb3VuZHNab29tPigpO1xuICAgIEBPdXRwdXQoKSBvcGVuSW5NYXBFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcHVibGljIGRpcmVjdGlvbnNSZW5kZXJlcnM6IGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcltdID0gW107XG5cbiAgICBwdWJsaWMgbWFwT3B0aW9uczogSU1hcE9wdGlvbnMgPSBNYXBPcHRpb25zQ29uc3RhbnRzLkRFRkFVTFRfTUFQX09QVElPTlM7XG4gICAgcHVibGljIG1hcFpvb206IG51bWJlciA9IE1hcE9wdGlvbnNDb25zdGFudHMuREVGQVVMVF9NQVBfWk9PTTtcbiAgICBwdWJsaWMgbWFwQ2VudGVyOiBJUm91dGVQYXRoID0gTWFwT3B0aW9uc0NvbnN0YW50cy5ERUZBVUxUX01BUF9DRU5URVI7XG4gICAgcHVibGljIG1hcDogZ29vZ2xlLm1hcHMuTWFwIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG1hcFN0eWxlSWQ6IHN0cmluZyA9ICdkNjgxOTA0YTM5MGE4NDAyJztcbiAgICBwdWJsaWMgbWFwRGF0YTogSUNhTWFwUHJvcHMgPSB7fTtcblxuICAgIHB1YmxpYyBvcGVuZWRJbmZvV2luZG93RGF0YTogSU1hcE1hcmtlcnMgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgc2VsZWN0ZWRSb3V0aW5nTWFya2VyOiBJTWFwTWFya2VycyB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBhcmVhRmlsdGVyRGF0YTogSU1hcEFyZWFGaWx0ZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcm91dGVQYXRoQ29sb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHVibGljIHJvdXRlUG9seWxpbmVzOiBnb29nbGUubWFwcy5Qb2x5bGluZU9wdGlvbnNbXSA9IFtdO1xuXG4gICAgcHVibGljIGlzTWFya2VyRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGlzQ2x1c3RlckRyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc01hcENlbnRlclNldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIG9wZW5Ecm9wZG93blRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgc2VsZWN0Um91dGluZ1RpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgY2x1c3Rlck1hcmtlcklkczogSU1hcE1hcmtlcnNbXSA9IFtdO1xuICAgIHByaXZhdGUgcm91dGluZ01hcmtlcklkczogSU1hcE1hcmtlcnNbXSA9IFtdO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIFJlc2V0IGFsbCBpY29ucyB0byB0aGVpciBpbml0aWFsIHN0YXRlIG9uIHBhZ2UgbG9hZFxuICAgICAgICB0aGlzLnJlc2V0TWFya2Vyc0ljb25zKCk7XG5cbiAgICAgICAgdGhpcy5nZXRNYXJrZXJTZXJ2aWNlRGF0YSgpO1xuXG4gICAgICAgIHRoaXMuc3RvcmVSb3V0ZVBhdGhDb2xvcnMoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMubWFwcy5nb29nbGVNYXA/LmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsdXN0ZXJNYXJrZXJDbGljayhtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICAgICAgbWFya2VySXRlbSxcbiAgICAgICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzSW5mb1dpbmRvd09wZW5lZCkgdGhpcy5jbHVzdGVyTWFya2VyQ2xpY2suZW1pdChtYXJrZXJJdGVtKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsb3NlSW5mb1dpbmRvdygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYXJrZXJJbmZvV2luZG93KG1hcmtlcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKG1hcmtlcklkKSB0aGlzLmdldEluZm9XaW5kb3dEYXRhLmVtaXQobWFya2VySWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1hcmtlckNsaWNrKG1hcmtlckl0ZW06IElNYXBNYXJrZXJzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghaXNJbmZvV2luZG93T3BlbmVkKSB0aGlzLmdldE1hcmtlckluZm9XaW5kb3cobWFya2VySXRlbS5kYXRhLmlkKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsb3NlSW5mb1dpbmRvdygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJvdXRpbmdNYXJrZXJDbGljayhtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc1JvdXRpbmdNYXJrZXJTZWxlY3RlZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRpbmdNYXJrZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzUm91dGluZ01hcmtlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobWFya2VySXRlbT8uZGF0YT8uaWQpXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nTWFya2VyQ2xpY2suZW1pdChtYXJrZXJJdGVtPy5kYXRhPy5pZCk7XG4gICAgICAgICAgICBlbHNlIHRoaXMuaGFuZGxlUm91dGluZ01hcmtlclNlbGVjdChtYXJrZXJJdGVtKTtcbiAgICAgICAgfSBlbHNlIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTWFwUmVhZHkobWFwSW5zdGFuY2U6IGdvb2dsZS5tYXBzLk1hcCk6IHtcbiAgICAgICAgZmlsbENvbG9yPzogc3RyaW5nO1xuICAgICAgICBzdHJva2VDb2xvcj86IHN0cmluZztcbiAgICAgICAgc3Ryb2tlV2VpZ2h0PzogbnVtYmVyO1xuICAgICAgICBmaWxsT3BhY2l0eT86IG51bWJlcjtcbiAgICB9IHwgdm9pZCB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwSW5zdGFuY2U7XG5cbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YT8uZGFya01vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlZE1hcFR5cGUgPSBuZXcgZ29vZ2xlLm1hcHMuU3R5bGVkTWFwVHlwZShcbiAgICAgICAgICAgICAgICBNYXBDb25zdGFudHMuR09PR0xFX01BUF9EQVJLX1NUWUxFU1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubWFwIS5tYXBUeXBlcy5zZXQoR29vZ2xlTWFwRW51bS5EQVJLX01BUCwgc3R5bGVkTWFwVHlwZSk7XG4gICAgICAgICAgICB0aGlzLm1hcCEuc2V0TWFwVHlwZUlkKEdvb2dsZU1hcEVudW0uREFSS19NQVApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YS5zdGF0ZUJvdW5kYXJpZXNVcmwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlQm91bmRhcmllc1VybCA9IHRoaXMubWFwRGF0YS5zdGF0ZUJvdW5kYXJpZXNVcmwudXJsO1xuICAgICAgICAgICAgdGhpcy5tYXBzLmdvb2dsZU1hcD8uZGF0YS5sb2FkR2VvSnNvbihzdGF0ZUJvdW5kYXJpZXNVcmwpO1xuXG4gICAgICAgICAgICB0aGlzLm1hcHMuZ29vZ2xlTWFwPy5kYXRhLnNldFN0eWxlKChmZWF0dXJlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVEZW5zaXR5ID0gZmVhdHVyZS5nZXRQcm9wZXJ0eSgnZGVuc2l0eScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsbENvbG9yLCBmaWxsT3BhY2l0eSB9ID1cbiAgICAgICAgICAgICAgICAgICAgTWFwSGVscGVyLmdldEZpbGxDb2xvckZvclN0YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVEZW5zaXR5IGFzIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwRGF0YS52aWV3IHx8ICcnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiBmaWxsQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAnI0VFRUVFRScsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdlaWdodDogMC42LFxuICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogZmlsbE9wYWNpdHksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kQm91bmRzQ2hhbmdlZEV2ZW50KCk7XG4gICAgICAgIHRoaXMuc2V0TWFwU3R5bGVzKCk7XG4gICAgICAgIHRoaXMuZ2V0TWFwSWRsZUV2ZW50KG1hcEluc3RhbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbHVzdGVyQmFja0J1dHRvbkNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICBtYXJrZXJJdGVtOiBJTWFwTWFya2VycyxcbiAgICAgICAgbWFya2VySXRlbTI/OiBJTWFwTWFya2VycyB8IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1hcmtlckl0ZW0ucG9zaXRpb24ubGF0ID09PSBtYXJrZXJJdGVtMj8ucG9zaXRpb24/LmxhdCAmJlxuICAgICAgICAgICAgbWFya2VySXRlbS5wb3NpdGlvbi5sbmcgPT09IG1hcmtlckl0ZW0yPy5wb3NpdGlvbj8ubG5nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEpXG4gICAgICAgICAgICB0aGlzLmNsdXN0ZXJMaXN0U2Nyb2xsRXZlbnQuZW1pdCh0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25ab29tQ2hhbmdlKGlzTWludXNDbGljaz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudFpvb21MZXZlbCA9IHRoaXMubWFwPy5nZXRab29tKCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRab29tTGV2ZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRab29tTGV2ZWwgPSBpc01pbnVzQ2xpY2tcbiAgICAgICAgICAgICAgICA/IGN1cnJlbnRab29tTGV2ZWwgLSAxXG4gICAgICAgICAgICAgICAgOiBjdXJyZW50Wm9vbUxldmVsICsgMTtcbiAgICAgICAgICAgIHRoaXMubWFwPy5zZXRab29tKG5leHRab29tTGV2ZWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3BlbkluTWFwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW5Jbk1hcEV2ZW50LmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFuZERpc3BsYXlSb3V0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YS5yb3V0ZVBhdGhzKSB7XG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91cyByb3V0ZSBwb2x5bGluZXNcbiAgICAgICAgICAgIHRoaXMucm91dGVQb2x5bGluZXMgPSBbXTtcblxuICAgICAgICAgICAgdGhpcy5tYXBEYXRhLnJvdXRlUGF0aHMhLmZvckVhY2goKHJvdXRlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5kZWNvZGVkU2hhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9seUxpbmVDb29yZGluYXRlcyA9IHJvdXRlLmRlY29kZWRTaGFwZT8ubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0OiBpdGVtLmxhdGl0dWRlISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5nOiBpdGVtLmxvbmdpdHVkZSEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGVQYXRoRGFzaGVkTGluZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5NYXBPcHRpb25zQ29uc3RhbnRzLlJPVVRJTkdfREFTSEVEX0xJTkVfSUNPTlswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLk1hcE9wdGlvbnNDb25zdGFudHMuUk9VVElOR19EQVNIRURfTElORV9QQVRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogcm91dGUuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGVQb2x5bGluZTogZ29vZ2xlLm1hcHMuUG9seWxpbmVPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcG9seUxpbmVDb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb2Rlc2ljOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuc3Ryb2tlQ29sb3IgfHwgR29vZ2xlTWFwRW51bS5TVFJPS0VfQ09MT1IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VPcGFjaXR5OiAhcm91dGUuaXNEYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJvdXRlLnN0cm9rZU9wYWNpdHkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2dsZU1hcEVudW0uU1RST0tFX09QQUNJVFlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VXZWlnaHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuc3Ryb2tlV2VpZ2h0IHx8IEdvb2dsZU1hcEVudW0uU1RST0tFX1dFSUdIVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zOiByb3V0ZS5pc0Rhc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHJvdXRlLmRhc2hlZExpbmVTdHlsZSA/PyByb3V0ZVBhdGhEYXNoZWRMaW5lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVQb2x5bGluZXMucHVzaChyb3V0ZVBvbHlsaW5lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRNYXJrZXJzSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwRGF0YS5tYXJrZXJzPy5tYXAoKG1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnI21hcmtlci0nICsgbWFya2VyLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG1hcmtlckljb24pXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbixcbiAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmlzTWFya2VyRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ubWFya2VyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgekluZGV4OiBpbmRleCArIDEgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubWFwRGF0YS5jbHVzdGVyTWFya2Vycz8ubWFwKFxuICAgICAgICAgICAgKGNsdXN0ZXJNYXJrZXI6IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2x1c3RlcklkID0gdGhpcy5nZXRDbHVzdGVySWQoY2x1c3Rlck1hcmtlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VySWNvbiA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICAnI2NsdXN0ZXItJyArIGNsdXN0ZXJJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlckljb24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDbHVzdGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5tYXBEYXRhLnJvdXRpbmdNYXJrZXJzPy5tYXAoKHJvdXRpbmdNYXJrZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgZVN0cmluZ1BsYWNlaG9sZGVyLkhBU0hfU0lHTiArIHJvdXRpbmdNYXJrZXIuY29udGVudC5pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXJrZXJJY29uKVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24sXG4gICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRpbmdNYXJrZXIgPSBudWxsO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJvdXRlUG9seWxpbmVzID0gdGhpcy5yb3V0ZVBvbHlsaW5lcz8ubWFwKChwb2x5bGluZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTdHJva2VDb2xvciA9IHRoaXMucm91dGVQYXRoQ29sb3JzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKHBvbHlsaW5lPy5pY29ucz8uWzBdPy5pY29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm91dGVQYXRoRGFzaGVkTGluZSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucG9seWxpbmUuaWNvbnNbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucG9seWxpbmUuaWNvbnNbMF0uaWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogcGF0aFN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucG9seWxpbmUsXG4gICAgICAgICAgICAgICAgICAgIGljb25zOiByb3V0ZVBhdGhEYXNoZWRMaW5lLFxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9seWxpbmUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHBhdGhTdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICB6SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRNYXBTdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1hcERhdGE/LmRhcmtNb2RlKVxuICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMubWFwT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IE1hcENvbnN0YW50cy5HT09HTEVfTUFQX0RBUktfU1RZTEVTLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhbGxNYXJrZXJzQ29tYmluZWQgPSBbXG4gICAgICAgICAgICAuLi4odGhpcy5tYXBEYXRhLnJvdXRpbmdNYXJrZXJzID8/IFtdKSxcbiAgICAgICAgICAgIC4uLih0aGlzLm1hcERhdGEuY2x1c3Rlck1hcmtlcnMgPz8gW10pLFxuICAgICAgICAgICAgLi4uKHRoaXMubWFwRGF0YS5tYXJrZXJzID8/IFtdKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoYWxsTWFya2Vyc0NvbWJpbmVkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcENlbnRlckFuZEJvdW5kcyA9XG4gICAgICAgICAgICAgICAgTWFwSGVscGVyLmdldE1hcENlbnRlckFuZFpvb20oYWxsTWFya2Vyc0NvbWJpbmVkKTtcblxuICAgICAgICAgICAgdGhpcy5tYXAhLnBhblRvKG1hcENlbnRlckFuZEJvdW5kcy5tYXBDZW50ZXIpO1xuICAgICAgICAgICAgaWYgKG1hcENlbnRlckFuZEJvdW5kcy5ib3VuZHMpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXA/LmZpdEJvdW5kcyhtYXBDZW50ZXJBbmRCb3VuZHMuYm91bmRzKTtcbiAgICAgICAgICAgIGlmIChtYXBDZW50ZXJBbmRCb3VuZHMubWFwWm9vbSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcD8uc2V0Wm9vbShtYXBDZW50ZXJBbmRCb3VuZHMubWFwWm9vbSk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNNYXBDZW50ZXJTZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXBJZGxlRXZlbnQobWFwOiBnb29nbGUubWFwcy5NYXApOiB2b2lkIHtcbiAgICAgICAgbWFwLmFkZExpc3RlbmVyKCdpZGxlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZW5kQm91bmRzQ2hhbmdlZEV2ZW50KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICBjb25zdCBtYXBCb3VuZHMgPSB0aGlzLm1hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcFpvb20gPSB0aGlzLm1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXBCb3VuZHMgJiYgbWFwWm9vbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kc09iamVjdCA9IHsgYm91bmRzOiBtYXBCb3VuZHMsIHpvb206IG1hcFpvb20gfTtcbiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kc0NoYW5nZWQuZW1pdChib3VuZHNPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvcGVuTWFya2VySW5mb1dpbmRvdyhtYXJrZXJJdGVtOiBJTWFwU2VsZWN0ZWRNYXJrZXJEYXRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkTWFya2VycyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMubWFwRGF0YS5tYXJrZXJzISxcbiAgICAgICAgICAgIC4uLnRoaXMubWFwRGF0YS5jbHVzdGVyTWFya2VycyEsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29tYmluZWRNYXJrZXJzLmZvckVhY2goKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkTWFya2VyID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIG1hcmtlckl0ZW1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQ2x1c3Rlck1hcmtlciA9IGl0ZW0/LmRhdGE/LmNvdW50ID4gMTtcblxuICAgICAgICAgICAgY29uc3QgY2x1c3RlcklkID0gaXNDbHVzdGVyTWFya2VyID8gdGhpcy5nZXRDbHVzdGVySWQoaXRlbSkgOiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uSWQgPSBpc0NsdXN0ZXJNYXJrZXJcbiAgICAgICAgICAgICAgICA/ICcjY2x1c3Rlci0nICsgY2x1c3RlcklkXG4gICAgICAgICAgICAgICAgOiAnI21hcmtlci0nICsgaXRlbS5pZDtcblxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gaXNDbHVzdGVyTWFya2VyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNsdXN0ZXJEcm9wZG93bi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgOiB0aGlzLm1hcmtlckRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zID0geyB6SW5kZXg6IDk5OSB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlck1hcmtlcikgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5pc0NsdXN0ZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9wZW5Ecm9wZG93blRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IobWFya2VySWNvbklkKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIShtYXJrZXJJY29uPy5wcmV2aW91c1NpYmxpbmcgPT09IGRyb3Bkb3duRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFtYXJrZXJJY29uLmNsYXNzTGlzdD8uY29udGFpbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTWFya2VyRHJvcGRvd25PcGVuID0gIWlzQ2x1c3Rlck1hcmtlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsdXN0ZXJEcm9wZG93bk9wZW4gPSBpc0NsdXN0ZXJNYXJrZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IobWFya2VySWNvbklkKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbj8uY2xhc3NMaXN0Py5jb250YWlucyhcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hcE1hcmtlclN0cmluZ0VudW0uU0VMRUNURURcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zID0geyB6SW5kZXg6IGluZGV4ICsgMSB9O1xuICAgICAgICAgICAgICAgIH0sIDUwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YSA9IG1hcmtlckl0ZW07XG5cbiAgICAgICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHRoaXMubWFwIS5wYW5UbyhtYXJrZXJJdGVtLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsb3NlSW5mb1dpbmRvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldE1hcmtlcnNJY29ucygpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSBudWxsKSwgMjUwKTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0KTtcbiAgICAgICAgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm91dGluZ01hcmtlciA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZE1hcmtlckl0ZW0uZW1pdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUm91dGluZ01hcmtlclNlbGVjdChtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgICAgICBsZXQgc2VsZWN0ZWRQYXRoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gICAgICAgIHRoaXMubWFwRGF0YT8ucm91dGluZ01hcmtlcnM/Lm1hcChcbiAgICAgICAgICAgIChpdGVtOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWRNYXJrZXIgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgICAgICAgICBpdGVtXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb25JZCA9XG4gICAgICAgICAgICAgICAgICAgIGVTdHJpbmdQbGFjZWhvbGRlci5IQVNIX1NJR04gKyBpdGVtLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZE1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhdGhJbmRleCA9IGluZGV4IC0gMTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKG1hcmtlckljb25JZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIW1hcmtlckljb24uY2xhc3NMaXN0Py5jb250YWlucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXJJdGVtLmluZm9XaW5kb3dDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbj8ucHJldmlvdXNTaWJsaW5nID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsdXN0ZXJEcm9wZG93bi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsdXN0ZXJEcm9wZG93bi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsdXN0ZXJEcm9wZG93bk9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YSA9IHsgLi4ubWFya2VySXRlbSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7IHpJbmRleDogOTk5IH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFya2VySWNvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihtYXJrZXJJY29uSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24/LmNsYXNzTGlzdD8uY29udGFpbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgekluZGV4OiBpbmRleCArIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZVBvbHlsaW5lcyA9IHRoaXMucm91dGVQb2x5bGluZXM/Lm1hcCgocG9seWxpbmUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cm9rZUNvbG9yID0gdGhpcy5yb3V0ZVBhdGhDb2xvcnNbaW5kZXhdO1xuXG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkUGF0aCA9IHNlbGVjdGVkUGF0aEluZGV4ID09PSBpbmRleDtcblxuICAgICAgICAgICAgY29uc3QgaXNUb3dpbmdQYXRoID1cbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlUGF0aENvbG9yc1tpbmRleF0gPT09XG4gICAgICAgICAgICAgICAgTWFwT3B0aW9uc0NvbnN0YW50cy5ST1VUSU5HX1BBVEhfQ09MT1JTWydwdXJwbGUnXTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkUGF0aEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTdHJva2VDb2xvciA9IGlzVG93aW5nUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXBPcHRpb25zQ29uc3RhbnRzLlJPVVRJTkdfUEFUSF9DT0xPUlNbJ2RhcmtwdXJwbGUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXBPcHRpb25zQ29uc3RhbnRzLlJPVVRJTkdfUEFUSF9DT0xPUlNbJ2RhcmtncmF5J107XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwYXRoU3Ryb2tlQ29sb3IgPSBpc1Rvd2luZ1BhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gTWFwT3B0aW9uc0NvbnN0YW50cy5ST1VUSU5HX1BBVEhfQ09MT1JTWydsaWdodHB1cnBsZSddXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hcE9wdGlvbnNDb25zdGFudHMuUk9VVElOR19QQVRIX0NPTE9SU1snbGlnaHRncmF5J107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwb2x5bGluZT8uaWNvbnM/LlswXT8uaWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlUGF0aERhc2hlZExpbmUgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLmljb25zWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLmljb25zWzBdLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHBhdGhTdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnBvbHlsaW5lLFxuICAgICAgICAgICAgICAgICAgICBpY29uczogcm91dGVQYXRoRGFzaGVkTGluZSxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiBpc1NlbGVjdGVkUGF0aCA/IDk5OSA6IGluZGV4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9seWxpbmUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHBhdGhTdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICB6SW5kZXg6IGlzU2VsZWN0ZWRQYXRoID8gOTk5IDogaW5kZXgsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkUm91dGluZ01hcmtlciA9IG1hcmtlckl0ZW07XG5cbiAgICAgICAgdGhpcy5tYXAhLnBhblRvKG1hcmtlckl0ZW0ucG9zaXRpb24pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlTWFwRGF0YShuZXdEYXRhOiBJQ2FNYXBQcm9wcyk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcERhdGEgPSB7IC4uLm5ld0RhdGEgfTtcblxuICAgICAgICBpZiAodGhpcy5tYXBEYXRhLnNlbGVjdGVkTWFya2VyRGF0YSlcbiAgICAgICAgICAgIHRoaXMub3Blbk1hcmtlckluZm9XaW5kb3codGhpcy5tYXBEYXRhLnNlbGVjdGVkTWFya2VyRGF0YSk7XG5cbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YS5zZWxlY3RlZFJvdXRpbmdNYXJrZXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3V0aW5nTWFya2VyU2VsZWN0KFxuICAgICAgICAgICAgICAgIHRoaXMubWFwRGF0YS5zZWxlY3RlZFJvdXRpbmdNYXJrZXJEYXRhXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcERhdGEucm91dGVQYXRocz8ubGVuZ3RoICE9PSB0aGlzLnJvdXRlUGF0aENvbG9ycy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnN0b3JlUm91dGVQYXRoQ29sb3JzKCk7XG5cbiAgICAgICAgdGhpcy5hcmVhRmlsdGVyRGF0YSA9IHRoaXMubWFwRGF0YS5hcmVhRmlsdGVyRGF0YSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChuZXdEYXRhICYmICF0aGlzLmlzTWFwQ2VudGVyU2V0ICYmIHRoaXMubWFwKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbmV3RGF0YS5tYXJrZXJzPy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICBuZXdEYXRhLmNsdXN0ZXJNYXJrZXJzPy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICBuZXdEYXRhLnJvdXRpbmdNYXJrZXJzPy5sZW5ndGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1hcFN0eWxlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSByb3V0ZXMgZm9yIHJvdXRpbmdNYXJrZXJzXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQW5kRGlzcGxheVJvdXRlKCk7XG5cbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDbHVzdGVySWQoY2x1c3RlckRhdGE6IElNYXBNYXJrZXJzKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IHRoaXMuY2x1c3Rlck1hcmtlcklkcy5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgY2x1c3RlckRhdGEucG9zaXRpb24ubGF0ID09PSBpdGVtLnBvc2l0aW9uLmxhdCAmJlxuICAgICAgICAgICAgICAgIGNsdXN0ZXJEYXRhLnBvc2l0aW9uLmxuZyA9PT0gaXRlbS5wb3NpdGlvbi5sbmdcbiAgICAgICAgKT8uaWQ7XG5cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJJZCB8fCBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um91dGluZ0lkKG1hcmtlckRhdGE6IElNYXBNYXJrZXJzKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJvdXRpbmdJZCA9IHRoaXMucm91dGluZ01hcmtlcklkcy5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sYXQgPT09IGl0ZW0ucG9zaXRpb24ubGF0ICYmXG4gICAgICAgICAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgICAgICk/LmlkO1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nSWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hcmtlclNlcnZpY2VEYXRhKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlckljb25TZXJ2aWNlLmNsdXN0ZXJNYXJrZXJJZHMkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjbHVzdGVySWRzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbHVzdGVyTWFya2VySWRzID0gY2x1c3RlcklkcztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubWFya2VySWNvblNlcnZpY2Uucm91dGluZ01hcmtlcklkcyRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJvdXRpbmdJZHMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRpbmdNYXJrZXJJZHMgPSByb3V0aW5nSWRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9yZVJvdXRlUGF0aENvbG9ycygpOiB2b2lkIHtcbiAgICAgICAgbGV0IHBhdGhDb2xvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgdGhpcy5tYXBEYXRhLnJvdXRlUGF0aHM/LmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgIHBhdGhDb2xvcnMgPSBbLi4ucGF0aENvbG9ycywgcGF0aC5zdHJva2VDb2xvcl07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucm91dGVQYXRoQ29sb3JzID0gWy4uLnBhdGhDb2xvcnNdO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxnb29nbGUtbWFwXG4gICAgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiXG4gICAgW2NsYXNzLmRhcmstbW9kZS1tYXBdPVwibWFwRGF0YS5kYXJrTW9kZVwiXG4gICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgd2lkdGg9XCIxMDAlXCJcbiAgICBbem9vbV09XCJtYXBab29tXCJcbiAgICBbY2VudGVyXT1cIm1hcENlbnRlclwiXG4gICAgW29wdGlvbnNdPVwibWFwT3B0aW9uc1wiXG4gICAgW21hcElkXT1cIm1hcFN0eWxlSWRcIlxuICAgIChtYXBJbml0aWFsaXplZCk9XCJvbk1hcFJlYWR5KCRldmVudClcIlxuPlxuICAgIEBmb3IgKG1hcmtlciBvZiBtYXBEYXRhLm1hcmtlcnM7IGxldCBpID0gJGluZGV4OyB0cmFjayBtYXJrZXIuZGF0YS5pZCkge1xuICAgICAgICA8bWFwLWFkdmFuY2VkLW1hcmtlclxuICAgICAgICAgICAgW3Bvc2l0aW9uXT1cIm1hcmtlci5wb3NpdGlvblwiXG4gICAgICAgICAgICBbY29udGVudF09XCJtYXJrZXIuY29udGVudFwiXG4gICAgICAgICAgICBbekluZGV4XT1cIlxuICAgICAgICAgICAgICAgIG9wZW5lZEluZm9XaW5kb3dEYXRhPy5kYXRhPy5pZCA9PT0gbWFya2VyLmRhdGEuaWQgPyA5OTkgOiBpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1hcENsaWNrKT1cIm9uTWFya2VyQ2xpY2sobWFya2VyKVwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXAtYWR2YW5jZWQtbWFya2VyPlxuICAgIH1cblxuICAgIDxkaXZcbiAgICAgICAgI21hcmtlckRyb3Bkb3duXG4gICAgICAgIGNsYXNzPVwibWFya2VyLWRyb3Bkb3duIGRyb3Bkb3duLWhpZGRlblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Ryb3Bkb3duLWhpZGRlbic6ICFpc01hcmtlckRyb3Bkb3duT3BlbiB9XCJcbiAgICA+XG4gICAgICAgIDxhcHAtY2EtbWFwLWRyb3Bkb3duXG4gICAgICAgICAgICBbaW5mb1dpbmRvd0NvbnRlbnRdPVwiXG4gICAgICAgICAgICAgICAgIWlzQ2x1c3RlckRyb3Bkb3duT3BlblxuICAgICAgICAgICAgICAgICAgICA/IG9wZW5lZEluZm9XaW5kb3dEYXRhPy5pbmZvV2luZG93Q29udGVudCFcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21hcmtlckRhdGFdPVwib3BlbmVkSW5mb1dpbmRvd0RhdGE/LmRhdGFcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckl0ZW1DbGljayk9XCJnZXRNYXJrZXJJbmZvV2luZG93KCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCk9XCJvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQoKVwiXG4gICAgICAgICAgICAob25CYWNrQnV0dG9uQ2xpY2spPVwib25DbHVzdGVyQmFja0J1dHRvbkNsaWNrKClcIlxuICAgICAgICA+PC9hcHAtY2EtbWFwLWRyb3Bkb3duPlxuICAgIDwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICAgIGNsdXN0ZXJNYXJrZXIgb2YgbWFwRGF0YS5jbHVzdGVyTWFya2VycztcbiAgICAgICAgbGV0IGkgPSAkaW5kZXg7XG4gICAgICAgIHRyYWNrIGNsdXN0ZXJNYXJrZXIucG9zaXRpb25cbiAgICApIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJjbHVzdGVyTWFya2VyLnBvc2l0aW9uXCJcbiAgICAgICAgICAgIFtjb250ZW50XT1cImNsdXN0ZXJNYXJrZXIuY29udGVudFwiXG4gICAgICAgICAgICBbekluZGV4XT1cIlxuICAgICAgICAgICAgICAgIGNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKGNsdXN0ZXJNYXJrZXIsIG9wZW5lZEluZm9XaW5kb3dEYXRhKVxuICAgICAgICAgICAgICAgICAgICA/IDk5OVxuICAgICAgICAgICAgICAgICAgICA6IGlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAobWFwQ2xpY2spPVwib25DbHVzdGVyTWFya2VyQ2xpY2soY2x1c3Rlck1hcmtlcilcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWFwLWFkdmFuY2VkLW1hcmtlcj5cbiAgICB9XG5cbiAgICBAZm9yIChyb3V0ZSBvZiByb3V0ZVBvbHlsaW5lczsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcbiAgICAgICAgPG1hcC1wb2x5bGluZSBbb3B0aW9uc109XCJyb3V0ZVwiPjwvbWFwLXBvbHlsaW5lPlxuICAgIH1cblxuICAgIDxkaXZcbiAgICAgICAgI2NsdXN0ZXJEcm9wZG93blxuICAgICAgICBjbGFzcz1cIm1hcmtlci1kcm9wZG93biBjbHVzdGVyLWRyb3Bkb3duIGRyb3Bkb3duLWhpZGRlblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Ryb3Bkb3duLWhpZGRlbic6ICFpc0NsdXN0ZXJEcm9wZG93bk9wZW4gfVwiXG4gICAgPlxuICAgICAgICA8YXBwLWNhLW1hcC1kcm9wZG93blxuICAgICAgICAgICAgW2luZm9XaW5kb3dDb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICFpc01hcmtlckRyb3Bkb3duT3BlblxuICAgICAgICAgICAgICAgICAgICA/IG9wZW5lZEluZm9XaW5kb3dEYXRhPy5pbmZvV2luZG93Q29udGVudCFcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21hcmtlckRhdGFdPVwib3BlbmVkSW5mb1dpbmRvd0RhdGE/LmRhdGFcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckl0ZW1DbGljayk9XCJnZXRNYXJrZXJJbmZvV2luZG93KCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCk9XCJvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQoKVwiXG4gICAgICAgICAgICAob25CYWNrQnV0dG9uQ2xpY2spPVwib25DbHVzdGVyQmFja0J1dHRvbkNsaWNrKClcIlxuICAgICAgICA+PC9hcHAtY2EtbWFwLWRyb3Bkb3duPlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChhcmVhRmlsdGVyRGF0YSkge1xuICAgICAgICA8bWFwLWNpcmNsZVxuICAgICAgICAgICAgW29wdGlvbnNdPVwiYXJlYUZpbHRlckRhdGEub3B0aW9uc1wiXG4gICAgICAgICAgICBbY2VudGVyXT1cImFyZWFGaWx0ZXJEYXRhLmNlbnRlclwiXG4gICAgICAgICAgICBbcmFkaXVzXT1cImFyZWFGaWx0ZXJEYXRhLnJhZGl1c1wiXG4gICAgICAgID48L21hcC1jaXJjbGU+XG4gICAgfVxuXG4gICAgQGZvciAocm91dGluZ01hcmtlciBvZiBtYXBEYXRhLnJvdXRpbmdNYXJrZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgaSkge1xuICAgICAgICA8bWFwLWFkdmFuY2VkLW1hcmtlclxuICAgICAgICAgICAgW3Bvc2l0aW9uXT1cInJvdXRpbmdNYXJrZXIucG9zaXRpb25cIlxuICAgICAgICAgICAgW2NvbnRlbnRdPVwicm91dGluZ01hcmtlci5jb250ZW50XCJcbiAgICAgICAgICAgIFt6SW5kZXhdPVwiXG4gICAgICAgICAgICAgICAgY2hlY2tJbmZvV2luZG93UG9zaXRpb24ocm91dGluZ01hcmtlciwgc2VsZWN0ZWRSb3V0aW5nTWFya2VyKVxuICAgICAgICAgICAgICAgICAgICA/IDk5OVxuICAgICAgICAgICAgICAgICAgICA6IGlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAobWFwQ2xpY2spPVwiXG4gICAgICAgICAgICAgICAgcm91dGluZ01hcmtlci5oYXNDbGlja0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIG9uUm91dGluZ01hcmtlckNsaWNrKHJvdXRpbmdNYXJrZXIpXG4gICAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWFwLWFkdmFuY2VkLW1hcmtlcj5cbiAgICB9XG5cbiAgICBAaWYgKG1hcERhdGEuaXNPcGVuSW5NYXBTaG93bikge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm9wZW4taW4tbWFwLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxuICAgICAgICAgICAgbmdiVG9vbHRpcFxuICAgICAgICAgICAgbWFpbkNhVG9vbHRpcD1cIk9wZW4gaW4gTWFwXCJcbiAgICAgICAgICAgIHRvb2x0aXBCYWNrZ3JvdW5kPVwiIzQyNDI0MlwiXG4gICAgICAgICAgICBwb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25PcGVuSW5NYXAoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdmctaWNvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IHN2Zy1zaXplLTE4XCJcbiAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvY2EtY29tcG9uZW50cy9zdmcvY29tbW9uL2ljX2xvY2F0aW9uX21hcC5zdmdcIlxuICAgICAgICAgICAgPjwvc3ZnLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAobWFwRGF0YS5pc1pvb21TaG93bikge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1hcC16b29tLWNvbnRhaW5lciBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtZW5kIGdhcC0xXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnZmxleC1jb2x1bW4nOiAhbWFwRGF0YS5pc1ZlcnRpY2FsWm9vbSxcbiAgICAgICAgICAgICAgICAndmVydGljYWwtem9vbS1idXR0b25zJzogbWFwRGF0YS5pc1ZlcnRpY2FsWm9vbSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXAtem9vbS1idXR0b25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mbGV4LWNvbHVtbl09XCJtYXBEYXRhLmlzVmVydGljYWxab29tXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiem9vbS1idXR0b24tY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25ab29tQ2hhbmdlKHRydWUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzdmctaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggc3ZnLXNpemUtMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2NhLWNvbXBvbmVudHMvc3ZnL3BvcHVwL01pbnVzLnN2Z1wiXG4gICAgICAgICAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblpvb21DaGFuZ2UoZmFsc2UpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzdmctaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggc3ZnLXNpemUtMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2NhLWNvbXBvbmVudHMvc3ZnL2NvbW1vbi9pY19wbHVzLnN2Z1wiXG4gICAgICAgICAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFwLXpvb20tcmFuZ2UgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLXRleHQgY2EtZm9udC1tZWRpdW1cIj41MCBtaTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9nb29nbGUtbWFwPlxuIl19