ngx-sfc-components 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +685 -0
- package/esm2020/lib/components/avatar/avatar.component.mjs +83 -0
- package/esm2020/lib/components/avatar/avatar.constants.mjs +9 -0
- package/esm2020/lib/components/avatar/models/avatar-data.model.mjs +2 -0
- package/esm2020/lib/components/avatar/models/avatar-image.model.mjs +14 -0
- package/esm2020/lib/components/avatar/models/avatar-progress.model.mjs +2 -0
- package/esm2020/lib/components/avatar/parts/badge/avatar-badge-position.enum.mjs +12 -0
- package/esm2020/lib/components/avatar/parts/badge/avatar-badge.component.mjs +88 -0
- package/esm2020/lib/components/avatar/parts/badge/avatar-badge.constants.mjs +5 -0
- package/esm2020/lib/components/carousel/carousel.component.mjs +230 -0
- package/esm2020/lib/components/carousel/carousel.enum.mjs +33 -0
- package/esm2020/lib/components/carousel/directive/carousel-slide.directive.mjs +31 -0
- package/esm2020/lib/components/carousel/models/dom.model.mjs +2 -0
- package/esm2020/lib/components/carousel/models/navigation.model.mjs +2 -0
- package/esm2020/lib/components/carousel/models/options.model.mjs +2 -0
- package/esm2020/lib/components/carousel/models/slide.model.mjs +3 -0
- package/esm2020/lib/components/carousel/parts/stage/carousel-stage.component.mjs +83 -0
- package/esm2020/lib/components/carousel/parts/stage/carousel-stage.model.mjs +2 -0
- package/esm2020/lib/components/carousel/service/animate/carousel-animate.service.mjs +86 -0
- package/esm2020/lib/components/carousel/service/autoplay/carousel-autoplay.service.mjs +129 -0
- package/esm2020/lib/components/carousel/service/carousel/carousel-service.constants.mjs +44 -0
- package/esm2020/lib/components/carousel/service/carousel/carousel-service.enum.mjs +14 -0
- package/esm2020/lib/components/carousel/service/carousel/carousel-service.model.mjs +2 -0
- package/esm2020/lib/components/carousel/service/carousel/carousel.service.mjs +697 -0
- package/esm2020/lib/components/carousel/service/lazy/carousel-lazy-load.service.mjs +59 -0
- package/esm2020/lib/components/carousel/service/navigation/carousel-navigation.service.mjs +211 -0
- package/esm2020/lib/components/chart/chart-option.model.mjs +2 -0
- package/esm2020/lib/components/chart/chart.component.mjs +124 -0
- package/esm2020/lib/components/chart/chart.constants.mjs +95 -0
- package/esm2020/lib/components/chart/service/settings/chart-settings.service.mjs +87 -0
- package/esm2020/lib/components/chart/service/theme/chart-theme.model.mjs +2 -0
- package/esm2020/lib/components/chart/service/theme/chart-theme.service.mjs +25 -0
- package/esm2020/lib/components/index.mjs +40 -0
- package/esm2020/lib/components/menu/dropdown/dropdown-menu.component.mjs +86 -0
- package/esm2020/lib/components/menu/dropdown/parts/item/dropdown-menu-item.component.mjs +26 -0
- package/esm2020/lib/components/menu/dropdown/parts/item/dropdown-menu-item.model.mjs +2 -0
- package/esm2020/lib/components/menu/navigation/navigation-menu.component.mjs +26 -0
- package/esm2020/lib/components/menu/navigation/parts/item/navigation-menu-item.component.mjs +31 -0
- package/esm2020/lib/components/menu/navigation/parts/item/navigation-menu-item.model.mjs +2 -0
- package/esm2020/lib/components/menu/side/parts/header/side-menu-header.component.mjs +31 -0
- package/esm2020/lib/components/menu/side/parts/item/content/side-menu-item-content.component.mjs +56 -0
- package/esm2020/lib/components/menu/side/parts/item/side-menu-item.component.mjs +81 -0
- package/esm2020/lib/components/menu/side/parts/title/side-menu-title.component.mjs +24 -0
- package/esm2020/lib/components/menu/side/side-menu.component.mjs +47 -0
- package/esm2020/lib/components/menu/side/side-menu.model.mjs +6 -0
- package/esm2020/lib/components/no-export-index.mjs +15 -0
- package/esm2020/lib/components/notification/enums/notification-template.enum.mjs +5 -0
- package/esm2020/lib/components/notification/enums/notification-type.enum.mjs +7 -0
- package/esm2020/lib/components/notification/notification-auto-close.model.mjs +2 -0
- package/esm2020/lib/components/notification/notification.component.mjs +67 -0
- package/esm2020/lib/components/notification/parts/content/notification-content.component.mjs +33 -0
- package/esm2020/lib/components/notification/parts/content/notification-content.model.mjs +2 -0
- package/esm2020/lib/components/progress/circle/progress-circle.component.mjs +23 -0
- package/esm2020/lib/components/progress/line/progress-line.component.mjs +40 -0
- package/esm2020/lib/components/progress/progress-color.enum.mjs +13 -0
- package/esm2020/lib/components/progress/progress.component.mjs +50 -0
- package/esm2020/lib/components/progress/semi-circle/progress-semi-circle.component.mjs +42 -0
- package/esm2020/lib/components/slider/parts/button/slider-button-type.enum.mjs +6 -0
- package/esm2020/lib/components/slider/parts/button/slider-button.component.mjs +34 -0
- package/esm2020/lib/components/slider/parts/item/slider-item.component.mjs +17 -0
- package/esm2020/lib/components/slider/parts/item/slider-item.model.mjs +2 -0
- package/esm2020/lib/components/slider/parts/pagination/slider-pagination.component.mjs +29 -0
- package/esm2020/lib/components/slider/service/automatic/slider-automatic.service.mjs +35 -0
- package/esm2020/lib/components/slider/service/slider/slider-move-type.enum.mjs +7 -0
- package/esm2020/lib/components/slider/service/slider/slider-move.event.mjs +2 -0
- package/esm2020/lib/components/slider/service/slider/slider-move.model.mjs +2 -0
- package/esm2020/lib/components/slider/service/slider/slider.service.mjs +40 -0
- package/esm2020/lib/components/slider/slider-type.enum.mjs +6 -0
- package/esm2020/lib/components/slider/slider.component.mjs +116 -0
- package/esm2020/lib/components/stars/star-type.enum.mjs +9 -0
- package/esm2020/lib/components/stars/stars.component.mjs +42 -0
- package/esm2020/lib/components/table/enums/table-data-type.enum.mjs +6 -0
- package/esm2020/lib/components/table/enums/table-template.enum.mjs +7 -0
- package/esm2020/lib/components/table/models/table-pagination.model.mjs +2 -0
- package/esm2020/lib/components/table/models/table.model.mjs +2 -0
- package/esm2020/lib/components/table/parts/columns/default/default-table-column.component.mjs +24 -0
- package/esm2020/lib/components/table/parts/columns/selectable/selectable-table-column.component.mjs +30 -0
- package/esm2020/lib/components/table/parts/columns/table-column-type.enum.mjs +8 -0
- package/esm2020/lib/components/table/parts/columns/table-column.model.mjs +2 -0
- package/esm2020/lib/components/table/parts/content/base-default-table-content.component.mjs +74 -0
- package/esm2020/lib/components/table/parts/content/cards/default/default-table-card.component.mjs +14 -0
- package/esm2020/lib/components/table/parts/content/rows/default/default-table-row.component.mjs +28 -0
- package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row-template.enum.mjs +6 -0
- package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row.component.mjs +42 -0
- package/esm2020/lib/components/table/parts/content/rows/expanded/expanded-table-row.model.mjs +2 -0
- package/esm2020/lib/components/table/parts/toggle/columns-toggle.component.mjs +33 -0
- package/esm2020/lib/components/table/parts/toggle/columns-toggle.constants.mjs +11 -0
- package/esm2020/lib/components/table/parts/toggle/service/columns-toggle.service.mjs +34 -0
- package/esm2020/lib/components/table/service/select/table-select.event.mjs +2 -0
- package/esm2020/lib/components/table/service/select/table-select.service.mjs +24 -0
- package/esm2020/lib/components/table/table.component.mjs +250 -0
- package/esm2020/lib/components/table/table.constants.mjs +11 -0
- package/esm2020/lib/components/tabs/models/tab.model.mjs +2 -0
- package/esm2020/lib/components/tabs/models/tabs-view.model.mjs +2 -0
- package/esm2020/lib/components/tabs/parts/labels/tab-label-content-base.component.mjs +29 -0
- package/esm2020/lib/components/tabs/parts/labels/tab-label-icon/tab-label-icon.component.mjs +20 -0
- package/esm2020/lib/components/tabs/parts/labels/tab-label-line/tab-label-line.component.mjs +13 -0
- package/esm2020/lib/components/tabs/parts/sliders/tab-label-icon/tab-label-icon-slider.component.mjs +20 -0
- package/esm2020/lib/components/tabs/parts/sliders/tab-label-line/tab-label-line-slider.component.mjs +20 -0
- package/esm2020/lib/components/tabs/parts/sliders/tab-slider-base.component.mjs +18 -0
- package/esm2020/lib/components/tabs/parts/sliders/tab-slider-context.model.mjs +2 -0
- package/esm2020/lib/components/tabs/service/tab.service.mjs +11 -0
- package/esm2020/lib/components/tabs/tabs-template.enum.mjs +7 -0
- package/esm2020/lib/components/tabs/tabs.component.mjs +69 -0
- package/esm2020/lib/components/tags/parts/tag/tag.component.mjs +18 -0
- package/esm2020/lib/components/tags/parts/tag/tag.model.mjs +2 -0
- package/esm2020/lib/components/tags/tags.component.mjs +18 -0
- package/esm2020/lib/components/timeline/parts/item/timeline-item-position.enum.mjs +6 -0
- package/esm2020/lib/components/timeline/parts/item/timeline-item.component.mjs +34 -0
- package/esm2020/lib/components/timeline/parts/item/timeline-item.model.mjs +2 -0
- package/esm2020/lib/components/timeline/timeline.component.mjs +18 -0
- package/esm2020/lib/ngx-sfc-components.module.mjs +208 -0
- package/esm2020/ngx-sfc-components.mjs +5 -0
- package/esm2020/public-api.mjs +6 -0
- package/fesm2015/ngx-sfc-components.mjs +4006 -0
- package/fesm2015/ngx-sfc-components.mjs.map +1 -0
- package/fesm2020/ngx-sfc-components.mjs +3989 -0
- package/fesm2020/ngx-sfc-components.mjs.map +1 -0
- package/lib/components/avatar/avatar.component.d.ts +42 -0
- package/lib/components/avatar/avatar.constants.d.ts +8 -0
- package/lib/components/avatar/models/avatar-data.model.d.ts +6 -0
- package/lib/components/avatar/models/avatar-image.model.d.ts +12 -0
- package/lib/components/avatar/models/avatar-progress.model.d.ts +4 -0
- package/lib/components/avatar/parts/badge/avatar-badge-position.enum.d.ts +10 -0
- package/lib/components/avatar/parts/badge/avatar-badge.component.d.ts +14 -0
- package/lib/components/avatar/parts/badge/avatar-badge.constants.d.ts +4 -0
- package/lib/components/carousel/carousel.component.d.ts +62 -0
- package/lib/components/carousel/carousel.enum.d.ts +26 -0
- package/lib/components/carousel/directive/carousel-slide.directive.d.ts +13 -0
- package/lib/components/carousel/models/dom.model.d.ts +7 -0
- package/lib/components/carousel/models/navigation.model.d.ts +17 -0
- package/lib/components/carousel/models/options.model.d.ts +40 -0
- package/lib/components/carousel/models/slide.model.d.ts +28 -0
- package/lib/components/carousel/parts/stage/carousel-stage.component.d.ts +30 -0
- package/lib/components/carousel/parts/stage/carousel-stage.model.d.ts +7 -0
- package/lib/components/carousel/service/animate/carousel-animate.service.d.ts +17 -0
- package/lib/components/carousel/service/autoplay/carousel-autoplay.service.d.ts +29 -0
- package/lib/components/carousel/service/carousel/carousel-service.constants.d.ts +5 -0
- package/lib/components/carousel/service/carousel/carousel-service.enum.d.ts +9 -0
- package/lib/components/carousel/service/carousel/carousel-service.model.d.ts +21 -0
- package/lib/components/carousel/service/carousel/carousel.service.d.ts +92 -0
- package/lib/components/carousel/service/lazy/carousel-lazy-load.service.d.ts +14 -0
- package/lib/components/carousel/service/navigation/carousel-navigation.service.d.ts +28 -0
- package/lib/components/chart/chart-option.model.d.ts +9 -0
- package/lib/components/chart/chart.component.d.ts +38 -0
- package/lib/components/chart/chart.constants.d.ts +100 -0
- package/lib/components/chart/service/settings/chart-settings.service.d.ts +14 -0
- package/lib/components/chart/service/theme/chart-theme.model.d.ts +15 -0
- package/lib/components/chart/service/theme/chart-theme.service.d.ts +11 -0
- package/lib/components/index.d.ts +56 -0
- package/lib/components/menu/dropdown/dropdown-menu.component.d.ts +28 -0
- package/lib/components/menu/dropdown/parts/item/dropdown-menu-item.component.d.ts +8 -0
- package/lib/components/menu/dropdown/parts/item/dropdown-menu-item.model.d.ts +6 -0
- package/lib/components/menu/navigation/navigation-menu.component.d.ts +10 -0
- package/lib/components/menu/navigation/parts/item/navigation-menu-item.component.d.ts +9 -0
- package/lib/components/menu/navigation/parts/item/navigation-menu-item.model.d.ts +6 -0
- package/lib/components/menu/side/parts/header/side-menu-header.component.d.ts +11 -0
- package/lib/components/menu/side/parts/item/content/side-menu-item-content.component.d.ts +17 -0
- package/lib/components/menu/side/parts/item/side-menu-item.component.d.ts +17 -0
- package/lib/components/menu/side/parts/title/side-menu-title.component.d.ts +7 -0
- package/lib/components/menu/side/side-menu.component.d.ts +13 -0
- package/lib/components/menu/side/side-menu.model.d.ts +15 -0
- package/lib/components/no-export-index.d.ts +14 -0
- package/lib/components/notification/enums/notification-template.enum.d.ts +3 -0
- package/lib/components/notification/enums/notification-type.enum.d.ts +5 -0
- package/lib/components/notification/notification-auto-close.model.d.ts +4 -0
- package/lib/components/notification/notification.component.d.ts +26 -0
- package/lib/components/notification/parts/content/notification-content.component.d.ts +14 -0
- package/lib/components/notification/parts/content/notification-content.model.d.ts +8 -0
- package/lib/components/progress/circle/progress-circle.component.d.ts +8 -0
- package/lib/components/progress/line/progress-line.component.d.ts +17 -0
- package/lib/components/progress/progress-color.enum.d.ts +11 -0
- package/lib/components/progress/progress.component.d.ts +9 -0
- package/lib/components/progress/semi-circle/progress-semi-circle.component.d.ts +16 -0
- package/lib/components/slider/parts/button/slider-button-type.enum.d.ts +4 -0
- package/lib/components/slider/parts/button/slider-button.component.d.ts +11 -0
- package/lib/components/slider/parts/item/slider-item.component.d.ts +7 -0
- package/lib/components/slider/parts/item/slider-item.model.d.ts +5 -0
- package/lib/components/slider/parts/pagination/slider-pagination.component.d.ts +11 -0
- package/lib/components/slider/service/automatic/slider-automatic.service.d.ts +17 -0
- package/lib/components/slider/service/slider/slider-move-type.enum.d.ts +5 -0
- package/lib/components/slider/service/slider/slider-move.event.d.ts +5 -0
- package/lib/components/slider/service/slider/slider-move.model.d.ts +4 -0
- package/lib/components/slider/service/slider/slider.service.d.ts +12 -0
- package/lib/components/slider/slider-type.enum.d.ts +4 -0
- package/lib/components/slider/slider.component.d.ts +45 -0
- package/lib/components/stars/star-type.enum.d.ts +7 -0
- package/lib/components/stars/stars.component.d.ts +11 -0
- package/lib/components/table/enums/table-data-type.enum.d.ts +4 -0
- package/lib/components/table/enums/table-template.enum.d.ts +5 -0
- package/lib/components/table/models/table-pagination.model.d.ts +5 -0
- package/lib/components/table/models/table.model.d.ts +9 -0
- package/lib/components/table/parts/columns/default/default-table-column.component.d.ts +8 -0
- package/lib/components/table/parts/columns/selectable/selectable-table-column.component.d.ts +10 -0
- package/lib/components/table/parts/columns/table-column-type.enum.d.ts +6 -0
- package/lib/components/table/parts/columns/table-column.model.d.ts +11 -0
- package/lib/components/table/parts/content/base-default-table-content.component.d.ts +27 -0
- package/lib/components/table/parts/content/cards/default/default-table-card.component.d.ts +6 -0
- package/lib/components/table/parts/content/rows/default/default-table-row.component.d.ts +10 -0
- package/lib/components/table/parts/content/rows/expanded/expanded-table-row-template.enum.d.ts +4 -0
- package/lib/components/table/parts/content/rows/expanded/expanded-table-row.component.d.ts +16 -0
- package/lib/components/table/parts/content/rows/expanded/expanded-table-row.model.d.ts +11 -0
- package/lib/components/table/parts/toggle/columns-toggle.component.d.ts +13 -0
- package/lib/components/table/parts/toggle/columns-toggle.constants.d.ts +10 -0
- package/lib/components/table/parts/toggle/service/columns-toggle.service.d.ts +15 -0
- package/lib/components/table/service/select/table-select.event.d.ts +4 -0
- package/lib/components/table/service/select/table-select.service.d.ts +11 -0
- package/lib/components/table/table.component.d.ts +74 -0
- package/lib/components/table/table.constants.d.ts +11 -0
- package/lib/components/tabs/models/tab.model.d.ts +7 -0
- package/lib/components/tabs/models/tabs-view.model.d.ts +8 -0
- package/lib/components/tabs/parts/labels/tab-label-content-base.component.d.ts +9 -0
- package/lib/components/tabs/parts/labels/tab-label-icon/tab-label-icon.component.d.ts +9 -0
- package/lib/components/tabs/parts/labels/tab-label-line/tab-label-line.component.d.ts +6 -0
- package/lib/components/tabs/parts/sliders/tab-label-icon/tab-label-icon-slider.component.d.ts +7 -0
- package/lib/components/tabs/parts/sliders/tab-label-line/tab-label-line-slider.component.d.ts +10 -0
- package/lib/components/tabs/parts/sliders/tab-slider-base.component.d.ts +8 -0
- package/lib/components/tabs/parts/sliders/tab-slider-context.model.d.ts +4 -0
- package/lib/components/tabs/service/tab.service.d.ts +6 -0
- package/lib/components/tabs/tabs-template.enum.d.ts +5 -0
- package/lib/components/tabs/tabs.component.d.ts +26 -0
- package/lib/components/tags/parts/tag/tag.component.d.ts +7 -0
- package/lib/components/tags/parts/tag/tag.model.d.ts +4 -0
- package/lib/components/tags/tags.component.d.ts +7 -0
- package/lib/components/timeline/parts/item/timeline-item-position.enum.d.ts +4 -0
- package/lib/components/timeline/parts/item/timeline-item.component.d.ts +11 -0
- package/lib/components/timeline/parts/item/timeline-item.model.d.ts +10 -0
- package/lib/components/timeline/timeline.component.d.ts +7 -0
- package/lib/ngx-sfc-components.module.d.ts +49 -0
- package/ngx-sfc-components.d.ts +5 -0
- package/package.json +50 -0
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,697 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { CommonConstants, isNumeric } from 'ngx-sfc-common';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { CarouselEventType, CarouselProperty, CarouselState } from '../../carousel.enum';
|
|
5
|
+
import { CarouselServiceConstants } from './carousel-service.constants';
|
|
6
|
+
import { Width } from './carousel-service.enum';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class CarouselService {
|
|
9
|
+
constructor() {
|
|
10
|
+
this._viewSettingsShipper$ = new Subject();
|
|
11
|
+
this._initializedCarousel$ = new Subject();
|
|
12
|
+
this._changeSettingsCarousel$ = new Subject();
|
|
13
|
+
this._changedSettingsCarousel$ = new Subject();
|
|
14
|
+
this._translateCarousel$ = new Subject();
|
|
15
|
+
this._translatedCarousel$ = new Subject();
|
|
16
|
+
this._resizeCarousel$ = new Subject();
|
|
17
|
+
this._resizedCarousel$ = new Subject();
|
|
18
|
+
this._refreshCarousel$ = new Subject();
|
|
19
|
+
this._refreshedCarousel$ = new Subject();
|
|
20
|
+
this.carouselDOMModel = {
|
|
21
|
+
rtl: false,
|
|
22
|
+
isResponsive: false,
|
|
23
|
+
isRefreshed: false,
|
|
24
|
+
isLoaded: false,
|
|
25
|
+
isLoading: false
|
|
26
|
+
};
|
|
27
|
+
this.stageModel = {
|
|
28
|
+
transform: 'translate3d(0px,0px,0px)',
|
|
29
|
+
transition: '0s',
|
|
30
|
+
width: 0,
|
|
31
|
+
paddingL: 0,
|
|
32
|
+
paddingR: 0
|
|
33
|
+
};
|
|
34
|
+
this._items = [];
|
|
35
|
+
this._widths = [];
|
|
36
|
+
this._supress = {};
|
|
37
|
+
this._current = null;
|
|
38
|
+
this._clones = [];
|
|
39
|
+
this._mergers = [];
|
|
40
|
+
this._speed = null;
|
|
41
|
+
this._coordinates = [];
|
|
42
|
+
this._invalidated = {};
|
|
43
|
+
this._states = {
|
|
44
|
+
current: {},
|
|
45
|
+
tags: {
|
|
46
|
+
initializing: [CarouselState.Busy],
|
|
47
|
+
animating: [CarouselState.Busy]
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
this._pipe = [
|
|
51
|
+
{
|
|
52
|
+
filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
|
|
53
|
+
run: (cache) => {
|
|
54
|
+
cache.current = this._items && this._items[this.relative(this._current || 0)].id;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
|
|
59
|
+
run: (cache) => {
|
|
60
|
+
const margin = this.settings.margin || CommonConstants.EMPTY_STRING, grid = !this.settings.autoWidth, rtl = this.settings.rtl, css = {
|
|
61
|
+
'margin-left': rtl ? margin : CommonConstants.EMPTY_STRING,
|
|
62
|
+
'margin-right': rtl ? CommonConstants.EMPTY_STRING : margin
|
|
63
|
+
};
|
|
64
|
+
if (!grid) {
|
|
65
|
+
this.slidesModel.forEach(slide => {
|
|
66
|
+
slide.marginL = css['margin-left'];
|
|
67
|
+
slide.marginR = css['margin-right'];
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
cache.css = css;
|
|
71
|
+
}
|
|
72
|
+
}, {
|
|
73
|
+
filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
|
|
74
|
+
run: (cache) => {
|
|
75
|
+
const width = +(this.width() / (this.settings.items || 0)).toFixed(3) - (this.settings.margin || 0), grid = !this.settings.autoWidth, widths = [];
|
|
76
|
+
let merge = null, iterator = this._items.length;
|
|
77
|
+
cache.items = {
|
|
78
|
+
merge: false,
|
|
79
|
+
width: width
|
|
80
|
+
};
|
|
81
|
+
while (iterator--) {
|
|
82
|
+
merge = this._mergers[iterator];
|
|
83
|
+
merge = this.settings.mergeFit && Math.min(merge, (this.settings.items || 0)) || merge;
|
|
84
|
+
cache.items.merge = merge > 1 || cache.items.merge;
|
|
85
|
+
widths[iterator] = !grid ? this._items[iterator].width ? this._items[iterator].width : width : width * merge;
|
|
86
|
+
}
|
|
87
|
+
this._widths = widths;
|
|
88
|
+
this.slidesModel.forEach((slide, i) => {
|
|
89
|
+
slide.width = this._widths[i];
|
|
90
|
+
slide.marginR = cache.css['margin-right'];
|
|
91
|
+
slide.marginL = cache.css['margin-left'];
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}, {
|
|
95
|
+
filter: [CarouselProperty.Items, CarouselProperty.Settings],
|
|
96
|
+
run: () => {
|
|
97
|
+
const clones = [], items = this._items, settings = this.settings, view = Math.max(settings.items * 2, 4), size = Math.ceil(items.length / 2) * 2;
|
|
98
|
+
let append = [], prepend = [], repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0;
|
|
99
|
+
repeat /= 2;
|
|
100
|
+
while (repeat--) {
|
|
101
|
+
clones.push(this.normalize(clones.length / 2, true));
|
|
102
|
+
append.push({ ...this.slidesModel[clones[clones.length - 1]] });
|
|
103
|
+
clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
|
|
104
|
+
prepend.unshift({ ...this.slidesModel[clones[clones.length - 1]] });
|
|
105
|
+
}
|
|
106
|
+
this._clones = clones;
|
|
107
|
+
append = append.map(slide => {
|
|
108
|
+
slide.id = `${CarouselServiceConstants.CLONE_ID_PREFIX}${slide.id}`;
|
|
109
|
+
slide.isActive = false;
|
|
110
|
+
slide.isCloned = true;
|
|
111
|
+
return slide;
|
|
112
|
+
});
|
|
113
|
+
prepend = prepend.map(slide => {
|
|
114
|
+
slide.id = `${CarouselServiceConstants.CLONE_ID_PREFIX}${slide.id}`;
|
|
115
|
+
slide.isActive = false;
|
|
116
|
+
slide.isCloned = true;
|
|
117
|
+
return slide;
|
|
118
|
+
});
|
|
119
|
+
this.slidesModel = prepend.concat(this.slidesModel).concat(append);
|
|
120
|
+
}
|
|
121
|
+
}, {
|
|
122
|
+
filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
|
|
123
|
+
run: () => {
|
|
124
|
+
const rtl = this.settings.rtl ? 1 : -1, size = this._clones.length + this._items.length, coordinates = [];
|
|
125
|
+
let iterator = -1, previous = 0, current = 0;
|
|
126
|
+
while (++iterator < size) {
|
|
127
|
+
previous = coordinates[iterator - 1] || 0;
|
|
128
|
+
current = this._widths[this.relative(iterator)] + this.settings.margin;
|
|
129
|
+
coordinates.push(previous + current * rtl);
|
|
130
|
+
}
|
|
131
|
+
this._coordinates = coordinates;
|
|
132
|
+
}
|
|
133
|
+
}, {
|
|
134
|
+
filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
|
|
135
|
+
run: () => {
|
|
136
|
+
const padding = this.settings.stagePadding || 0, coordinates = this._coordinates, css = {
|
|
137
|
+
'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
|
|
138
|
+
'padding-left': padding || '',
|
|
139
|
+
'padding-right': padding || ''
|
|
140
|
+
};
|
|
141
|
+
this.stageModel.width = css.width;
|
|
142
|
+
this.stageModel.paddingR = css['padding-right'];
|
|
143
|
+
}
|
|
144
|
+
}, {
|
|
145
|
+
filter: [CarouselProperty.Width, CarouselProperty.Items, CarouselProperty.Settings],
|
|
146
|
+
run: (cache) => {
|
|
147
|
+
let current = cache.current ? this.slidesModel.findIndex(slide => slide.id === cache.current) : 0;
|
|
148
|
+
current = Math.max(this.minimum(), Math.min(this.maximum(), current));
|
|
149
|
+
this.reset(current);
|
|
150
|
+
}
|
|
151
|
+
}, {
|
|
152
|
+
filter: [CarouselProperty.Position],
|
|
153
|
+
run: () => {
|
|
154
|
+
this.animate(this.coordinates(this._current));
|
|
155
|
+
}
|
|
156
|
+
}, {
|
|
157
|
+
filter: [CarouselProperty.Width, CarouselProperty.Position, CarouselProperty.Items, CarouselProperty.Settings],
|
|
158
|
+
run: () => {
|
|
159
|
+
const rtl = this.settings.rtl ? 1 : -1, padding = (this.settings.stagePadding || 0) * 2, matches = [];
|
|
160
|
+
let begin, end, inner, outer, i, n;
|
|
161
|
+
begin = this.coordinates(this.current());
|
|
162
|
+
if (typeof begin === 'number') {
|
|
163
|
+
begin += padding;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
begin = 0;
|
|
167
|
+
}
|
|
168
|
+
end = begin + this.width() * rtl;
|
|
169
|
+
if (rtl === -1 && this.settings.center) {
|
|
170
|
+
const result = this._coordinates.filter(element => {
|
|
171
|
+
return (this.settings.items || 0) % 2 === 1 ? element >= begin : element > begin;
|
|
172
|
+
});
|
|
173
|
+
begin = result.length ? result[result.length - 1] : begin;
|
|
174
|
+
}
|
|
175
|
+
for (i = 0, n = this._coordinates.length; i < n; i++) {
|
|
176
|
+
inner = Math.ceil(this._coordinates[i - 1] || 0);
|
|
177
|
+
outer = Math.ceil(Math.abs(this._coordinates[i]) + padding * rtl);
|
|
178
|
+
if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
|
|
179
|
+
|| (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
|
|
180
|
+
matches.push(i);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
this.slidesModel.forEach(slide => {
|
|
184
|
+
slide.isActive = false;
|
|
185
|
+
return slide;
|
|
186
|
+
});
|
|
187
|
+
matches.forEach(item => {
|
|
188
|
+
this.slidesModel[item].isActive = true;
|
|
189
|
+
});
|
|
190
|
+
if (this.settings.center) {
|
|
191
|
+
this.slidesModel.forEach(slide => {
|
|
192
|
+
slide.isCentered = false;
|
|
193
|
+
return slide;
|
|
194
|
+
});
|
|
195
|
+
const currentValue = this.current();
|
|
196
|
+
if (currentValue)
|
|
197
|
+
this.slidesModel[currentValue].isCentered = true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
];
|
|
202
|
+
this.settings = {
|
|
203
|
+
items: 0
|
|
204
|
+
};
|
|
205
|
+
this.options = {};
|
|
206
|
+
}
|
|
207
|
+
get viewCurrrentSettings() {
|
|
208
|
+
return this._viewSettingsShipper$.asObservable();
|
|
209
|
+
}
|
|
210
|
+
get initializedState() {
|
|
211
|
+
return this._initializedCarousel$.asObservable();
|
|
212
|
+
}
|
|
213
|
+
get changeState() {
|
|
214
|
+
return this._changeSettingsCarousel$.asObservable();
|
|
215
|
+
}
|
|
216
|
+
get changedState() {
|
|
217
|
+
return this._changedSettingsCarousel$.asObservable();
|
|
218
|
+
}
|
|
219
|
+
get translateState() {
|
|
220
|
+
return this._translateCarousel$.asObservable();
|
|
221
|
+
}
|
|
222
|
+
get translatedState() {
|
|
223
|
+
return this._translatedCarousel$.asObservable();
|
|
224
|
+
}
|
|
225
|
+
get resizeState() {
|
|
226
|
+
return this._resizeCarousel$.asObservable();
|
|
227
|
+
}
|
|
228
|
+
get resizedState() {
|
|
229
|
+
return this._resizedCarousel$.asObservable();
|
|
230
|
+
}
|
|
231
|
+
get refreshState() {
|
|
232
|
+
return this._refreshCarousel$.asObservable();
|
|
233
|
+
}
|
|
234
|
+
get refreshedState() {
|
|
235
|
+
return this._refreshedCarousel$.asObservable();
|
|
236
|
+
}
|
|
237
|
+
setup(carouselWidth, slides, options) {
|
|
238
|
+
this.setCarouselWidth(carouselWidth);
|
|
239
|
+
this.setItems(slides);
|
|
240
|
+
this.defineSlidesData();
|
|
241
|
+
this.setOptions(options);
|
|
242
|
+
this.settings = { ...this.options };
|
|
243
|
+
this.setOptionsForViewport();
|
|
244
|
+
this.trigger(CarouselEventType.Change, { property: { name: CarouselProperty.Settings, value: this.settings } });
|
|
245
|
+
this.invalidate(CarouselProperty.Settings);
|
|
246
|
+
this.trigger(CarouselEventType.Changed, { property: { name: CarouselProperty.Settings, value: this.settings } });
|
|
247
|
+
}
|
|
248
|
+
initialize(slides) {
|
|
249
|
+
this.enter(CarouselEventType.Initializing);
|
|
250
|
+
this.carouselDOMModel.rtl = this.settings.rtl || false;
|
|
251
|
+
if (this._mergers.length) {
|
|
252
|
+
this._mergers = [];
|
|
253
|
+
}
|
|
254
|
+
slides.forEach(item => {
|
|
255
|
+
const mergeN = this.settings.merge ? item.dataMerge : 1;
|
|
256
|
+
this._mergers.push(mergeN);
|
|
257
|
+
});
|
|
258
|
+
this._clones = [];
|
|
259
|
+
this.reset(isNumeric(this.settings.startPosition) ? +(this.settings.startPosition || 0) : 0);
|
|
260
|
+
this.invalidate(CarouselProperty.Items);
|
|
261
|
+
this.refresh();
|
|
262
|
+
this.carouselDOMModel.isLoaded = true;
|
|
263
|
+
this.sendChanges();
|
|
264
|
+
this.leave(CarouselEventType.Initializing);
|
|
265
|
+
this.trigger(CarouselEventType.Initialized);
|
|
266
|
+
}
|
|
267
|
+
;
|
|
268
|
+
sendChanges() {
|
|
269
|
+
this._viewSettingsShipper$.next({
|
|
270
|
+
carouselDOMModel: this.carouselDOMModel,
|
|
271
|
+
stageModel: this.stageModel,
|
|
272
|
+
slidesModel: this.slidesModel,
|
|
273
|
+
navigationModel: this.navigationModel,
|
|
274
|
+
navigationDotsModel: this.navigationDotsModel
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
onResize(curWidth) {
|
|
278
|
+
if (this._items.length) {
|
|
279
|
+
this.setCarouselWidth(curWidth);
|
|
280
|
+
this.enter(CarouselEventType.Resizing);
|
|
281
|
+
this.trigger(CarouselEventType.Resize);
|
|
282
|
+
this.invalidate(CarouselProperty.Width);
|
|
283
|
+
this.refresh();
|
|
284
|
+
this.leave(CarouselEventType.Resizing);
|
|
285
|
+
this.trigger(CarouselEventType.Resized);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
is(state) {
|
|
289
|
+
return this._states.current[state] && this._states.current[state] > 0;
|
|
290
|
+
}
|
|
291
|
+
;
|
|
292
|
+
current(position) {
|
|
293
|
+
if (position === undefined) {
|
|
294
|
+
return this._current;
|
|
295
|
+
}
|
|
296
|
+
if (this._items.length === 0) {
|
|
297
|
+
return undefined;
|
|
298
|
+
}
|
|
299
|
+
position = this.normalize(position);
|
|
300
|
+
if (this._current !== position) {
|
|
301
|
+
this.trigger(CarouselEventType.Change, { property: { name: CarouselProperty.Position, value: position } });
|
|
302
|
+
this._current = position;
|
|
303
|
+
this.invalidate(CarouselProperty.Position);
|
|
304
|
+
this.trigger(CarouselEventType.Changed, { property: { name: CarouselProperty.Position, value: this._current } });
|
|
305
|
+
}
|
|
306
|
+
return this._current;
|
|
307
|
+
}
|
|
308
|
+
relative(position) {
|
|
309
|
+
position -= this._clones.length / 2;
|
|
310
|
+
return this.normalize(position, true);
|
|
311
|
+
}
|
|
312
|
+
maximum(relative = false) {
|
|
313
|
+
const settings = this.settings;
|
|
314
|
+
let maximum = this._coordinates.length, iterator, reciprocalItemsWidth, elementWidth;
|
|
315
|
+
if (settings.loop) {
|
|
316
|
+
maximum = this._clones.length / 2 + this._items.length - 1;
|
|
317
|
+
}
|
|
318
|
+
else if (settings.autoWidth || settings.merge) {
|
|
319
|
+
iterator = this._items.length;
|
|
320
|
+
reciprocalItemsWidth = this.slidesModel[--iterator].width;
|
|
321
|
+
elementWidth = this._width;
|
|
322
|
+
while (iterator--) {
|
|
323
|
+
reciprocalItemsWidth += +this.slidesModel[iterator].width + (this.settings.margin || 0).toString();
|
|
324
|
+
if (reciprocalItemsWidth > elementWidth) {
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
maximum = iterator + 1;
|
|
329
|
+
}
|
|
330
|
+
else if (settings.center) {
|
|
331
|
+
maximum = this._items.length - 1;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
maximum = this._items.length - (settings.items || 0);
|
|
335
|
+
}
|
|
336
|
+
if (relative) {
|
|
337
|
+
maximum -= this._clones.length / 2;
|
|
338
|
+
}
|
|
339
|
+
return Math.max(maximum, 0);
|
|
340
|
+
}
|
|
341
|
+
minimum(relative = false) {
|
|
342
|
+
return relative ? 0 : this._clones.length / 2;
|
|
343
|
+
}
|
|
344
|
+
items(position) {
|
|
345
|
+
if (position === undefined) {
|
|
346
|
+
return this._items.slice();
|
|
347
|
+
}
|
|
348
|
+
position = this.normalize(position, true);
|
|
349
|
+
return [this._items[position]];
|
|
350
|
+
}
|
|
351
|
+
mergers(position) {
|
|
352
|
+
if (position === undefined) {
|
|
353
|
+
return this._mergers.slice();
|
|
354
|
+
}
|
|
355
|
+
position = this.normalize(position, true);
|
|
356
|
+
return this._mergers[position];
|
|
357
|
+
}
|
|
358
|
+
clones(position) {
|
|
359
|
+
const odd = this._clones.length / 2, even = odd + this._items.length, map = (index) => index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2;
|
|
360
|
+
if (position === undefined) {
|
|
361
|
+
return this._clones.map((v, i) => map(i));
|
|
362
|
+
}
|
|
363
|
+
return this._clones.map((v, i) => v === position ? map(i) : null).filter(item => item);
|
|
364
|
+
}
|
|
365
|
+
speed(speed) {
|
|
366
|
+
if (speed !== undefined) {
|
|
367
|
+
this._speed = speed;
|
|
368
|
+
}
|
|
369
|
+
return this._speed || 0;
|
|
370
|
+
}
|
|
371
|
+
coordinates(position) {
|
|
372
|
+
let multiplier = 1, newPosition = (position || 0) - 1, coordinate, result;
|
|
373
|
+
if (position === undefined) {
|
|
374
|
+
result = this._coordinates.map((_, index) => {
|
|
375
|
+
return this.coordinates(index);
|
|
376
|
+
});
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
if (this.settings.center) {
|
|
380
|
+
if (this.settings.rtl) {
|
|
381
|
+
multiplier = -1;
|
|
382
|
+
newPosition = (position || 0) + 1;
|
|
383
|
+
}
|
|
384
|
+
coordinate = this._coordinates[(position || 0)];
|
|
385
|
+
coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
coordinate = this._coordinates[newPosition] || 0;
|
|
389
|
+
}
|
|
390
|
+
coordinate = Math.ceil(coordinate);
|
|
391
|
+
return coordinate;
|
|
392
|
+
}
|
|
393
|
+
to(position, speed) {
|
|
394
|
+
let current = this.current(), revert = null, distance = position - this.relative(current || 0), maximum = this.maximum(), delayForLoop = 0;
|
|
395
|
+
const direction = +(distance > 0) - +(distance < 0), items = this._items.length, minimum = this.minimum();
|
|
396
|
+
if (this.settings.loop) {
|
|
397
|
+
if (!this.settings.rewind && Math.abs(distance) > items / 2) {
|
|
398
|
+
distance += direction * -1 * items;
|
|
399
|
+
}
|
|
400
|
+
position = (current || 0) + distance;
|
|
401
|
+
revert = ((position - minimum) % items + items) % items + minimum;
|
|
402
|
+
if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
|
|
403
|
+
current = revert - distance;
|
|
404
|
+
position = revert;
|
|
405
|
+
delayForLoop = 30;
|
|
406
|
+
this.reset(current);
|
|
407
|
+
this.sendChanges();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else if (this.settings.rewind) {
|
|
411
|
+
maximum += 1;
|
|
412
|
+
position = (position % maximum + maximum) % maximum;
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
position = Math.max(minimum, Math.min(maximum, position));
|
|
416
|
+
}
|
|
417
|
+
setTimeout(() => {
|
|
418
|
+
this.speed(this.duration(current || 0, position, speed));
|
|
419
|
+
this.current(position);
|
|
420
|
+
this.update();
|
|
421
|
+
}, delayForLoop);
|
|
422
|
+
}
|
|
423
|
+
next(speed) {
|
|
424
|
+
speed = speed || false;
|
|
425
|
+
this.to(this.relative(this.current() || 0) + 1, speed);
|
|
426
|
+
}
|
|
427
|
+
previous(speed) {
|
|
428
|
+
speed = speed || false;
|
|
429
|
+
this.to(this.relative(this.current() || 0) - 1, speed);
|
|
430
|
+
}
|
|
431
|
+
onTransitionEnd(event) {
|
|
432
|
+
if (!event) {
|
|
433
|
+
this.leave(CarouselEventType.Animating);
|
|
434
|
+
this.trigger(CarouselEventType.Translated);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
setCurrentSlideClasses(slide) {
|
|
438
|
+
const currentClasses = {
|
|
439
|
+
'active': slide.isActive || false,
|
|
440
|
+
'center': slide.isCentered || false,
|
|
441
|
+
'cloned': slide.isCloned || false,
|
|
442
|
+
'animated': slide.isAnimated || false,
|
|
443
|
+
'animated-in': slide.isDefAnimatedIn || false,
|
|
444
|
+
'animated-out': slide.isDefAnimatedOut || false
|
|
445
|
+
};
|
|
446
|
+
if (this.settings.animateIn) {
|
|
447
|
+
currentClasses[this.settings.animateIn] = slide.isCustomAnimatedIn || false;
|
|
448
|
+
}
|
|
449
|
+
if (this.settings.animateOut) {
|
|
450
|
+
currentClasses[this.settings.animateOut] = slide.isCustomAnimatedOut || false;
|
|
451
|
+
}
|
|
452
|
+
return currentClasses;
|
|
453
|
+
}
|
|
454
|
+
enter(name) {
|
|
455
|
+
[name].concat(this._states.tags[name] || []).forEach((stateName) => {
|
|
456
|
+
if (this._states.current[stateName] === undefined) {
|
|
457
|
+
this._states.current[stateName] = 0;
|
|
458
|
+
}
|
|
459
|
+
this._states.current[stateName]++;
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
;
|
|
463
|
+
leave(name) {
|
|
464
|
+
[name].concat(this._states.tags[name] || []).forEach((stateName) => {
|
|
465
|
+
if (this._states.current[stateName] === 0 || !!this._states.current[stateName]) {
|
|
466
|
+
this._states.current[stateName]--;
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
;
|
|
471
|
+
setOptions(options) {
|
|
472
|
+
this.options = { ...CarouselServiceConstants.DEFAULT_OPTIONS, ...options };
|
|
473
|
+
}
|
|
474
|
+
validateItems(items, skip_validateItems) {
|
|
475
|
+
let result = items;
|
|
476
|
+
if (items > this._items.length && !skip_validateItems) {
|
|
477
|
+
result = this._items.length;
|
|
478
|
+
}
|
|
479
|
+
return result;
|
|
480
|
+
}
|
|
481
|
+
setCarouselWidth(width) {
|
|
482
|
+
this._width = width;
|
|
483
|
+
}
|
|
484
|
+
setOptionsForViewport() {
|
|
485
|
+
const viewport = this._width, overwrites = this.options.responsive || {};
|
|
486
|
+
let match = -1;
|
|
487
|
+
if (!Object.keys(overwrites).length) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
if (!viewport) {
|
|
491
|
+
this.settings.items = 1;
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
for (const key in overwrites) {
|
|
495
|
+
if (overwrites.hasOwnProperty(key)) {
|
|
496
|
+
if (+key <= viewport && +key > match) {
|
|
497
|
+
match = Number(key);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
this.settings = { ...this.options, ...overwrites[match], items: (overwrites[match] && overwrites[match].items) ? this.validateItems(overwrites[match].items || 0, this.options.skip_validateItems || false) : this.options.items };
|
|
502
|
+
delete this.settings.responsive;
|
|
503
|
+
this.carouselDOMModel.isResponsive = true;
|
|
504
|
+
const mergers = [];
|
|
505
|
+
this._items.forEach(item => {
|
|
506
|
+
const mergeN = this.settings.merge ? item.dataMerge : 1;
|
|
507
|
+
mergers.push(mergeN);
|
|
508
|
+
});
|
|
509
|
+
this._mergers = mergers;
|
|
510
|
+
this.invalidate(CarouselProperty.Settings);
|
|
511
|
+
}
|
|
512
|
+
optionsLogic() {
|
|
513
|
+
if (this.settings.autoWidth) {
|
|
514
|
+
this.settings.stagePadding = 0;
|
|
515
|
+
this.settings.merge = false;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
update() {
|
|
519
|
+
let i = 0;
|
|
520
|
+
const n = this._pipe.length, filter = (item) => this._invalidated[item], cache = {};
|
|
521
|
+
while (i < n) {
|
|
522
|
+
const filteredPipe = this._pipe[i].filter.filter(filter);
|
|
523
|
+
if (this._invalidated.all || filteredPipe.length > 0) {
|
|
524
|
+
this._pipe[i].run(cache);
|
|
525
|
+
}
|
|
526
|
+
i++;
|
|
527
|
+
}
|
|
528
|
+
this.slidesModel.forEach(slide => slide.classes = this.setCurrentSlideClasses(slide));
|
|
529
|
+
this.sendChanges();
|
|
530
|
+
this._invalidated = {};
|
|
531
|
+
if (!this.is('valid')) {
|
|
532
|
+
this.enter('valid');
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
width(dimension) {
|
|
536
|
+
dimension = dimension || Width.Default;
|
|
537
|
+
switch (dimension) {
|
|
538
|
+
case Width.Inner:
|
|
539
|
+
case Width.Outer:
|
|
540
|
+
return this._width;
|
|
541
|
+
default:
|
|
542
|
+
return this._width - (this.settings.stagePadding || 0) * 2 + (this.settings.margin || 0);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
refresh() {
|
|
546
|
+
this.enter(CarouselEventType.Refreshing);
|
|
547
|
+
this.trigger(CarouselEventType.Refresh);
|
|
548
|
+
this.defineSlidesData();
|
|
549
|
+
this.setOptionsForViewport();
|
|
550
|
+
this.optionsLogic();
|
|
551
|
+
this.update();
|
|
552
|
+
this.leave(CarouselEventType.Refreshing);
|
|
553
|
+
this.trigger(CarouselEventType.Refreshed);
|
|
554
|
+
}
|
|
555
|
+
animate(coordinate) {
|
|
556
|
+
const animate = this.speed() > 0;
|
|
557
|
+
if (this.is(CarouselEventType.Animating)) {
|
|
558
|
+
this.onTransitionEnd();
|
|
559
|
+
}
|
|
560
|
+
if (animate) {
|
|
561
|
+
this.enter(CarouselEventType.Animating);
|
|
562
|
+
this.trigger(CarouselEventType.Translate);
|
|
563
|
+
}
|
|
564
|
+
this.stageModel.transform = 'translate3d(' + coordinate + 'px,0px,0px)';
|
|
565
|
+
this.stageModel.transition = (this.speed() / 1000) + 's' + (this.settings.slideTransition ? ' ' + this.settings.slideTransition : '');
|
|
566
|
+
}
|
|
567
|
+
invalidate(part) {
|
|
568
|
+
if (typeof part === 'string') {
|
|
569
|
+
this._invalidated[part] = true;
|
|
570
|
+
if (this.is('valid')) {
|
|
571
|
+
this.leave('valid');
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return Object.keys(this._invalidated);
|
|
575
|
+
}
|
|
576
|
+
;
|
|
577
|
+
reset(position) {
|
|
578
|
+
position = this.normalize(position);
|
|
579
|
+
if (position === undefined) {
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
this._speed = 0;
|
|
583
|
+
this._current = position;
|
|
584
|
+
this.suppress([CarouselEventType.Translate, CarouselEventType.Translated]);
|
|
585
|
+
this.animate(this.coordinates(position));
|
|
586
|
+
this.release([CarouselEventType.Translate, CarouselEventType.Translated]);
|
|
587
|
+
}
|
|
588
|
+
normalize(position, relative) {
|
|
589
|
+
const n = this._items.length, m = relative ? 0 : this._clones.length;
|
|
590
|
+
if (!isNumeric(position) || n < 1) {
|
|
591
|
+
position = 0;
|
|
592
|
+
}
|
|
593
|
+
else if (position < 0 || position >= n + m) {
|
|
594
|
+
position = ((position - m / 2) % n + n) % n + m / 2;
|
|
595
|
+
}
|
|
596
|
+
return position;
|
|
597
|
+
}
|
|
598
|
+
duration(from, to, factor) {
|
|
599
|
+
if (factor === 0) {
|
|
600
|
+
return 0;
|
|
601
|
+
}
|
|
602
|
+
return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((+factor));
|
|
603
|
+
}
|
|
604
|
+
setItems(content) {
|
|
605
|
+
this._items = content;
|
|
606
|
+
}
|
|
607
|
+
defineSlidesData() {
|
|
608
|
+
let loadMap;
|
|
609
|
+
if (this.slidesModel && this.slidesModel.length) {
|
|
610
|
+
loadMap = new Map();
|
|
611
|
+
this.slidesModel.forEach(item => {
|
|
612
|
+
if (item.load) {
|
|
613
|
+
loadMap.set(item.id, item.load);
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
this.slidesModel = this._items.map(slide => {
|
|
618
|
+
return {
|
|
619
|
+
id: `${slide.id}`,
|
|
620
|
+
isActive: false,
|
|
621
|
+
tplRef: slide.tplRef,
|
|
622
|
+
dataMerge: slide.dataMerge,
|
|
623
|
+
width: 0,
|
|
624
|
+
isCloned: false,
|
|
625
|
+
load: loadMap ? loadMap.get(slide.id) : false,
|
|
626
|
+
classes: {}
|
|
627
|
+
};
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
op(a, o, b) {
|
|
631
|
+
const rtl = this.settings.rtl;
|
|
632
|
+
switch (o) {
|
|
633
|
+
case '<':
|
|
634
|
+
return rtl ? a > b : a < b;
|
|
635
|
+
case '>':
|
|
636
|
+
return rtl ? a < b : a > b;
|
|
637
|
+
case '>=':
|
|
638
|
+
return rtl ? a <= b : a >= b;
|
|
639
|
+
case '<=':
|
|
640
|
+
return rtl ? a >= b : a <= b;
|
|
641
|
+
default:
|
|
642
|
+
return false;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
trigger(name, data) {
|
|
646
|
+
switch (name) {
|
|
647
|
+
case CarouselEventType.Initialized:
|
|
648
|
+
this._initializedCarousel$.next(name);
|
|
649
|
+
break;
|
|
650
|
+
case CarouselEventType.Change:
|
|
651
|
+
this._changeSettingsCarousel$.next(data);
|
|
652
|
+
break;
|
|
653
|
+
case CarouselEventType.Changed:
|
|
654
|
+
this._changedSettingsCarousel$.next(data);
|
|
655
|
+
break;
|
|
656
|
+
case CarouselEventType.Resize:
|
|
657
|
+
this._resizeCarousel$.next(name);
|
|
658
|
+
break;
|
|
659
|
+
case CarouselEventType.Resized:
|
|
660
|
+
this._resizedCarousel$.next(name);
|
|
661
|
+
break;
|
|
662
|
+
case CarouselEventType.Refresh:
|
|
663
|
+
this._refreshCarousel$.next(name);
|
|
664
|
+
break;
|
|
665
|
+
case CarouselEventType.Refreshed:
|
|
666
|
+
this._refreshedCarousel$.next(name);
|
|
667
|
+
break;
|
|
668
|
+
case CarouselEventType.Translate:
|
|
669
|
+
this._translateCarousel$.next(name);
|
|
670
|
+
break;
|
|
671
|
+
case CarouselEventType.Translated:
|
|
672
|
+
this._translatedCarousel$.next(name);
|
|
673
|
+
break;
|
|
674
|
+
default:
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
suppress(events) {
|
|
679
|
+
events.forEach(event => {
|
|
680
|
+
this._supress[event] = true;
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
release(events) {
|
|
684
|
+
events.forEach(event => {
|
|
685
|
+
delete this._supress[event];
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
CarouselService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CarouselService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
690
|
+
CarouselService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CarouselService, providedIn: 'root' });
|
|
691
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CarouselService, decorators: [{
|
|
692
|
+
type: Injectable,
|
|
693
|
+
args: [{
|
|
694
|
+
providedIn: 'root'
|
|
695
|
+
}]
|
|
696
|
+
}] });
|
|
697
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZmMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvc2VydmljZS9jYXJvdXNlbC9jYXJvdXNlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU96RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTWhELE1BQU0sT0FBTyxlQUFlO0lBSDVCO1FBS1UsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFFM0QsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUU5Qyw2QkFBd0IsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBRTlDLDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFL0Msd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUU1Qyx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRTdDLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFekMsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUUxQyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRTFDLHdCQUFtQixHQUFHLElBQUksT0FBTyxF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aUJBQWlCLENBQUMsU0FBUztnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCLENBQUMsU0FBUztnQkFDOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCLENBQUMsVUFBVTtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtJQUNILENBQUM7SUFFTyxRQUFRLENBQUMsTUFBZ0I7UUFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxPQUFPLENBQUMsTUFBZ0I7UUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzs0R0FyMkJVLGVBQWU7Z0hBQWYsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbkNvbnN0YW50cywgaXNOdW1lcmljIH0gZnJvbSAnbmd4LXNmYy1jb21tb24nO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENhcm91c2VsRXZlbnRUeXBlLCBDYXJvdXNlbFByb3BlcnR5LCBDYXJvdXNlbFN0YXRlIH0gZnJvbSAnLi4vLi4vY2Fyb3VzZWwuZW51bSc7XHJcbmltcG9ydCB7IENhcm91c2VsU2xpZGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY2Fyb3VzZWwtc2xpZGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWxET01Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kb20ubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbE5hdmlnYXRpb25Eb3RzTW9kZWwsIENhcm91c2VsTmF2aWdhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25hdmlnYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbE9wdGlvbnNNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9vcHRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWxTbGlkZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NsaWRlLm1vZGVsJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWxTdGFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vcGFydHMvc3RhZ2UvY2Fyb3VzZWwtc3RhZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbFNlcnZpY2VDb25zdGFudHMgfSBmcm9tICcuL2Nhcm91c2VsLXNlcnZpY2UuY29uc3RhbnRzJztcclxuaW1wb3J0IHsgV2lkdGggfSBmcm9tICcuL2Nhcm91c2VsLXNlcnZpY2UuZW51bSc7XHJcbmltcG9ydCB7IENhcm91c2VsQ3VycmVudERhdGEsIFN0YXRlcyB9IGZyb20gJy4vY2Fyb3VzZWwtc2VydmljZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbFNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIF92aWV3U2V0dGluZ3NTaGlwcGVyJCA9IG5ldyBTdWJqZWN0PENhcm91c2VsQ3VycmVudERhdGE+KCk7XHJcblxyXG4gIHByaXZhdGUgX2luaXRpYWxpemVkQ2Fyb3VzZWwkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICBwcml2YXRlIF9jaGFuZ2VTZXR0aW5nc0Nhcm91c2VsJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2hhbmdlZFNldHRpbmdzQ2Fyb3VzZWwkID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICBwcml2YXRlIF90cmFuc2xhdGVDYXJvdXNlbCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIHByaXZhdGUgX3RyYW5zbGF0ZWRDYXJvdXNlbCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIHByaXZhdGUgX3Jlc2l6ZUNhcm91c2VsJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplZENhcm91c2VsJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVmcmVzaENhcm91c2VsJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVmcmVzaGVkQ2Fyb3VzZWwkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICBwcml2YXRlIGNhcm91c2VsRE9NTW9kZWw6IENhcm91c2VsRE9NTW9kZWwgPSB7XHJcbiAgICBydGw6IGZhbHNlLFxyXG4gICAgaXNSZXNwb25zaXZlOiBmYWxzZSxcclxuICAgIGlzUmVmcmVzaGVkOiBmYWxzZSxcclxuICAgIGlzTG9hZGVkOiBmYWxzZSxcclxuICAgIGlzTG9hZGluZzogZmFsc2VcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHN0YWdlTW9kZWw6IENhcm91c2VsU3RhZ2VNb2RlbCA9IHtcclxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDBweCwwcHgsMHB4KScsXHJcbiAgICB0cmFuc2l0aW9uOiAnMHMnLFxyXG4gICAgd2lkdGg6IDAsXHJcbiAgICBwYWRkaW5nTDogMCxcclxuICAgIHBhZGRpbmdSOiAwXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfd2lkdGghOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2l0ZW1zOiBDYXJvdXNlbFNsaWRlRGlyZWN0aXZlW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfd2lkdGhzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9zdXByZXNzOiBhbnkgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBfY3VycmVudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX2Nsb25lczogYW55W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfbWVyZ2VyczogYW55W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfc3BlZWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9jb29yZGluYXRlczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfaW52YWxpZGF0ZWQ6IGFueSA9IHt9O1xyXG5cclxuICBwcml2YXRlIF9zdGF0ZXM6IFN0YXRlcyA9IHtcclxuICAgIGN1cnJlbnQ6IHt9LFxyXG4gICAgdGFnczoge1xyXG4gICAgICBpbml0aWFsaXppbmc6IFtDYXJvdXNlbFN0YXRlLkJ1c3ldLFxyXG4gICAgICBhbmltYXRpbmc6IFtDYXJvdXNlbFN0YXRlLkJ1c3ldXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfcGlwZTogYW55W10gPSBbXHJcbiAgICB7XHJcbiAgICAgIGZpbHRlcjogW0Nhcm91c2VsUHJvcGVydHkuV2lkdGgsIENhcm91c2VsUHJvcGVydHkuSXRlbXMsIENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3NdLFxyXG4gICAgICBydW46IChjYWNoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY2FjaGUuY3VycmVudCA9IHRoaXMuX2l0ZW1zICYmIHRoaXMuX2l0ZW1zW3RoaXMucmVsYXRpdmUodGhpcy5fY3VycmVudCB8fCAwKV0uaWQ7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpbHRlcjogW0Nhcm91c2VsUHJvcGVydHkuV2lkdGgsIENhcm91c2VsUHJvcGVydHkuSXRlbXMsIENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3NdLFxyXG4gICAgICBydW46IChjYWNoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWFyZ2luID0gdGhpcy5zZXR0aW5ncy5tYXJnaW4gfHwgQ29tbW9uQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgIGdyaWQgPSAhdGhpcy5zZXR0aW5ncy5hdXRvV2lkdGgsXHJcbiAgICAgICAgICBydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCxcclxuICAgICAgICAgIGNzcyA9IHtcclxuICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JzogcnRsID8gbWFyZ2luIDogQ29tbW9uQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgICAgJ21hcmdpbi1yaWdodCc6IHJ0bCA/IENvbW1vbkNvbnN0YW50cy5FTVBUWV9TVFJJTkcgOiBtYXJnaW5cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICghZ3JpZCkge1xyXG4gICAgICAgICAgdGhpcy5zbGlkZXNNb2RlbC5mb3JFYWNoKHNsaWRlID0+IHtcclxuICAgICAgICAgICAgc2xpZGUubWFyZ2luTCA9IGNzc1snbWFyZ2luLWxlZnQnXTtcclxuICAgICAgICAgICAgc2xpZGUubWFyZ2luUiA9IGNzc1snbWFyZ2luLXJpZ2h0J107XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhY2hlLmNzcyA9IGNzcztcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoY2FjaGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHdpZHRoOiBhbnkgPSArKHRoaXMud2lkdGgoKSAvICh0aGlzLnNldHRpbmdzLml0ZW1zIHx8IDApKS50b0ZpeGVkKDMpIC0gKHRoaXMuc2V0dGluZ3MubWFyZ2luIHx8IDApLFxyXG4gICAgICAgICAgZ3JpZCA9ICF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxcclxuICAgICAgICAgIHdpZHRocyA9IFtdO1xyXG4gICAgICAgIGxldCBtZXJnZSA9IG51bGwsXHJcbiAgICAgICAgICBpdGVyYXRvciA9IHRoaXMuX2l0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgY2FjaGUuaXRlbXMgPSB7XHJcbiAgICAgICAgICBtZXJnZTogZmFsc2UsXHJcbiAgICAgICAgICB3aWR0aDogd2lkdGhcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB3aGlsZSAoaXRlcmF0b3ItLSkge1xyXG4gICAgICAgICAgbWVyZ2UgPSB0aGlzLl9tZXJnZXJzW2l0ZXJhdG9yXTtcclxuICAgICAgICAgIG1lcmdlID0gdGhpcy5zZXR0aW5ncy5tZXJnZUZpdCAmJiBNYXRoLm1pbihtZXJnZSwgKHRoaXMuc2V0dGluZ3MuaXRlbXMgfHwgMCkpIHx8IG1lcmdlO1xyXG4gICAgICAgICAgY2FjaGUuaXRlbXMubWVyZ2UgPSBtZXJnZSA+IDEgfHwgY2FjaGUuaXRlbXMubWVyZ2U7XHJcblxyXG4gICAgICAgICAgd2lkdGhzW2l0ZXJhdG9yXSA9ICFncmlkID8gdGhpcy5faXRlbXNbaXRlcmF0b3JdLndpZHRoID8gdGhpcy5faXRlbXNbaXRlcmF0b3JdLndpZHRoIDogd2lkdGggOiB3aWR0aCAqIG1lcmdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGhzID0gd2lkdGhzO1xyXG5cclxuICAgICAgICB0aGlzLnNsaWRlc01vZGVsLmZvckVhY2goKHNsaWRlLCBpKSA9PiB7XHJcbiAgICAgICAgICBzbGlkZS53aWR0aCA9IHRoaXMuX3dpZHRoc1tpXTtcclxuICAgICAgICAgIHNsaWRlLm1hcmdpblIgPSBjYWNoZS5jc3NbJ21hcmdpbi1yaWdodCddO1xyXG4gICAgICAgICAgc2xpZGUubWFyZ2luTCA9IGNhY2hlLmNzc1snbWFyZ2luLWxlZnQnXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2xvbmVzOiBhbnlbXSA9IFtdLFxyXG4gICAgICAgICAgaXRlbXM6IENhcm91c2VsU2xpZGVEaXJlY3RpdmVbXSA9IHRoaXMuX2l0ZW1zLFxyXG4gICAgICAgICAgc2V0dGluZ3M6IGFueSA9IHRoaXMuc2V0dGluZ3MsXHJcbiAgICAgICAgICB2aWV3ID0gTWF0aC5tYXgoc2V0dGluZ3MuaXRlbXMgKiAyLCA0KSxcclxuICAgICAgICAgIHNpemUgPSBNYXRoLmNlaWwoaXRlbXMubGVuZ3RoIC8gMikgKiAyO1xyXG4gICAgICAgIGxldCBhcHBlbmQ6IGFueVtdID0gW10sXHJcbiAgICAgICAgICBwcmVwZW5kOiBhbnlbXSA9IFtdLFxyXG4gICAgICAgICAgcmVwZWF0ID0gc2V0dGluZ3MubG9vcCAmJiBpdGVtcy5sZW5ndGggPyBzZXR0aW5ncy5yZXdpbmQgPyB2aWV3IDogTWF0aC5tYXgodmlldywgc2l6ZSkgOiAwO1xyXG5cclxuICAgICAgICByZXBlYXQgLz0gMjtcclxuXHJcbiAgICAgICAgd2hpbGUgKHJlcGVhdC0tKSB7XHJcbiAgICAgICAgICBjbG9uZXMucHVzaCh0aGlzLm5vcm1hbGl6ZShjbG9uZXMubGVuZ3RoIC8gMiwgdHJ1ZSkpO1xyXG4gICAgICAgICAgYXBwZW5kLnB1c2goeyAuLi50aGlzLnNsaWRlc01vZGVsW2Nsb25lc1tjbG9uZXMubGVuZ3RoIC0gMV1dIH0pO1xyXG4gICAgICAgICAgY2xvbmVzLnB1c2godGhpcy5ub3JtYWxpemUoaXRlbXMubGVuZ3RoIC0gMSAtIChjbG9uZXMubGVuZ3RoIC0gMSkgLyAyLCB0cnVlKSk7XHJcbiAgICAgICAgICBwcmVwZW5kLnVuc2hpZnQoeyAuLi50aGlzLnNsaWRlc01vZGVsW2Nsb25lc1tjbG9uZXMubGVuZ3RoIC0gMV1dIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY2xvbmVzID0gY2xvbmVzO1xyXG5cclxuICAgICAgICBhcHBlbmQgPSBhcHBlbmQubWFwKHNsaWRlID0+IHtcclxuICAgICAgICAgIHNsaWRlLmlkID0gYCR7Q2Fyb3VzZWxTZXJ2aWNlQ29uc3RhbnRzLkNMT05FX0lEX1BSRUZJWH0ke3NsaWRlLmlkfWA7XHJcbiAgICAgICAgICBzbGlkZS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgc2xpZGUuaXNDbG9uZWQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHNsaWRlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwZW5kID0gcHJlcGVuZC5tYXAoc2xpZGUgPT4ge1xyXG4gICAgICAgICAgc2xpZGUuaWQgPSBgJHtDYXJvdXNlbFNlcnZpY2VDb25zdGFudHMuQ0xPTkVfSURfUFJFRklYfSR7c2xpZGUuaWR9YDtcclxuICAgICAgICAgIHNsaWRlLmlzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICBzbGlkZS5pc0Nsb25lZCA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gc2xpZGU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2xpZGVzTW9kZWwgPSBwcmVwZW5kLmNvbmNhdCh0aGlzLnNsaWRlc01vZGVsKS5jb25jYXQoYXBwZW5kKTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGwgPyAxIDogLTEsXHJcbiAgICAgICAgICBzaXplID0gdGhpcy5fY2xvbmVzLmxlbmd0aCArIHRoaXMuX2l0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgIGNvb3JkaW5hdGVzID0gW107XHJcbiAgICAgICAgbGV0IGl0ZXJhdG9yID0gLTEsXHJcbiAgICAgICAgICBwcmV2aW91cyA9IDAsXHJcbiAgICAgICAgICBjdXJyZW50ID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKCsraXRlcmF0b3IgPCBzaXplKSB7XHJcbiAgICAgICAgICBwcmV2aW91cyA9IGNvb3JkaW5hdGVzW2l0ZXJhdG9yIC0gMV0gfHwgMDtcclxuICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShpdGVyYXRvcildICsgdGhpcy5zZXR0aW5ncy5tYXJnaW47XHJcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKHByZXZpb3VzICsgY3VycmVudCAqIHJ0bCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xyXG4gICAgICB9XHJcbiAgICB9LCB7XHJcbiAgICAgIGZpbHRlcjogW0Nhcm91c2VsUHJvcGVydHkuV2lkdGgsIENhcm91c2VsUHJvcGVydHkuSXRlbXMsIENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3NdLFxyXG4gICAgICBydW46ICgpID0+IHtcclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcgfHwgMCxcclxuICAgICAgICAgIGNvb3JkaW5hdGVzID0gdGhpcy5fY29vcmRpbmF0ZXMsXHJcbiAgICAgICAgICBjc3MgPSB7XHJcbiAgICAgICAgICAgICd3aWR0aCc6IE1hdGguY2VpbChNYXRoLmFicyhjb29yZGluYXRlc1tjb29yZGluYXRlcy5sZW5ndGggLSAxXSkpICsgcGFkZGluZyAqIDIsXHJcbiAgICAgICAgICAgICdwYWRkaW5nLWxlZnQnOiBwYWRkaW5nIHx8ICcnLFxyXG4gICAgICAgICAgICAncGFkZGluZy1yaWdodCc6IHBhZGRpbmcgfHwgJydcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc3RhZ2VNb2RlbC53aWR0aCA9IGNzcy53aWR0aDtcclxuICAgICAgICB0aGlzLnN0YWdlTW9kZWwucGFkZGluZ1IgPSBjc3NbJ3BhZGRpbmctcmlnaHQnXTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoY2FjaGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gY2FjaGUuY3VycmVudCA/IHRoaXMuc2xpZGVzTW9kZWwuZmluZEluZGV4KHNsaWRlID0+IHNsaWRlLmlkID09PSBjYWNoZS5jdXJyZW50KSA6IDA7XHJcbiAgICAgICAgY3VycmVudCA9IE1hdGgubWF4KHRoaXMubWluaW11bSgpLCBNYXRoLm1pbih0aGlzLm1heGltdW0oKSwgY3VycmVudCkpO1xyXG4gICAgICAgIHRoaXMucmVzZXQoY3VycmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0sIHtcclxuICAgICAgZmlsdGVyOiBbQ2Fyb3VzZWxQcm9wZXJ0eS5Qb3NpdGlvbl0sXHJcbiAgICAgIHJ1bjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZSh0aGlzLmNvb3JkaW5hdGVzKHRoaXMuX2N1cnJlbnQpKTtcclxuICAgICAgfVxyXG4gICAgfSwge1xyXG4gICAgICBmaWx0ZXI6IFtDYXJvdXNlbFByb3BlcnR5LldpZHRoLCBDYXJvdXNlbFByb3BlcnR5LlBvc2l0aW9uLCBDYXJvdXNlbFByb3BlcnR5Lkl0ZW1zLCBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzXSxcclxuICAgICAgcnVuOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGwgPyAxIDogLTEsXHJcbiAgICAgICAgICBwYWRkaW5nID0gKHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nIHx8IDApICogMixcclxuICAgICAgICAgIG1hdGNoZXMgPSBbXTtcclxuICAgICAgICBsZXQgYmVnaW46IGFueSwgZW5kLCBpbm5lciwgb3V0ZXIsIGksIG47XHJcblxyXG4gICAgICAgIGJlZ2luID0gdGhpcy5jb29yZGluYXRlcyh0aGlzLmN1cnJlbnQoKSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiZWdpbiA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGJlZ2luICs9IHBhZGRpbmc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJlZ2luID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVuZCA9IGJlZ2luICsgdGhpcy53aWR0aCgpICogcnRsO1xyXG5cclxuICAgICAgICBpZiAocnRsID09PSAtMSAmJiB0aGlzLnNldHRpbmdzLmNlbnRlcikge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY29vcmRpbmF0ZXMuZmlsdGVyKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuc2V0dGluZ3MuaXRlbXMgfHwgMCkgJSAyID09PSAxID8gZWxlbWVudCA+PSBiZWdpbiA6IGVsZW1lbnQgPiBiZWdpbjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYmVnaW4gPSByZXN1bHQubGVuZ3RoID8gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA6IGJlZ2luO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gMCwgbiA9IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgaW5uZXIgPSBNYXRoLmNlaWwodGhpcy5fY29vcmRpbmF0ZXNbaSAtIDFdIHx8IDApO1xyXG4gICAgICAgICAgb3V0ZXIgPSBNYXRoLmNlaWwoTWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbaV0pICsgcGFkZGluZyAqIHJ0bCk7XHJcblxyXG4gICAgICAgICAgaWYgKCh0aGlzLm9wKGlubmVyLCAnPD0nLCBiZWdpbikgJiYgKHRoaXMub3AoaW5uZXIsICc+JywgZW5kKSkpXHJcbiAgICAgICAgICAgIHx8ICh0aGlzLm9wKG91dGVyLCAnPCcsIGJlZ2luKSAmJiB0aGlzLm9wKG91dGVyLCAnPicsIGVuZCkpKSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaChpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2xpZGVzTW9kZWwuZm9yRWFjaChzbGlkZSA9PiB7XHJcbiAgICAgICAgICBzbGlkZS5pc0FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHNsaWRlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1hdGNoZXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgIHRoaXMuc2xpZGVzTW9kZWxbaXRlbV0uaXNBY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5jZW50ZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2xpZGVzTW9kZWwuZm9yRWFjaChzbGlkZSA9PiB7XHJcbiAgICAgICAgICAgIHNsaWRlLmlzQ2VudGVyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHNsaWRlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmN1cnJlbnQoKTtcclxuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUpXHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVzTW9kZWxbY3VycmVudFZhbHVlXS5pc0NlbnRlcmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBdO1xyXG5cclxuICBzZXR0aW5nczogQ2Fyb3VzZWxPcHRpb25zTW9kZWwgPSB7XHJcbiAgICBpdGVtczogMFxyXG4gIH07XHJcblxyXG4gIHNsaWRlc01vZGVsITogQ2Fyb3VzZWxTbGlkZU1vZGVsW107XHJcblxyXG4gIG5hdmlnYXRpb25Nb2RlbCE6IENhcm91c2VsTmF2aWdhdGlvbk1vZGVsO1xyXG5cclxuICBuYXZpZ2F0aW9uRG90c01vZGVsITogQ2Fyb3VzZWxOYXZpZ2F0aW9uRG90c01vZGVsO1xyXG5cclxuICBvcHRpb25zOiBDYXJvdXNlbE9wdGlvbnNNb2RlbCA9IHt9O1xyXG5cclxuICBnZXQgdmlld0N1cnJyZW50U2V0dGluZ3MoKTogT2JzZXJ2YWJsZTxDYXJvdXNlbEN1cnJlbnREYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmlld1NldHRpbmdzU2hpcHBlciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5pdGlhbGl6ZWRTdGF0ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkQ2Fyb3VzZWwkLmFzT2JzZXJ2YWJsZSgpXHJcbiAgfVxyXG5cclxuICBnZXQgY2hhbmdlU3RhdGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VTZXR0aW5nc0Nhcm91c2VsJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGFuZ2VkU3RhdGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkU2V0dGluZ3NDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhbnNsYXRlU3RhdGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhbnNsYXRlZFN0YXRlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlZENhcm91c2VsJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldCByZXNpemVTdGF0ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jlc2l6ZUNhcm91c2VsJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGdldCByZXNpemVkU3RhdGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZXNpemVkQ2Fyb3VzZWwkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZnJlc2hTdGF0ZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVmcmVzaGVkU3RhdGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWZyZXNoZWRDYXJvdXNlbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBzZXR1cChjYXJvdXNlbFdpZHRoOiBudW1iZXIsIHNsaWRlczogQ2Fyb3VzZWxTbGlkZURpcmVjdGl2ZVtdLCBvcHRpb25zOiBDYXJvdXNlbE9wdGlvbnNNb2RlbCkge1xyXG4gICAgdGhpcy5zZXRDYXJvdXNlbFdpZHRoKGNhcm91c2VsV2lkdGgpO1xyXG4gICAgdGhpcy5zZXRJdGVtcyhzbGlkZXMpO1xyXG4gICAgdGhpcy5kZWZpbmVTbGlkZXNEYXRhKCk7XHJcbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5vcHRpb25zIH07XHJcblxyXG4gICAgdGhpcy5zZXRPcHRpb25zRm9yVmlld3BvcnQoKTtcclxuXHJcbiAgICB0aGlzLnRyaWdnZXIoQ2Fyb3VzZWxFdmVudFR5cGUuQ2hhbmdlLCB7IHByb3BlcnR5OiB7IG5hbWU6IENhcm91c2VsUHJvcGVydHkuU2V0dGluZ3MsIHZhbHVlOiB0aGlzLnNldHRpbmdzIH0gfSk7XHJcbiAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5TZXR0aW5ncyk7XHJcbiAgICB0aGlzLnRyaWdnZXIoQ2Fyb3VzZWxFdmVudFR5cGUuQ2hhbmdlZCwgeyBwcm9wZXJ0eTogeyBuYW1lOiBDYXJvdXNlbFByb3BlcnR5LlNldHRpbmdzLCB2YWx1ZTogdGhpcy5zZXR0aW5ncyB9IH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZShzbGlkZXM6IENhcm91c2VsU2xpZGVEaXJlY3RpdmVbXSkge1xyXG4gICAgdGhpcy5lbnRlcihDYXJvdXNlbEV2ZW50VHlwZS5Jbml0aWFsaXppbmcpO1xyXG5cclxuICAgIHRoaXMuY2Fyb3VzZWxET01Nb2RlbC5ydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCB8fCBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fbWVyZ2Vycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5fbWVyZ2VycyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNsaWRlcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCBtZXJnZU46IG51bWJlciA9IHRoaXMuc2V0dGluZ3MubWVyZ2UgPyBpdGVtLmRhdGFNZXJnZSA6IDE7XHJcbiAgICAgIHRoaXMuX21lcmdlcnMucHVzaChtZXJnZU4pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9jbG9uZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnJlc2V0KGlzTnVtZXJpYyh0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24pID8gKyh0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24gfHwgMCkgOiAwKTtcclxuXHJcbiAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5JdGVtcyk7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuXHJcbiAgICB0aGlzLmNhcm91c2VsRE9NTW9kZWwuaXNMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuc2VuZENoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLkluaXRpYWxpemluZyk7XHJcbiAgICB0aGlzLnRyaWdnZXIoQ2Fyb3VzZWxFdmVudFR5cGUuSW5pdGlhbGl6ZWQpO1xyXG4gIH07XHJcblxyXG4gIHNlbmRDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5fdmlld1NldHRpbmdzU2hpcHBlciQubmV4dCh7XHJcbiAgICAgIGNhcm91c2VsRE9NTW9kZWw6IHRoaXMuY2Fyb3VzZWxET01Nb2RlbCxcclxuICAgICAgc3RhZ2VNb2RlbDogdGhpcy5zdGFnZU1vZGVsLFxyXG4gICAgICBzbGlkZXNNb2RlbDogdGhpcy5zbGlkZXNNb2RlbCxcclxuICAgICAgbmF2aWdhdGlvbk1vZGVsOiB0aGlzLm5hdmlnYXRpb25Nb2RlbCxcclxuICAgICAgbmF2aWdhdGlvbkRvdHNNb2RlbDogdGhpcy5uYXZpZ2F0aW9uRG90c01vZGVsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplKGN1cldpZHRoOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9pdGVtcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZXRDYXJvdXNlbFdpZHRoKGN1cldpZHRoKTtcclxuICAgICAgdGhpcy5lbnRlcihDYXJvdXNlbEV2ZW50VHlwZS5SZXNpemluZyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcihDYXJvdXNlbEV2ZW50VHlwZS5SZXNpemUpO1xyXG4gICAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5XaWR0aCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLlJlc2l6aW5nKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLlJlc2l6ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXMoc3RhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9zdGF0ZXMuY3VycmVudCBhcyBhbnkpW3N0YXRlXSAmJiAodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZV0gPiAwO1xyXG4gIH07XHJcblxyXG4gIGN1cnJlbnQocG9zaXRpb24/OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQgYXMgbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uKTtcclxuXHJcbiAgICBpZiAodGhpcy5fY3VycmVudCAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLkNoYW5nZSwgeyBwcm9wZXJ0eTogeyBuYW1lOiBDYXJvdXNlbFByb3BlcnR5LlBvc2l0aW9uLCB2YWx1ZTogcG9zaXRpb24gfSB9KTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJlbnQgPSBwb3NpdGlvbjtcclxuXHJcbiAgICAgIHRoaXMuaW52YWxpZGF0ZShDYXJvdXNlbFByb3BlcnR5LlBvc2l0aW9uKTtcclxuICAgICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLkNoYW5nZWQsIHsgcHJvcGVydHk6IHsgbmFtZTogQ2Fyb3VzZWxQcm9wZXJ0eS5Qb3NpdGlvbiwgdmFsdWU6IHRoaXMuX2N1cnJlbnQgfSB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcclxuICB9XHJcblxyXG4gIHJlbGF0aXZlKHBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcG9zaXRpb24gLT0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDI7XHJcbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgbWF4aW11bShyZWxhdGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcclxuICAgIGxldCBtYXhpbXVtID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLFxyXG4gICAgICBpdGVyYXRvcixcclxuICAgICAgcmVjaXByb2NhbEl0ZW1zV2lkdGgsXHJcbiAgICAgIGVsZW1lbnRXaWR0aDtcclxuXHJcbiAgICBpZiAoc2V0dGluZ3MubG9vcCkge1xyXG4gICAgICBtYXhpbXVtID0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDIgKyB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdXRvV2lkdGggfHwgc2V0dGluZ3MubWVyZ2UpIHtcclxuICAgICAgaXRlcmF0b3IgPSB0aGlzLl9pdGVtcy5sZW5ndGg7XHJcbiAgICAgIHJlY2lwcm9jYWxJdGVtc1dpZHRoID0gdGhpcy5zbGlkZXNNb2RlbFstLWl0ZXJhdG9yXS53aWR0aDtcclxuICAgICAgZWxlbWVudFdpZHRoID0gdGhpcy5fd2lkdGg7XHJcbiAgICAgIHdoaWxlIChpdGVyYXRvci0tKSB7XHJcbiAgICAgICAgcmVjaXByb2NhbEl0ZW1zV2lkdGggKz0gKyh0aGlzLnNsaWRlc01vZGVsW2l0ZXJhdG9yXS53aWR0aCBhcyBzdHJpbmcpICsgKHRoaXMuc2V0dGluZ3MubWFyZ2luIHx8IDApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKChyZWNpcHJvY2FsSXRlbXNXaWR0aCBhcyBudW1iZXIpID4gZWxlbWVudFdpZHRoKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbWF4aW11bSA9IGl0ZXJhdG9yICsgMTtcclxuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuY2VudGVyKSB7XHJcbiAgICAgIG1heGltdW0gPSB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWF4aW11bSA9IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIChzZXR0aW5ncy5pdGVtcyB8fCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVsYXRpdmUpIHtcclxuICAgICAgbWF4aW11bSAtPSB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4aW11bSwgMCk7XHJcbiAgfVxyXG5cclxuICBtaW5pbXVtKHJlbGF0aXZlOiBib29sZWFuID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJlbGF0aXZlID8gMCA6IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyO1xyXG4gIH1cclxuXHJcbiAgaXRlbXMocG9zaXRpb24/OiBudW1iZXIpOiBDYXJvdXNlbFNsaWRlRGlyZWN0aXZlW10ge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gW3RoaXMuX2l0ZW1zW3Bvc2l0aW9uXV07XHJcbiAgfVxyXG5cclxuICBtZXJnZXJzKHBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIgfCBudW1iZXJbXSB7XHJcbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbWVyZ2Vycy5zbGljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuX21lcmdlcnNbcG9zaXRpb25dO1xyXG4gIH1cclxuXHJcbiAgY2xvbmVzKHBvc2l0aW9uPzogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3Qgb2RkID0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDIsXHJcbiAgICAgIGV2ZW4gPSBvZGQgKyB0aGlzLl9pdGVtcy5sZW5ndGgsXHJcbiAgICAgIG1hcCA9IChpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIDIgPT09IDAgPyBldmVuICsgaW5kZXggLyAyIDogb2RkIC0gKGluZGV4ICsgMSkgLyAyO1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jbG9uZXMubWFwKCh2LCBpKSA9PiBtYXAoaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jbG9uZXMubWFwKCh2LCBpKSA9PiB2ID09PSBwb3NpdGlvbiA/IG1hcChpKSA6IG51bGwpLmZpbHRlcihpdGVtID0+IGl0ZW0pIGFzIG51bWJlcltdO1xyXG4gIH1cclxuXHJcbiAgc3BlZWQoc3BlZWQ/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKHNwZWVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fc3BlZWQgPSBzcGVlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fc3BlZWQgfHwgMDtcclxuICB9XHJcblxyXG4gIGNvb3JkaW5hdGVzKHBvc2l0aW9uOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVtYmVyW10ge1xyXG4gICAgbGV0IG11bHRpcGxpZXIgPSAxLFxyXG4gICAgICBuZXdQb3NpdGlvbiA9IChwb3NpdGlvbiB8fCAwKSAtIDEsXHJcbiAgICAgIGNvb3JkaW5hdGUsXHJcbiAgICAgIHJlc3VsdDogbnVtYmVyW107XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5fY29vcmRpbmF0ZXMubWFwKChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVzKGluZGV4KSBhcyBudW1iZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmNlbnRlcikge1xyXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5ydGwpIHtcclxuICAgICAgICBtdWx0aXBsaWVyID0gLTE7XHJcbiAgICAgICAgbmV3UG9zaXRpb24gPSAocG9zaXRpb24gfHwgMCkgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb29yZGluYXRlID0gdGhpcy5fY29vcmRpbmF0ZXNbKHBvc2l0aW9uIHx8IDApXTtcclxuICAgICAgY29vcmRpbmF0ZSArPSAodGhpcy53aWR0aCgpIC0gY29vcmRpbmF0ZSArICh0aGlzLl9jb29yZGluYXRlc1tuZXdQb3NpdGlvbl0gfHwgMCkpIC8gMiAqIG11bHRpcGxpZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb29yZGluYXRlID0gdGhpcy5fY29vcmRpbmF0ZXNbbmV3UG9zaXRpb25dIHx8IDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29vcmRpbmF0ZSA9IE1hdGguY2VpbChjb29yZGluYXRlKTtcclxuXHJcbiAgICByZXR1cm4gY29vcmRpbmF0ZTtcclxuICB9XHJcblxyXG4gIHRvKHBvc2l0aW9uOiBudW1iZXIsIHNwZWVkOiBudW1iZXIgfCBib29sZWFuKSB7XHJcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuY3VycmVudCgpLFxyXG4gICAgICByZXZlcnQgPSBudWxsLFxyXG4gICAgICBkaXN0YW5jZSA9IHBvc2l0aW9uIC0gdGhpcy5yZWxhdGl2ZShjdXJyZW50IHx8IDApLFxyXG4gICAgICBtYXhpbXVtID0gdGhpcy5tYXhpbXVtKCksXHJcbiAgICAgIGRlbGF5Rm9yTG9vcCA9IDA7XHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSArKGRpc3RhbmNlID4gMCkgLSArKGRpc3RhbmNlIDwgMCksXHJcbiAgICAgIGl0ZW1zID0gdGhpcy5faXRlbXMubGVuZ3RoLFxyXG4gICAgICBtaW5pbXVtID0gdGhpcy5taW5pbXVtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MubG9vcCkge1xyXG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3MucmV3aW5kICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGl0ZW1zIC8gMikge1xyXG4gICAgICAgIGRpc3RhbmNlICs9IGRpcmVjdGlvbiAqIC0xICogaXRlbXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBvc2l0aW9uID0gKGN1cnJlbnQgfHwgMCkgKyBkaXN0YW5jZTtcclxuICAgICAgcmV2ZXJ0ID0gKChwb3NpdGlvbiAtIG1pbmltdW0pICUgaXRlbXMgKyBpdGVtcykgJSBpdGVtcyArIG1pbmltdW07XHJcblxyXG4gICAgICBpZiAocmV2ZXJ0ICE9PSBwb3NpdGlvbiAmJiByZXZlcnQgLSBkaXN0YW5jZSA8PSBtYXhpbXVtICYmIHJldmVydCAtIGRpc3RhbmNlID4gMCkge1xyXG4gICAgICAgIGN1cnJlbnQgPSByZXZlcnQgLSBkaXN0YW5jZTtcclxuICAgICAgICBwb3NpdGlvbiA9IHJldmVydDtcclxuICAgICAgICBkZWxheUZvckxvb3AgPSAzMDtcclxuICAgICAgICB0aGlzLnJlc2V0KGN1cnJlbnQpO1xyXG4gICAgICAgIHRoaXMuc2VuZENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLnJld2luZCkge1xyXG4gICAgICBtYXhpbXVtICs9IDE7XHJcbiAgICAgIHBvc2l0aW9uID0gKHBvc2l0aW9uICUgbWF4aW11bSArIG1heGltdW0pICUgbWF4aW11bTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvc2l0aW9uID0gTWF0aC5tYXgobWluaW11bSwgTWF0aC5taW4obWF4aW11bSwgcG9zaXRpb24pKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zcGVlZCh0aGlzLmR1cmF0aW9uKGN1cnJlbnQgfHwgMCwgcG9zaXRpb24sIHNwZWVkKSk7XHJcbiAgICAgIHRoaXMuY3VycmVudChwb3NpdGlvbik7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSwgZGVsYXlGb3JMb29wKTtcclxuICB9XHJcblxyXG4gIG5leHQoc3BlZWQ6IG51bWJlciB8IGJvb2xlYW4pIHtcclxuICAgIHNwZWVkID0gc3BlZWQgfHwgZmFsc2U7XHJcbiAgICB0aGlzLnRvKHRoaXMucmVsYXRpdmUodGhpcy5jdXJyZW50KCkgfHwgMCkgKyAxLCBzcGVlZCk7XHJcbiAgfVxyXG5cclxuICBwcmV2aW91cyhzcGVlZDogbnVtYmVyIHwgYm9vbGVhbikge1xyXG4gICAgc3BlZWQgPSBzcGVlZCB8fCBmYWxzZTtcclxuICAgIHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSB8fCAwKSAtIDEsIHNwZWVkKTtcclxuICB9XHJcblxyXG4gIG9uVHJhbnNpdGlvbkVuZChldmVudD86IGFueSkge1xyXG4gICAgaWYgKCFldmVudCkge1xyXG4gICAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLkFuaW1hdGluZyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcihDYXJvdXNlbEV2ZW50VHlwZS5UcmFuc2xhdGVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEN1cnJlbnRTbGlkZUNsYXNzZXMoc2xpZGU6IENhcm91c2VsU2xpZGVNb2RlbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGNvbnN0IGN1cnJlbnRDbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHtcclxuICAgICAgJ2FjdGl2ZSc6IHNsaWRlLmlzQWN0aXZlIHx8IGZhbHNlLFxyXG4gICAgICAnY2VudGVyJzogc2xpZGUuaXNDZW50ZXJlZCB8fCBmYWxzZSxcclxuICAgICAgJ2Nsb25lZCc6IHNsaWRlLmlzQ2xvbmVkIHx8IGZhbHNlLFxyXG4gICAgICAnYW5pbWF0ZWQnOiBzbGlkZS5pc0FuaW1hdGVkIHx8IGZhbHNlLFxyXG4gICAgICAnYW5pbWF0ZWQtaW4nOiBzbGlkZS5pc0RlZkFuaW1hdGVkSW4gfHwgZmFsc2UsXHJcbiAgICAgICdhbmltYXRlZC1vdXQnOiBzbGlkZS5pc0RlZkFuaW1hdGVkT3V0IHx8IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuYW5pbWF0ZUluKSB7XHJcbiAgICAgIGN1cnJlbnRDbGFzc2VzW3RoaXMuc2V0dGluZ3MuYW5pbWF0ZUluIGFzIHN0cmluZ10gPSBzbGlkZS5pc0N1c3RvbUFuaW1hdGVkSW4gfHwgZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5hbmltYXRlT3V0KSB7XHJcbiAgICAgIGN1cnJlbnRDbGFzc2VzW3RoaXMuc2V0dGluZ3MuYW5pbWF0ZU91dCBhcyBzdHJpbmddID0gc2xpZGUuaXNDdXN0b21BbmltYXRlZE91dCB8fCBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Q2xhc3NlcztcclxuICB9XHJcblxyXG4gIGVudGVyKG5hbWU6IHN0cmluZykge1xyXG4gICAgW25hbWVdLmNvbmNhdCh0aGlzLl9zdGF0ZXMudGFnc1tuYW1lXSB8fCBbXSkuZm9yRWFjaCgoc3RhdGVOYW1lKSA9PiB7XHJcbiAgICAgIGlmICgodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZU5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZU5hbWVdID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgKHRoaXMuX3N0YXRlcy5jdXJyZW50IGFzIGFueSlbc3RhdGVOYW1lXSsrO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgbGVhdmUobmFtZTogc3RyaW5nKSB7XHJcbiAgICBbbmFtZV0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW25hbWVdIHx8IFtdKS5mb3JFYWNoKChzdGF0ZU5hbWUpID0+IHtcclxuICAgICAgaWYgKCh0aGlzLl9zdGF0ZXMuY3VycmVudCBhcyBhbnkpW3N0YXRlTmFtZV0gPT09IDAgfHwgISEodGhpcy5fc3RhdGVzLmN1cnJlbnQgYXMgYW55KVtzdGF0ZU5hbWVdKSB7XHJcbiAgICAgICAgKHRoaXMuX3N0YXRlcy5jdXJyZW50IGFzIGFueSlbc3RhdGVOYW1lXS0tO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc2V0T3B0aW9ucyhvcHRpb25zOiBDYXJvdXNlbE9wdGlvbnNNb2RlbCkge1xyXG4gICAgdGhpcy5vcHRpb25zID0geyAuLi5DYXJvdXNlbFNlcnZpY2VDb25zdGFudHMuREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRlSXRlbXMoaXRlbXM6IG51bWJlciwgc2tpcF92YWxpZGF0ZUl0ZW1zOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IGl0ZW1zO1xyXG5cclxuICAgIGlmIChpdGVtcyA+IHRoaXMuX2l0ZW1zLmxlbmd0aCAmJiAhc2tpcF92YWxpZGF0ZUl0ZW1zKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2l0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDYXJvdXNlbFdpZHRoKHdpZHRoOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE9wdGlvbnNGb3JWaWV3cG9ydCgpIHtcclxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fd2lkdGgsXHJcbiAgICAgIG92ZXJ3cml0ZXMgPSB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSB8fCB7fTtcclxuICAgIGxldCBtYXRjaCA9IC0xO1xyXG5cclxuICAgIGlmICghT2JqZWN0LmtleXMob3ZlcndyaXRlcykubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXZpZXdwb3J0KSB7XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuaXRlbXMgPSAxO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3ZlcndyaXRlcykge1xyXG4gICAgICBpZiAob3ZlcndyaXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgaWYgKCtrZXkgPD0gdmlld3BvcnQgJiYgK2tleSA+IG1hdGNoKSB7XHJcbiAgICAgICAgICBtYXRjaCA9IE51bWJlcihrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ub3ZlcndyaXRlc1ttYXRjaF0sIGl0ZW1zOiAob3ZlcndyaXRlc1ttYXRjaF0gJiYgb3ZlcndyaXRlc1ttYXRjaF0uaXRlbXMpID8gdGhpcy52YWxpZGF0ZUl0ZW1zKG92ZXJ3cml0ZXNbbWF0Y2hdLml0ZW1zIHx8IDAsIHRoaXMub3B0aW9ucy5za2lwX3ZhbGlkYXRlSXRlbXMgfHwgZmFsc2UpIDogdGhpcy5vcHRpb25zLml0ZW1zIH07XHJcblxyXG4gICAgZGVsZXRlIHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZTtcclxuICAgIHRoaXMuY2Fyb3VzZWxET01Nb2RlbC5pc1Jlc3BvbnNpdmUgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IG1lcmdlcnM6IGFueVtdID0gW107XHJcbiAgICB0aGlzLl9pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCBtZXJnZU46IG51bWJlciA9IHRoaXMuc2V0dGluZ3MubWVyZ2UgPyBpdGVtLmRhdGFNZXJnZSA6IDE7XHJcbiAgICAgIG1lcmdlcnMucHVzaChtZXJnZU4pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXJnZXJzID0gbWVyZ2VycztcclxuXHJcbiAgICB0aGlzLmludmFsaWRhdGUoQ2Fyb3VzZWxQcm9wZXJ0eS5TZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wdGlvbnNMb2dpYygpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCkge1xyXG4gICAgICB0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyA9IDA7XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MubWVyZ2UgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbiA9IHRoaXMuX3BpcGUubGVuZ3RoLFxyXG4gICAgICBmaWx0ZXIgPSAoaXRlbTogc3RyaW5nIHwgbnVtYmVyKSA9PiB0aGlzLl9pbnZhbGlkYXRlZFtpdGVtXSxcclxuICAgICAgY2FjaGUgPSB7fTtcclxuXHJcbiAgICB3aGlsZSAoaSA8IG4pIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWRQaXBlID0gdGhpcy5fcGlwZVtpXS5maWx0ZXIuZmlsdGVyKGZpbHRlcik7XHJcbiAgICAgIGlmICh0aGlzLl9pbnZhbGlkYXRlZC5hbGwgfHwgZmlsdGVyZWRQaXBlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl9waXBlW2ldLnJ1bihjYWNoZSk7XHJcbiAgICAgIH1cclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zbGlkZXNNb2RlbC5mb3JFYWNoKHNsaWRlID0+IHNsaWRlLmNsYXNzZXMgPSB0aGlzLnNldEN1cnJlbnRTbGlkZUNsYXNzZXMoc2xpZGUpKTtcclxuICAgIHRoaXMuc2VuZENoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLl9pbnZhbGlkYXRlZCA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5pcygndmFsaWQnKSkge1xyXG4gICAgICB0aGlzLmVudGVyKCd2YWxpZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3aWR0aChkaW1lbnNpb24/OiBXaWR0aCk6IG51bWJlciB7XHJcbiAgICBkaW1lbnNpb24gPSBkaW1lbnNpb24gfHwgV2lkdGguRGVmYXVsdDtcclxuICAgIHN3aXRjaCAoZGltZW5zaW9uKSB7XHJcbiAgICAgIGNhc2UgV2lkdGguSW5uZXI6XHJcbiAgICAgIGNhc2UgV2lkdGguT3V0ZXI6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCAtICh0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyB8fCAwKSAqIDIgKyAodGhpcy5zZXR0aW5ncy5tYXJnaW4gfHwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2goKSB7XHJcbiAgICB0aGlzLmVudGVyKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2hpbmcpO1xyXG4gICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2gpO1xyXG4gICAgdGhpcy5kZWZpbmVTbGlkZXNEYXRhKCk7XHJcbiAgICB0aGlzLnNldE9wdGlvbnNGb3JWaWV3cG9ydCgpO1xyXG4gICAgdGhpcy5vcHRpb25zTG9naWMoKTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB0aGlzLmxlYXZlKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2hpbmcpO1xyXG4gICAgdGhpcy50cmlnZ2VyKENhcm91c2VsRXZlbnRUeXBlLlJlZnJlc2hlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFuaW1hdGUoY29vcmRpbmF0ZTogbnVtYmVyIHwgbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IGFuaW1hdGUgPSB0aGlzLnNwZWVkKCkgPiAwO1xyXG5cclxuICAgIGlmICh0aGlzLmlzKENhcm91c2VsRXZlbnRUeXBlLkFuaW1hdGluZykpIHtcclxuICAgICAgdGhpcy5vblRyYW5zaXRpb25FbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYW5pbWF0ZSkge1xyXG4gICAgICB0aGlzLmVudGVyKENhcm91c2VsRXZlbnRUeXBlLkFuaW1hdGluZyk7XHJcbiAgICAgIHRoaXMudHJpZ2dlcihDYXJvdXNlbEV2ZW50VHlwZS5UcmFuc2xhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhZ2VNb2RlbC50cmFuc2Zvcm0gPSAndHJhbnNsYXRlM2QoJyArIGNvb3JkaW5hdGUgKyAncHgsMHB4LDBweCknO1xyXG4gICAgdGhpcy5zdGFnZU1vZGVsLnRyYW5zaXRpb24gPSAodGhpcy5zcGVlZCgpIC8gMTAwMCkgKyAncycgKyAoXHJcbiAgICAgIHRoaXMuc2V0dGluZ3Muc2xpZGVUcmFuc2l0aW9uID8gJyAnICsgdGhpcy5zZXR0aW5ncy5zbGlkZVRyYW5zaXRpb24gOiAnJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW52YWxpZGF0ZShwYXJ0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX2ludmFsaWRhdGVkW3BhcnRdID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuaXMoJ3ZhbGlkJykpIHsgdGhpcy5sZWF2ZSgndmFsaWQnKTsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ludmFsaWRhdGVkKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHJlc2V0KHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24pO1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zcGVlZCA9IDA7XHJcbiAgICB0aGlzLl9jdXJyZW50ID0gcG9zaXRpb247XHJcblxyXG4gICAgdGhpcy5zdXBwcmVzcyhbQ2Fyb3VzZWxFdmVudFR5cGUuVHJhbnNsYXRlLCBDYXJvdXNlbEV2ZW50VHlwZS5UcmFuc2xhdGVkXSk7XHJcblxyXG4gICAgdGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMocG9zaXRpb24pKTtcclxuXHJcbiAgICB0aGlzLnJlbGVhc2UoW0Nhcm91c2VsRXZlbnRUeXBlLlRyYW5zbGF0ZSwgQ2Fyb3VzZWxFdmVudFR5cGUuVHJhbnNsYXRlZF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemUocG9zaXRpb246IG51bWJlciwgcmVsYXRpdmU/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLl9pdGVtcy5sZW5ndGgsXHJcbiAgICAgIG0gPSByZWxhdGl2ZSA/IDAgOiB0aGlzLl9jbG9uZXMubGVuZ3RoO1xyXG5cclxuICAgIGlmICghaXNOdW1lcmljKHBvc2l0aW9uKSB8fCBuIDwgMSkge1xyXG4gICAgICBwb3NpdGlvbiA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBuICsgbSkge1xyXG4gICAgICBwb3NpdGlvbiA9ICgocG9zaXRpb24gLSBtIC8gMikgJSBuICsgbikgJSBuICsgbSAvIDI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkdXJhdGlvbihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIGZhY3Rvcj86IG51bWJlciB8IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGZhY3RvciA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5hYnModG8gLSBmcm9tKSwgMSksIDYpICogTWF0aC5hYnMoKCsoZmFjdG9yIGFzIGFueSkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SXRlbXMoY29udGVudDogQ2Fyb3VzZWxTbGlkZURpcmVjdGl2ZVtdKSB7XHJcbiAgICB0aGlzLl9pdGVtcyA9IGNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlZmluZVNsaWRlc0RhdGEoKSB7XHJcbiAgICBsZXQgbG9hZE1hcDogTWFwPHN0cmluZywgYm9vbGVhbj47XHJcblxyXG4gICAgaWYgKHRoaXMuc2xpZGVzTW9kZWwgJiYgdGhpcy5zbGlkZXNNb2RlbC5sZW5ndGgpIHtcclxuICAgICAgbG9hZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgdGhpcy5zbGlkZXNNb2RlbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmxvYWQpIHtcclxuICAgICAgICAgIGxvYWRNYXAuc2V0KGl0ZW0uaWQsIGl0ZW0ubG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2xpZGVzTW9kZWwgPSB0aGlzLl9pdGVtcy5tYXAoc2xpZGUgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkOiBgJHtzbGlkZS5pZH1gLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICB0cGxSZWY6IHNsaWRlLnRwbFJlZixcclxuICAgICAgICBkYXRhTWVyZ2U6IHNsaWRlLmRhdGFNZXJnZSxcclxuICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICBpc0Nsb25lZDogZmFsc2UsXHJcbiAgICAgICAgbG9hZDogbG9hZE1hcCA/IGxvYWRNYXAuZ2V0KHNsaWRlLmlkKSA6IGZhbHNlLFxyXG4gICAgICAgIGNsYXNzZXM6IHt9XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3AoYTogbnVtYmVyLCBvOiBzdHJpbmcsIGI6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGw7XHJcbiAgICBzd2l0Y2ggKG8pIHtcclxuICAgICAgY2FzZSAnPCc6XHJcbiAgICAgICAgcmV0dXJuIHJ0bCA/IGEgPiBiIDogYSA8IGI7XHJcbiAgICAgIGNhc2UgJz4nOlxyXG4gICAgICAgIHJldHVybiBydGwgPyBhIDwgYiA6IGEgPiBiO1xyXG4gICAgICBjYXNlICc+PSc6XHJcbiAgICAgICAgcmV0dXJuIHJ0bCA/IGEgPD0gYiA6IGEgPj0gYjtcclxuICAgICAgY2FzZSAnPD0nOlxyXG4gICAgICAgIHJldHVybiBydGwgPyBhID49IGIgOiBhIDw9IGI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmlnZ2VyKG5hbWU6IHN0cmluZywgZGF0YT86IGFueSkge1xyXG4gICAgc3dpdGNoIChuYW1lKSB7XHJcbiAgICAgIGNhc2UgQ2Fyb3VzZWxFdmVudFR5cGUuSW5pdGlhbGl6ZWQ6XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWRDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5DaGFuZ2U6XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlU2V0dGluZ3NDYXJvdXNlbCQubmV4dChkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5DaGFuZ2VkOlxyXG4gICAgICAgIHRoaXMuX2NoYW5nZWRTZXR0aW5nc0Nhcm91c2VsJC5uZXh0KGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhcm91c2VsRXZlbnRUeXBlLlJlc2l6ZTpcclxuICAgICAgICB0aGlzLl9yZXNpemVDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5SZXNpemVkOlxyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZWRDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5SZWZyZXNoOlxyXG4gICAgICAgIHRoaXMuX3JlZnJlc2hDYXJvdXNlbCQubmV4dChuYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDYXJvdXNlbEV2ZW50VHlwZS5SZWZyZXNoZWQ6XHJcbiAgICAgICAgdGhpcy5fcmVmcmVzaGVkQ2Fyb3VzZWwkLm5leHQobmFtZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2Fyb3VzZWxFdmVudFR5cGUuVHJhbnNsYXRlOlxyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZUNhcm91c2VsJC5uZXh0KG5hbWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENhcm91c2VsRXZlbnRUeXBlLlRyYW5zbGF0ZWQ6XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlZENhcm91c2VsJC5uZXh0KG5hbWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdXBwcmVzcyhldmVudHM6IHN0cmluZ1tdKSB7XHJcbiAgICBldmVudHMuZm9yRWFjaChldmVudCA9PiB7XHJcbiAgICAgIHRoaXMuX3N1cHJlc3NbZXZlbnRdID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxlYXNlKGV2ZW50czogc3RyaW5nW10pIHtcclxuICAgIGV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHtcclxuICAgICAgZGVsZXRlIHRoaXMuX3N1cHJlc3NbZXZlbnRdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|