@seniorsistemas/angular-components 16.13.1 → 17.0.0

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 (63) hide show
  1. package/bundles/seniorsistemas-angular-components.umd.js +1733 -26
  2. package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
  3. package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
  4. package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
  5. package/components/gantt/components/gantt/arrow.d.ts +16 -0
  6. package/components/gantt/components/gantt/bar.d.ts +43 -0
  7. package/components/gantt/components/gantt/gantt-options.d.ts +2 -0
  8. package/components/gantt/components/gantt/gantt.d.ts +66 -0
  9. package/components/gantt/components/gantt/popup.d.ts +11 -0
  10. package/components/gantt/components/gantt/utils/date-utils.d.ts +13 -0
  11. package/components/gantt/components/gantt/utils/svg-utils.d.ts +11 -0
  12. package/components/gantt/components/side-table/side-table.component.d.ts +7 -0
  13. package/components/gantt/gantt.component.d.ts +21 -0
  14. package/components/gantt/gantt.module.d.ts +2 -0
  15. package/components/gantt/index.d.ts +3 -0
  16. package/components/gantt/models/index.d.ts +3 -0
  17. package/components/gantt/models/options.d.ts +21 -0
  18. package/components/gantt/models/task.d.ts +21 -0
  19. package/components/gantt/models/view-mode.d.ts +9 -0
  20. package/esm2015/components/gantt/components/gantt/arrow.js +82 -0
  21. package/esm2015/components/gantt/components/gantt/bar.js +236 -0
  22. package/esm2015/components/gantt/components/gantt/gantt-options.js +16 -0
  23. package/esm2015/components/gantt/components/gantt/gantt.js +767 -0
  24. package/esm2015/components/gantt/components/gantt/popup.js +68 -0
  25. package/esm2015/components/gantt/components/gantt/utils/date-utils.js +126 -0
  26. package/esm2015/components/gantt/components/gantt/utils/svg-utils.js +119 -0
  27. package/esm2015/components/gantt/components/side-table/side-table.component.js +26 -0
  28. package/esm2015/components/gantt/gantt.component.js +112 -0
  29. package/esm2015/components/gantt/gantt.module.js +19 -0
  30. package/esm2015/components/gantt/index.js +4 -0
  31. package/esm2015/components/gantt/models/index.js +2 -0
  32. package/esm2015/components/gantt/models/options.js +1 -0
  33. package/esm2015/components/gantt/models/task.js +1 -0
  34. package/esm2015/components/gantt/models/view-mode.js +11 -0
  35. package/esm2015/components/sidebar/sidebar.component.js +3 -3
  36. package/esm2015/public-api.js +2 -1
  37. package/esm2015/seniorsistemas-angular-components.js +25 -24
  38. package/esm5/components/gantt/components/gantt/arrow.js +81 -0
  39. package/esm5/components/gantt/components/gantt/bar.js +271 -0
  40. package/esm5/components/gantt/components/gantt/gantt-options.js +16 -0
  41. package/esm5/components/gantt/components/gantt/gantt.js +883 -0
  42. package/esm5/components/gantt/components/gantt/popup.js +59 -0
  43. package/esm5/components/gantt/components/gantt/utils/date-utils.js +134 -0
  44. package/esm5/components/gantt/components/gantt/utils/svg-utils.js +121 -0
  45. package/esm5/components/gantt/components/side-table/side-table.component.js +27 -0
  46. package/esm5/components/gantt/gantt.component.js +114 -0
  47. package/esm5/components/gantt/gantt.module.js +22 -0
  48. package/esm5/components/gantt/index.js +4 -0
  49. package/esm5/components/gantt/models/index.js +2 -0
  50. package/esm5/components/gantt/models/options.js +1 -0
  51. package/esm5/components/gantt/models/task.js +1 -0
  52. package/esm5/components/gantt/models/view-mode.js +11 -0
  53. package/esm5/components/sidebar/sidebar.component.js +3 -3
  54. package/esm5/public-api.js +2 -1
  55. package/esm5/seniorsistemas-angular-components.js +25 -24
  56. package/fesm2015/seniorsistemas-angular-components.js +1558 -4
  57. package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
  58. package/fesm5/seniorsistemas-angular-components.js +1708 -4
  59. package/fesm5/seniorsistemas-angular-components.js.map +1 -1
  60. package/package.json +1 -1
  61. package/public-api.d.ts +1 -0
  62. package/seniorsistemas-angular-components.d.ts +24 -23
  63. package/seniorsistemas-angular-components.metadata.json +1 -1
@@ -0,0 +1,16 @@
1
+ import { Gantt } from "./gantt";
2
+ import { Bar } from "./bar";
3
+ export declare class Arrow {
4
+ private _gantt;
5
+ private _fromTask;
6
+ private _toTask;
7
+ private _path;
8
+ private _element;
9
+ constructor(gantt: Gantt, fromTask: Bar, toTask: Bar);
10
+ get fromTask(): Bar;
11
+ get toTask(): Bar;
12
+ get element(): any;
13
+ update(): void;
14
+ private calculatePath;
15
+ private draw;
16
+ }
@@ -0,0 +1,43 @@
1
+ import { EnrichedTask } from "../../models/task";
2
+ import { Arrow } from "./arrow";
3
+ export declare class Bar {
4
+ private _actionCompleted;
5
+ private _gantt;
6
+ private _invalid;
7
+ private _height;
8
+ private _x;
9
+ private _y;
10
+ private _cornerRadius;
11
+ private _duration;
12
+ private _width;
13
+ private _barGroup;
14
+ private _arrows;
15
+ private _group;
16
+ private _task;
17
+ private _element;
18
+ get arrows(): Arrow[];
19
+ set arrows(arrows: Arrow[]);
20
+ get task(): EnrichedTask;
21
+ get element(): any;
22
+ get group(): any;
23
+ constructor(gantt: any, task: any);
24
+ updateBarPosition({ x, width }: any): void;
25
+ dateChanged(): void;
26
+ setActionCompleted(): void;
27
+ private _setDefaults;
28
+ private _prepare;
29
+ private _prepareValues;
30
+ private _prepareHelpers;
31
+ private _draw;
32
+ private _drawBar;
33
+ private _drawLabel;
34
+ private _bind;
35
+ private _setupClickEvent;
36
+ private _showPopup;
37
+ private _computeStartEndDate;
38
+ private _computeX;
39
+ private _computeY;
40
+ private _updateAttr;
41
+ private _updateLabelPosition;
42
+ private _updateArrowPosition;
43
+ }
@@ -0,0 +1,2 @@
1
+ import { Options } from "../../models/options";
2
+ export declare const defaultOptions: Options;
@@ -0,0 +1,66 @@
1
+ import { Bar } from "./bar";
2
+ import { Arrow } from "./arrow";
3
+ import { Options } from "../../models/options";
4
+ import { ViewMode } from "../../models/view-mode";
5
+ import { Task, EnrichedTask } from "../../models";
6
+ export declare class Gantt {
7
+ options: Options;
8
+ tasks: EnrichedTask[];
9
+ dependency_map: any;
10
+ private _minDate;
11
+ private _maxDate;
12
+ private _realMinDate;
13
+ private _realMaxDate;
14
+ dates: any;
15
+ layers: any;
16
+ bars: Bar[];
17
+ arrows: Arrow[];
18
+ bar_being_dragged: any;
19
+ $svg: any;
20
+ $container: HTMLDivElement;
21
+ popup_wrapper: HTMLDivElement;
22
+ popup: any;
23
+ get minDate(): Date;
24
+ get maxDate(): Date;
25
+ constructor(wrapper: any, tasks: Task[], options?: Options);
26
+ private setup_wrapper;
27
+ private setup_options;
28
+ setup_tasks(tasks: any): void;
29
+ private setup_dependencies;
30
+ refresh(tasks: Task[]): void;
31
+ change_view_mode(mode?: ViewMode): void;
32
+ private update_view_scale;
33
+ private setup_dates;
34
+ private setup_gantt_dates;
35
+ private setup_date_values;
36
+ private bind_events;
37
+ private render;
38
+ private setup_layers;
39
+ private make_grid;
40
+ private make_grid_background;
41
+ private make_grid_rows;
42
+ private make_grid_header;
43
+ private make_grid_ticks;
44
+ make_grid_highlights(): void;
45
+ private make_dates;
46
+ private get_dates_to_draw;
47
+ private get_date_info;
48
+ private make_bars;
49
+ private make_arrows;
50
+ private map_arrows_on_bars;
51
+ private set_width;
52
+ private set_scroll_position;
53
+ private bind_grid_click;
54
+ private bind_bar_events;
55
+ private get_all_dependent_tasks;
56
+ private get_snap_position;
57
+ unselect_all(): void;
58
+ view_is(modes: ViewMode | ViewMode[]): boolean;
59
+ private get_task;
60
+ get_bar(id: any): Bar;
61
+ show_popup(options: any): void;
62
+ private hide_popup;
63
+ trigger_event(event: string, args: any): void;
64
+ private get_oldest_starting_date;
65
+ private clear;
66
+ }
@@ -0,0 +1,11 @@
1
+ export declare class Popup {
2
+ private parent;
3
+ private customHtml;
4
+ private title;
5
+ private subtitle;
6
+ private pointer;
7
+ constructor(parent: any, customHtml: any);
8
+ show(options: any): void;
9
+ private make;
10
+ private hide;
11
+ }
@@ -0,0 +1,13 @@
1
+ export declare abstract class DateUtils {
2
+ static parse(date: Date | string): Date;
3
+ static toString(date: Date, with_time?: boolean): string;
4
+ static format(date: any, formatString?: string, lang?: string): string;
5
+ static diff(fistDate: Date, secondDate: Date, scale: string): number;
6
+ static today(): Date;
7
+ static now(): Date;
8
+ static add(date: Date, quantity: any, scale: any): Date;
9
+ static startOf(date: Date, scale: string): Date;
10
+ static clone(date: Date): Date;
11
+ static getDateValues(date: Date): number[];
12
+ static getDaysInMonth(date: Date): number;
13
+ }
@@ -0,0 +1,11 @@
1
+ export declare const $: {
2
+ (expr: any, con: any): any;
3
+ on(element: any, event: any, selector: any, callback: any): void;
4
+ off(element: any, event: any, handler: any): void;
5
+ bind(element: any, event: any, callback: any): void;
6
+ delegate(element: any, event: any, selector: any, callback: any): void;
7
+ closest(selector: any, element: any): any;
8
+ attr(element: any, attr: any, value: any): any;
9
+ };
10
+ export declare const createSVG: (tag: any, attrs: any) => any;
11
+ export declare const animateSVG: (svgElement: any, attr: any, from: any, to: any) => void;
@@ -0,0 +1,7 @@
1
+ import { TaskGroup } from '../../models/task';
2
+ export declare class SideTableComponent {
3
+ ROW_HEIGHT: number;
4
+ columnTitle: string;
5
+ tasks: TaskGroup[];
6
+ multipleTaskPerLine: boolean;
7
+ }
@@ -0,0 +1,21 @@
1
+ import { AfterViewInit, OnChanges, OnInit, EventEmitter, SimpleChanges } from "@angular/core";
2
+ import { TaskGroup, Task } from "./models/task";
3
+ import { ViewMode } from "./models/view-mode";
4
+ export declare class GanttComponent implements AfterViewInit, OnChanges, OnInit {
5
+ columnTitle: string;
6
+ multipleTaskPerLine: boolean;
7
+ showSideTable: boolean;
8
+ viewMode: ViewMode;
9
+ tasks: TaskGroup[];
10
+ marginBeforeStart?: number;
11
+ marginAfterEnd?: number;
12
+ taskClicked: EventEmitter<Task>;
13
+ taskDateChanged: EventEmitter<any>;
14
+ viewChanged: EventEmitter<ViewMode>;
15
+ private _gantt;
16
+ ngOnInit(): void;
17
+ ngAfterViewInit(): void;
18
+ ngOnChanges(changes: SimpleChanges): void;
19
+ private _filterTask;
20
+ private _validateViewMode;
21
+ }
@@ -0,0 +1,2 @@
1
+ export declare class GanttModule {
2
+ }
@@ -0,0 +1,3 @@
1
+ export { GanttComponent } from "./gantt.component";
2
+ export { GanttModule } from "./gantt.module";
3
+ export { Task, ViewMode, TaskGroup } from "./models/index";
@@ -0,0 +1,3 @@
1
+ export { Task, EnrichedTask, TaskGroup } from "./task";
2
+ export { Options } from "./options";
3
+ export { ViewMode } from "./view-mode";
@@ -0,0 +1,21 @@
1
+ import { ViewMode } from "./view-mode";
2
+ import { EnrichedTask } from "./task";
3
+ export interface Options {
4
+ headerHeight?: number;
5
+ columnWidth?: number;
6
+ step?: number;
7
+ barHeight?: number;
8
+ barCornerRadius?: number;
9
+ arrowCurve?: number;
10
+ padding?: number;
11
+ viewMode?: ViewMode;
12
+ dateFormat?: string;
13
+ customPopupHtml?: string | ((task: EnrichedTask) => string);
14
+ language?: string;
15
+ popupTrigger?: any;
16
+ marginBeforeStart?: number;
17
+ marginAfterEnd?: number;
18
+ onClick?: ((task: EnrichedTask) => void);
19
+ onDateChange?: ((task: EnrichedTask, start: Date, end: Date) => void);
20
+ onViewChange?: ((mode: ViewMode) => void);
21
+ }
@@ -0,0 +1,21 @@
1
+ export interface Task {
2
+ id: string;
3
+ name: string;
4
+ start: Date;
5
+ end: Date;
6
+ showTaskName?: boolean;
7
+ dependencies?: string[];
8
+ color?: string;
9
+ custom_class?: string;
10
+ }
11
+ export interface EnrichedTask extends Task {
12
+ _index: number;
13
+ _row_id: number;
14
+ invalid?: boolean | undefined;
15
+ }
16
+ export interface TaskGroup {
17
+ id: string;
18
+ title: string;
19
+ subtitle: string;
20
+ tasks: Task[];
21
+ }
@@ -0,0 +1,9 @@
1
+ export declare enum ViewMode {
2
+ QuarterDay = "quarterDay",
3
+ HalfDay = "halfDay",
4
+ Day = "day",
5
+ Week = "week",
6
+ Month = "month",
7
+ Year = "year",
8
+ Hour = "hour"
9
+ }
@@ -0,0 +1,82 @@
1
+ import { createSVG } from './utils/svg-utils';
2
+ export class Arrow {
3
+ constructor(gantt, fromTask, toTask) {
4
+ this._gantt = gantt;
5
+ this._fromTask = fromTask;
6
+ this._toTask = toTask;
7
+ this.calculatePath();
8
+ this.draw();
9
+ }
10
+ get fromTask() {
11
+ return this._fromTask;
12
+ }
13
+ get toTask() {
14
+ return this._toTask;
15
+ }
16
+ get element() {
17
+ return this._element;
18
+ }
19
+ update() {
20
+ this.calculatePath();
21
+ this._element.setAttribute("d", this._path);
22
+ }
23
+ calculatePath() {
24
+ let startX = this.fromTask.element.getX() + this.fromTask.element.getWidth() / 2;
25
+ const condition = () => this.toTask.element.getX() < startX + this._gantt.options.padding &&
26
+ startX > this.fromTask.element.getX() + this._gantt.options.padding;
27
+ while (condition()) {
28
+ startX -= 10;
29
+ }
30
+ const startY = this._gantt.options.headerHeight +
31
+ this._gantt.options.barHeight +
32
+ (this._gantt.options.padding + this._gantt.options.barHeight) *
33
+ this.fromTask.task._index +
34
+ this._gantt.options.padding;
35
+ const endX = this.toTask.element.getX() - this._gantt.options.padding / 2;
36
+ const endY = this._gantt.options.headerHeight +
37
+ this._gantt.options.barHeight / 2 +
38
+ (this._gantt.options.padding + this._gantt.options.barHeight) *
39
+ this.toTask.task._index +
40
+ this._gantt.options.padding;
41
+ const fromIsBelowTo = this.fromTask.task._index > this.toTask.task._index;
42
+ const curve = this._gantt.options.arrowCurve;
43
+ const clockwise = fromIsBelowTo ? 1 : 0;
44
+ const curveY = fromIsBelowTo ? -curve : curve;
45
+ const offset = fromIsBelowTo
46
+ ? endY + this._gantt.options.arrowCurve
47
+ : endY - this._gantt.options.arrowCurve;
48
+ this._path = `
49
+ M ${startX} ${startY}
50
+ V ${offset}
51
+ a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curveY}
52
+ L ${endX} ${endY}
53
+ m -5 -5
54
+ l 5 5
55
+ l -5 5`;
56
+ if (this.toTask.element.getX() < this.fromTask.element.getX() + this._gantt.options.padding) {
57
+ const down1 = this._gantt.options.padding / 2 - curve;
58
+ const down2 = this.toTask.element.getY() + this.toTask.element.getHeight() / 2 - curveY;
59
+ const left = this.toTask.element.getX() - this._gantt.options.padding;
60
+ this._path = `
61
+ M ${startX} ${startY}
62
+ v ${down1}
63
+ a ${curve} ${curve} 0 0 1 -${curve} ${curve}
64
+ H ${left}
65
+ a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curveY}
66
+ V ${down2}
67
+ a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curveY}
68
+ L ${endX} ${endY}
69
+ m -5 -5
70
+ l 5 5
71
+ l -5 5`;
72
+ }
73
+ }
74
+ draw() {
75
+ this._element = createSVG("path", {
76
+ d: this._path,
77
+ "data-from": this.fromTask.task.id,
78
+ "data-to": this.toTask.task.id,
79
+ });
80
+ }
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3cuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2Fycm93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5QyxNQUFNLE9BQU8sS0FBSztJQU9kLFlBQVksS0FBWSxFQUFFLFFBQWEsRUFBRSxNQUFXO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sYUFBYTtRQUNqQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFakYsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLENB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QUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN4RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFFdEUsSUFBSSxDQUFDLEtBQUssR0FBRztvQkFDTCxNQUFNLElBQUksTUFBTTtvQkFDaEIsS0FBSztvQkFDTCxLQUFLLElBQUksS0FBSyxXQUFXLEtBQUssSUFBSSxLQUFLO29CQUN2QyxJQUFJO29CQUNKLEtBQUssSUFBSSxLQUFLLFFBQVEsU0FBUyxLQUFLLEtBQUssSUFBSSxNQUFNO29CQUNuRCxLQUFLO29CQUNMLEtBQUssSUFBSSxLQUFLLFFBQVEsU0FBUyxJQUFJLEtBQUssSUFBSSxNQUFNO29CQUNsRCxJQUFJLElBQUksSUFBSTs7O3VCQUdULENBQUM7U0FDZjtJQUNMLENBQUM7SUFFTyxJQUFJO1FBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzlCLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSztZQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNWRyB9IGZyb20gJy4vdXRpbHMvc3ZnLXV0aWxzJztcbmltcG9ydCB7IEdhbnR0IH0gZnJvbSBcIi4vZ2FudHRcIjtcbmltcG9ydCB7IEJhciB9IGZyb20gXCIuL2JhclwiO1xuXG5leHBvcnQgY2xhc3MgQXJyb3cge1xuICAgIHByaXZhdGUgX2dhbnR0OiBHYW50dDtcbiAgICBwcml2YXRlIF9mcm9tVGFzazogQmFyO1xuICAgIHByaXZhdGUgX3RvVGFzazogQmFyO1xuICAgIHByaXZhdGUgX3BhdGg6IGFueTtcbiAgICBwcml2YXRlIF9lbGVtZW50OiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihnYW50dDogR2FudHQsIGZyb21UYXNrOiBCYXIsIHRvVGFzazogQmFyKSB7XG4gICAgICAgIHRoaXMuX2dhbnR0ID0gZ2FudHQ7XG4gICAgICAgIHRoaXMuX2Zyb21UYXNrID0gZnJvbVRhc2s7XG4gICAgICAgIHRoaXMuX3RvVGFzayA9IHRvVGFzaztcblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhdGgoKTtcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmcm9tVGFzaygpOiBCYXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJvbVRhc2s7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b1Rhc2soKTogQmFyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvVGFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUGF0aCgpO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRcIiwgdGhpcy5fcGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVQYXRoKCkge1xuICAgICAgICBsZXQgc3RhcnRYID0gdGhpcy5mcm9tVGFzay5lbGVtZW50LmdldFgoKSArIHRoaXMuZnJvbVRhc2suZWxlbWVudC5nZXRXaWR0aCgpIC8gMjtcblxuICAgICAgICBjb25zdCBjb25kaXRpb24gPSAoKSA9PlxuICAgICAgICAgICAgdGhpcy50b1Rhc2suZWxlbWVudC5nZXRYKCkgPCBzdGFydFggKyB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgJiZcbiAgICAgICAgICAgIHN0YXJ0WCA+IHRoaXMuZnJvbVRhc2suZWxlbWVudC5nZXRYKCkgKyB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmc7XG5cbiAgICAgICAgd2hpbGUgKGNvbmRpdGlvbigpKSB7XG4gICAgICAgICAgICBzdGFydFggLT0gMTA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydFkgPSB0aGlzLl9nYW50dC5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLmJhckhlaWdodCArXG4gICAgICAgICAgICAodGhpcy5fZ2FudHQub3B0aW9ucy5wYWRkaW5nICsgdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJIZWlnaHQpICpcbiAgICAgICAgICAgIHRoaXMuZnJvbVRhc2sudGFzay5faW5kZXggK1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICBjb25zdCBlbmRYID0gdGhpcy50b1Rhc2suZWxlbWVudC5nZXRYKCkgLSB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgLyAyO1xuICAgICAgICBjb25zdCBlbmRZID0gdGhpcy5fZ2FudHQub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJIZWlnaHQgLyAyICtcbiAgICAgICAgICAgICh0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgKyB0aGlzLl9nYW50dC5vcHRpb25zLmJhckhlaWdodCkgKlxuICAgICAgICAgICAgdGhpcy50b1Rhc2sudGFzay5faW5kZXggK1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICBjb25zdCBmcm9tSXNCZWxvd1RvID0gdGhpcy5mcm9tVGFzay50YXNrLl9pbmRleCA+IHRoaXMudG9UYXNrLnRhc2suX2luZGV4O1xuICAgICAgICBjb25zdCBjdXJ2ZSA9IHRoaXMuX2dhbnR0Lm9wdGlvbnMuYXJyb3dDdXJ2ZTtcbiAgICAgICAgY29uc3QgY2xvY2t3aXNlID0gZnJvbUlzQmVsb3dUbyA/IDEgOiAwO1xuICAgICAgICBjb25zdCBjdXJ2ZVkgPSBmcm9tSXNCZWxvd1RvID8gLWN1cnZlIDogY3VydmU7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGZyb21Jc0JlbG93VG9cbiAgICAgICAgICAgID8gZW5kWSArIHRoaXMuX2dhbnR0Lm9wdGlvbnMuYXJyb3dDdXJ2ZVxuICAgICAgICAgICAgOiBlbmRZIC0gdGhpcy5fZ2FudHQub3B0aW9ucy5hcnJvd0N1cnZlO1xuXG4gICAgICAgIHRoaXMuX3BhdGggPSBgXG4gICAgICAgICAgICBNICR7c3RhcnRYfSAke3N0YXJ0WX1cbiAgICAgICAgICAgIFYgJHtvZmZzZXR9XG4gICAgICAgICAgICBhICR7Y3VydmV9ICR7Y3VydmV9IDAgMCAke2Nsb2Nrd2lzZX0gJHtjdXJ2ZX0gJHtjdXJ2ZVl9XG4gICAgICAgICAgICBMICR7ZW5kWH0gJHtlbmRZfVxuICAgICAgICAgICAgbSAtNSAtNVxuICAgICAgICAgICAgbCA1IDVcbiAgICAgICAgICAgIGwgLTUgNWA7XG5cbiAgICAgICAgaWYgKHRoaXMudG9UYXNrLmVsZW1lbnQuZ2V0WCgpIDwgdGhpcy5mcm9tVGFzay5lbGVtZW50LmdldFgoKSArIHRoaXMuX2dhbnR0Lm9wdGlvbnMucGFkZGluZykge1xuICAgICAgICAgICAgY29uc3QgZG93bjEgPSB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgLyAyIC0gY3VydmU7XG4gICAgICAgICAgICBjb25zdCBkb3duMiA9IHRoaXMudG9UYXNrLmVsZW1lbnQuZ2V0WSgpICsgdGhpcy50b1Rhc2suZWxlbWVudC5nZXRIZWlnaHQoKSAvIDIgLSBjdXJ2ZVk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy50b1Rhc2suZWxlbWVudC5nZXRYKCkgLSB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmc7XG5cbiAgICAgICAgICAgIHRoaXMuX3BhdGggPSBgXG4gICAgICAgICAgICAgICAgTSAke3N0YXJ0WH0gJHtzdGFydFl9XG4gICAgICAgICAgICAgICAgdiAke2Rvd24xfVxuICAgICAgICAgICAgICAgIGEgJHtjdXJ2ZX0gJHtjdXJ2ZX0gMCAwIDEgLSR7Y3VydmV9ICR7Y3VydmV9XG4gICAgICAgICAgICAgICAgSCAke2xlZnR9XG4gICAgICAgICAgICAgICAgYSAke2N1cnZlfSAke2N1cnZlfSAwIDAgJHtjbG9ja3dpc2V9IC0ke2N1cnZlfSAke2N1cnZlWX1cbiAgICAgICAgICAgICAgICBWICR7ZG93bjJ9XG4gICAgICAgICAgICAgICAgYSAke2N1cnZlfSAke2N1cnZlfSAwIDAgJHtjbG9ja3dpc2V9ICR7Y3VydmV9ICR7Y3VydmVZfVxuICAgICAgICAgICAgICAgIEwgJHtlbmRYfSAke2VuZFl9XG4gICAgICAgICAgICAgICAgbSAtNSAtNVxuICAgICAgICAgICAgICAgIGwgNSA1XG4gICAgICAgICAgICAgICAgbCAtNSA1YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZHJhdygpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgZDogdGhpcy5fcGF0aCxcbiAgICAgICAgICAgIFwiZGF0YS1mcm9tXCI6IHRoaXMuZnJvbVRhc2sudGFzay5pZCxcbiAgICAgICAgICAgIFwiZGF0YS10b1wiOiB0aGlzLnRvVGFzay50YXNrLmlkLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,236 @@
1
+ import { DateUtils } from './utils/date-utils';
2
+ import { $, createSVG, animateSVG } from './utils/svg-utils';
3
+ import { ViewMode } from "../../models/view-mode";
4
+ export class Bar {
5
+ constructor(gantt, task) {
6
+ this._setDefaults(gantt, task);
7
+ this._prepare();
8
+ this._draw();
9
+ this._bind();
10
+ }
11
+ get arrows() {
12
+ return this._arrows;
13
+ }
14
+ set arrows(arrows) {
15
+ this._arrows = arrows;
16
+ }
17
+ get task() {
18
+ return this._task;
19
+ }
20
+ get element() {
21
+ return this._element;
22
+ }
23
+ get group() {
24
+ return this._group;
25
+ }
26
+ updateBarPosition({ x, width }) {
27
+ const bar = this.element;
28
+ if (x) {
29
+ // get all x values of parent task
30
+ const xs = this.task.dependencies.map((dep) => {
31
+ return this._gantt.get_bar(dep).element.getX();
32
+ });
33
+ // child task must not go before parent
34
+ const valid_x = xs.reduce((prev, curr) => {
35
+ return x >= curr;
36
+ }, x);
37
+ if (!valid_x) {
38
+ width = null;
39
+ return;
40
+ }
41
+ this._updateAttr(bar, "x", x);
42
+ }
43
+ if (width && width >= this._gantt.options.columnWidth) {
44
+ this._updateAttr(bar, "width", width);
45
+ }
46
+ this._updateLabelPosition();
47
+ this._updateArrowPosition();
48
+ }
49
+ dateChanged() {
50
+ let changed = false;
51
+ const { newStartDate, newEndDate } = this._computeStartEndDate();
52
+ if (this.task.start !== newStartDate) {
53
+ changed = true;
54
+ this.task.start = newStartDate;
55
+ }
56
+ if (this.task.end !== newEndDate) {
57
+ changed = true;
58
+ this.task.end = newEndDate;
59
+ }
60
+ if (changed) {
61
+ this._gantt.trigger_event("onDateChange", [
62
+ this.task,
63
+ newStartDate,
64
+ DateUtils.add(newEndDate, -1, "second"),
65
+ ]);
66
+ }
67
+ ;
68
+ }
69
+ setActionCompleted() {
70
+ this._actionCompleted = true;
71
+ setTimeout(() => {
72
+ this._actionCompleted = false;
73
+ }, 1000);
74
+ }
75
+ _setDefaults(gantt, task) {
76
+ this._actionCompleted = false;
77
+ this._gantt = gantt;
78
+ this._task = task;
79
+ }
80
+ _prepare() {
81
+ this._prepareValues();
82
+ this._prepareHelpers();
83
+ }
84
+ _prepareValues() {
85
+ this._invalid = this.task.invalid;
86
+ this._height = this._gantt.options.barHeight;
87
+ this._x = this._computeX();
88
+ this._y = this._computeY();
89
+ this._cornerRadius = this._gantt.options.barCornerRadius;
90
+ this._duration = DateUtils.diff(this.task.end, this.task.start, "minute") / this._gantt.options.step / 60.0;
91
+ this._width = this._gantt.options.columnWidth * this._duration;
92
+ this._group = createSVG("g", {
93
+ class: "bar-wrapper " + (this.task.custom_class || ""),
94
+ "data-id": this.task.id,
95
+ });
96
+ this._barGroup = createSVG("g", {
97
+ class: "bar-group",
98
+ append_to: this.group,
99
+ });
100
+ }
101
+ _prepareHelpers() {
102
+ SVGElement.prototype.getX = function () {
103
+ return +this.getAttribute("x");
104
+ };
105
+ SVGElement.prototype.getY = function () {
106
+ return +this.getAttribute("y");
107
+ };
108
+ SVGElement.prototype.getWidth = function () {
109
+ return +this.getAttribute("width");
110
+ };
111
+ SVGElement.prototype.getHeight = function () {
112
+ return +this.getAttribute("height");
113
+ };
114
+ SVGElement.prototype.getEndX = function () {
115
+ return this.getX() + this.getWidth();
116
+ };
117
+ }
118
+ _draw() {
119
+ this._drawBar();
120
+ this._drawLabel();
121
+ }
122
+ _drawBar() {
123
+ this._element = createSVG("rect", {
124
+ x: this._x,
125
+ y: this._y,
126
+ width: this._width,
127
+ height: this._height,
128
+ rx: this._cornerRadius,
129
+ ry: this._cornerRadius,
130
+ class: "bar",
131
+ append_to: this._barGroup,
132
+ fill: this.task.color,
133
+ });
134
+ animateSVG(this.element, "width", 0, this._width);
135
+ if (this._invalid) {
136
+ this.element.classList.add("bar-invalid");
137
+ }
138
+ }
139
+ _drawLabel() {
140
+ createSVG("text", {
141
+ x: this._x + this._width / 2,
142
+ y: this._y + this._height / 2,
143
+ innerHTML: this.task.showTaskName ? this.task.name : "",
144
+ class: "bar-label",
145
+ append_to: this._barGroup,
146
+ });
147
+ // labels get BBox in the next tick
148
+ requestAnimationFrame(() => this._updateLabelPosition());
149
+ }
150
+ _bind() {
151
+ if (!this._invalid) {
152
+ this._setupClickEvent();
153
+ }
154
+ }
155
+ _setupClickEvent() {
156
+ $.on(this.group, "focus " + this._gantt.options.popupTrigger, (e) => {
157
+ // just finished a move action, wait for a few seconds
158
+ if (!this._actionCompleted) {
159
+ this._showPopup();
160
+ this._gantt.unselect_all();
161
+ this.group.classList.add("active");
162
+ }
163
+ }, null);
164
+ $.on(this.group, "dblclick", (e) => {
165
+ // just finished a move action, wait for a few seconds
166
+ if (!this._actionCompleted) {
167
+ this._gantt.trigger_event("onClick", [this.task]);
168
+ }
169
+ }, null);
170
+ }
171
+ _showPopup() {
172
+ if (this._gantt.bar_being_dragged) {
173
+ return;
174
+ }
175
+ const formatString = this._gantt.view_is(ViewMode.Hour)
176
+ ? "HH:ss"
177
+ : "MMM D";
178
+ const start_date = DateUtils.format(this.task.start, formatString, this._gantt.options.language);
179
+ const end_date = DateUtils.format(DateUtils.add(this.task.end, -1, "second"), formatString, this._gantt.options.language);
180
+ const subtitle = start_date + " - " + end_date;
181
+ this._gantt.show_popup({
182
+ target_element: this.element,
183
+ title: this.task.name,
184
+ subtitle: subtitle,
185
+ task: this.task,
186
+ });
187
+ }
188
+ _computeStartEndDate() {
189
+ const bar = this.element;
190
+ const xInUnits = bar.getX() / this._gantt.options.columnWidth;
191
+ const newStartDate = DateUtils.add(this._gantt.minDate, xInUnits * this._gantt.options.step, "hour");
192
+ const width_in_units = bar.getWidth() / this._gantt.options.columnWidth;
193
+ const newEndDate = DateUtils.add(newStartDate, width_in_units * this._gantt.options.step, "hour");
194
+ return { newStartDate, newEndDate };
195
+ }
196
+ _computeX() {
197
+ const { step, columnWidth } = this._gantt.options;
198
+ const diff = DateUtils.diff(this.task.start, this._gantt.minDate, "hour");
199
+ let x = (diff / step) * columnWidth;
200
+ if (this._gantt.view_is(ViewMode.Month)) {
201
+ const diff = DateUtils.diff(this.task.start, this._gantt.minDate, "day");
202
+ x = (diff * columnWidth) / 30;
203
+ }
204
+ return x;
205
+ }
206
+ _computeY() {
207
+ return (this._gantt.options.headerHeight +
208
+ this._gantt.options.padding +
209
+ this.task._index * (this._height + this._gantt.options.padding));
210
+ }
211
+ _updateAttr(element, attr, value) {
212
+ value = +value;
213
+ if (!isNaN(value)) {
214
+ element.setAttribute(attr, value);
215
+ }
216
+ return element;
217
+ }
218
+ _updateLabelPosition() {
219
+ const bar = this.element, label = this.group.querySelector(".bar-label");
220
+ if (label.getBBox().width > bar.getWidth()) {
221
+ label.classList.add("big");
222
+ label.setAttribute("x", bar.getX() + bar.getWidth() + 5);
223
+ }
224
+ else {
225
+ label.classList.remove("big");
226
+ label.setAttribute("x", bar.getX() + bar.getWidth() / 2);
227
+ }
228
+ }
229
+ _updateArrowPosition() {
230
+ this._arrows = this._arrows || [];
231
+ for (let arrow of this._arrows) {
232
+ arrow.update();
233
+ }
234
+ }
235
+ }
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvZ2FudHQvY29tcG9uZW50cy9nYW50dC9iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1sRCxNQUFNLE9BQU8sR0FBRztJQXFDWixZQUFZLEtBQVUsRUFBRSxJQUFTO1FBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQXpCRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLE1BQWU7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQVNNLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBTztRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3pCLElB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QUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUQ7YUFBTTtZQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzVCLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNsQjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gJy4vdXRpbHMvZGF0ZS11dGlscyc7XG5pbXBvcnQgeyAkLCBjcmVhdGVTVkcsIGFuaW1hdGVTVkcgfSBmcm9tICcuL3V0aWxzL3N2Zy11dGlscyc7XG5pbXBvcnQgeyBWaWV3TW9kZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvdmlldy1tb2RlXCI7XG5cbmltcG9ydCB7IEdhbnR0IH0gZnJvbSBcIi4vZ2FudHRcIjtcbmltcG9ydCB7IEVucmljaGVkVGFzayB9IGZyb20gXCIuLi8uLi9tb2RlbHMvdGFza1wiO1xuaW1wb3J0IHsgQXJyb3cgfSBmcm9tIFwiLi9hcnJvd1wiO1xuXG5leHBvcnQgY2xhc3MgQmFyIHtcbiAgICBwcml2YXRlIF9hY3Rpb25Db21wbGV0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZ2FudHQ6IEdhbnR0O1xuICAgIHByaXZhdGUgX2ludmFsaWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3k6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jb3JuZXJSYWRpdXM6IG51bWJlcjtcbiAgICBwcml2YXRlIF9kdXJhdGlvbjogbnVtYmVyO1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfYmFyR3JvdXA6IGFueTtcblxuICAgIHByaXZhdGUgX2Fycm93czogQXJyb3dbXTtcbiAgICBwcml2YXRlIF9ncm91cDogYW55O1xuICAgIHByaXZhdGUgX3Rhc2s6IEVucmljaGVkVGFzaztcbiAgICBwcml2YXRlIF9lbGVtZW50OiBhbnk7XG5cbiAgICBwdWJsaWMgZ2V0IGFycm93cygpOiBBcnJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fycm93cztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFycm93cyhhcnJvd3M6IEFycm93W10pIHtcbiAgICAgICAgdGhpcy5fYXJyb3dzID0gYXJyb3dzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFzaygpOiBFbnJpY2hlZFRhc2sge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihnYW50dDogYW55LCB0YXNrOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdHMoZ2FudHQsIHRhc2spO1xuICAgICAgICB0aGlzLl9wcmVwYXJlKCk7XG4gICAgICAgIHRoaXMuX2RyYXcoKTtcbiAgICAgICAgdGhpcy5fYmluZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVCYXJQb3NpdGlvbih7IHgsIHdpZHRoIH06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBiYXIgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAvLyBnZXQgYWxsIHggdmFsdWVzIG9mIHBhcmVudCB0YXNrXG4gICAgICAgICAgICBjb25zdCB4cyA9IHRoaXMudGFzay5kZXBlbmRlbmNpZXMubWFwKChkZXA6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nYW50dC5nZXRfYmFyKGRlcCkuZWxlbWVudC5nZXRYKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNoaWxkIHRhc2sgbXVzdCBub3QgZ28gYmVmb3JlIHBhcmVudFxuICAgICAgICAgICAgY29uc3QgdmFsaWRfeCA9IHhzLnJlZHVjZSgocHJldjogYW55LCBjdXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geCA+PSBjdXJyO1xuICAgICAgICAgICAgfSwgeCk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkX3gpIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXR0cihiYXIsIFwieFwiLCB4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkdGggJiYgd2lkdGggPj0gdGhpcy5fZ2FudHQub3B0aW9ucy5jb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXR0cihiYXIsIFwid2lkdGhcIiwgd2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxhYmVsUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQXJyb3dQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkYXRlQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgeyBuZXdTdGFydERhdGUsIG5ld0VuZERhdGUgfSA9IHRoaXMuX2NvbXB1dGVTdGFydEVuZERhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy50YXNrLnN0YXJ0ICE9PSBuZXdTdGFydERhdGUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50YXNrLnN0YXJ0ID0gbmV3U3RhcnREYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudGFzay5lbmQgIT09IG5ld0VuZERhdGUpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50YXNrLmVuZCA9IG5ld0VuZERhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fZ2FudHQudHJpZ2dlcl9ldmVudChcIm9uRGF0ZUNoYW5nZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrLFxuICAgICAgICAgICAgICAgIG5ld1N0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICBEYXRlVXRpbHMuYWRkKG5ld0VuZERhdGUsIC0xLCBcInNlY29uZFwiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBY3Rpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2FjdGlvbkNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldERlZmF1bHRzKGdhbnR0OiBhbnksIHRhc2s6IGFueSkge1xuICAgICAgICB0aGlzLl9hY3Rpb25Db21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZ2FudHQgPSBnYW50dDtcbiAgICAgICAgdGhpcy5fdGFzayA9IHRhc2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZSgpIHtcbiAgICAgICAgdGhpcy5fcHJlcGFyZVZhbHVlcygpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlSGVscGVycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVWYWx1ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ludmFsaWQgPSB0aGlzLnRhc2suaW52YWxpZDtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJIZWlnaHQ7XG4gICAgICAgIHRoaXMuX3ggPSB0aGlzLl9jb21wdXRlWCgpO1xuICAgICAgICB0aGlzLl95ID0gdGhpcy5fY29tcHV0ZVkoKTtcbiAgICAgICAgdGhpcy5fY29ybmVyUmFkaXVzID0gdGhpcy5fZ2FudHQub3B0aW9ucy5iYXJDb3JuZXJSYWRpdXM7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gRGF0ZVV0aWxzLmRpZmYodGhpcy50YXNrLmVuZCwgdGhpcy50YXNrLnN0YXJ0LCBcIm1pbnV0ZVwiKSAvIHRoaXMuX2dhbnR0Lm9wdGlvbnMuc3RlcCAvIDYwLjA7XG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5fZ2FudHQub3B0aW9ucy5jb2x1bW5XaWR0aCAqIHRoaXMuX2R1cmF0aW9uO1xuICAgICAgICB0aGlzLl9ncm91cCA9IGNyZWF0ZVNWRyhcImdcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFwiYmFyLXdyYXBwZXIgXCIgKyAodGhpcy50YXNrLmN1c3RvbV9jbGFzcyB8fCBcIlwiKSxcbiAgICAgICAgICAgIFwiZGF0YS1pZFwiOiB0aGlzLnRhc2suaWQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9iYXJHcm91cCA9IGNyZWF0ZVNWRyhcImdcIiwge1xuICAgICAgICAgICAgY2xhc3M6IFwiYmFyLWdyb3VwXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuZ3JvdXAsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVIZWxwZXJzKCk6IHZvaWQge1xuICAgICAgICAoU1ZHRWxlbWVudC5wcm90b3R5cGUgYXMgYW55KS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICt0aGlzLmdldEF0dHJpYnV0ZShcInhcIik7XG4gICAgICAgIH07XG4gICAgICAgIChTVkdFbGVtZW50LnByb3RvdHlwZSBhcyBhbnkpLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuZ2V0QXR0cmlidXRlKFwieVwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgKFNWR0VsZW1lbnQucHJvdG90eXBlIGFzIGFueSkuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMuZ2V0QXR0cmlidXRlKFwid2lkdGhcIik7XG4gICAgICAgIH07XG4gICAgICAgIChTVkdFbGVtZW50LnByb3RvdHlwZSBhcyBhbnkpLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiArdGhpcy5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIik7XG4gICAgICAgIH07XG4gICAgICAgIChTVkdFbGVtZW50LnByb3RvdHlwZSBhcyBhbnkpLmdldEVuZFggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLmdldFdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJhdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZHJhd0JhcigpO1xuICAgICAgICB0aGlzLl9kcmF3TGFiZWwoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kcmF3QmFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICB4OiB0aGlzLl94LFxuICAgICAgICAgICAgeTogdGhpcy5feSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5faGVpZ2h0LFxuICAgICAgICAgICAgcng6IHRoaXMuX2Nvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIHJ5OiB0aGlzLl9jb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjbGFzczogXCJiYXJcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5fYmFyR3JvdXAsXG4gICAgICAgICAgICBmaWxsOiB0aGlzLnRhc2suY29sb3IsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFuaW1hdGVTVkcodGhpcy5lbGVtZW50LCBcIndpZHRoXCIsIDAsIHRoaXMuX3dpZHRoKTtcblxuICAgICAgICBpZiAodGhpcy5faW52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJiYXItaW52YWxpZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2RyYXdMYWJlbCgpOiB2b2lkIHtcbiAgICAgICAgY3JlYXRlU1ZHKFwidGV4dFwiLCB7XG4gICAgICAgICAgICB4OiB0aGlzLl94ICsgdGhpcy5fd2lkdGggLyAyLFxuICAgICAgICAgICAgeTogdGhpcy5feSArIHRoaXMuX2hlaWdodCAvIDIsXG4gICAgICAgICAgICBpbm5lckhUTUw6IHRoaXMudGFzay5zaG93VGFza05hbWUgPyB0aGlzLnRhc2submFtZSA6IFwiXCIsXG4gICAgICAgICAgICBjbGFzczogXCJiYXItbGFiZWxcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5fYmFyR3JvdXAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBsYWJlbHMgZ2V0IEJCb3ggaW4gdGhlIG5leHQgdGlja1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fdXBkYXRlTGFiZWxQb3NpdGlvbigpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9iaW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2ludmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwQ2xpY2tFdmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0dXBDbGlja0V2ZW50KCk6IHZvaWQge1xuICAgICAgICAkLm9uKHRoaXMuZ3JvdXAsIFwiZm9jdXMgXCIgKyB0aGlzLl9nYW50dC5vcHRpb25zLnBvcHVwVHJpZ2dlciwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8ganVzdCBmaW5pc2hlZCBhIG1vdmUgYWN0aW9uLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FjdGlvbkNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dQb3B1cCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dhbnR0LnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbnVsbCk7XG5cbiAgICAgICAgJC5vbih0aGlzLmdyb3VwLCBcImRibGNsaWNrXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIGp1c3QgZmluaXNoZWQgYSBtb3ZlIGFjdGlvbiwgd2FpdCBmb3IgYSBmZXcgc2Vjb25kc1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FjdGlvbkNvbXBsZXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dhbnR0LnRyaWdnZXJfZXZlbnQoXCJvbkNsaWNrXCIsIFt0aGlzLnRhc2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd1BvcHVwKCkge1xuICAgICAgICBpZiAodGhpcy5fZ2FudHQuYmFyX2JlaW5nX2RyYWdnZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdFN0cmluZyA9IHRoaXMuX2dhbnR0LnZpZXdfaXMoVmlld01vZGUuSG91cilcbiAgICAgICAgICAgID8gXCJISDpzc1wiXG4gICAgICAgICAgICA6IFwiTU1NIERcIjtcblxuICAgICAgICBjb25zdCBzdGFydF9kYXRlID0gRGF0ZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgIHRoaXMudGFzay5zdGFydCxcbiAgICAgICAgICAgIGZvcm1hdFN0cmluZyxcbiAgICAgICAgICAgIHRoaXMuX2dhbnR0Lm9wdGlvbnMubGFuZ3VhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZW5kX2RhdGUgPSBEYXRlVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgRGF0ZVV0aWxzLmFkZCh0aGlzLnRhc2suZW5kLCAtMSwgXCJzZWNvbmRcIiksXG4gICAgICAgICAgICBmb3JtYXRTdHJpbmcsXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLmxhbmd1YWdlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN1YnRpdGxlID0gc3RhcnRfZGF0ZSArIFwiIC0gXCIgKyBlbmRfZGF0ZTtcblxuICAgICAgICB0aGlzLl9nYW50dC5zaG93X3BvcHVwKHtcbiAgICAgICAgICAgIHRhcmdldF9lbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50YXNrLm5hbWUsXG4gICAgICAgICAgICBzdWJ0aXRsZTogc3VidGl0bGUsXG4gICAgICAgICAgICB0YXNrOiB0aGlzLnRhc2ssXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbXB1dGVTdGFydEVuZERhdGUoKTogeyBuZXdTdGFydERhdGU6IERhdGUsIG5ld0VuZERhdGU6IERhdGUgfSB7XG4gICAgICAgIGNvbnN0IGJhciA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgY29uc3QgeEluVW5pdHMgPSBiYXIuZ2V0WCgpIC8gdGhpcy5fZ2FudHQub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgbmV3U3RhcnREYXRlID0gRGF0ZVV0aWxzLmFkZChcbiAgICAgICAgICAgIHRoaXMuX2dhbnR0Lm1pbkRhdGUsXG4gICAgICAgICAgICB4SW5Vbml0cyAqIHRoaXMuX2dhbnR0Lm9wdGlvbnMuc3RlcCxcbiAgICAgICAgICAgIFwiaG91clwiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoX2luX3VuaXRzID0gYmFyLmdldFdpZHRoKCkgLyB0aGlzLl9nYW50dC5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBuZXdFbmREYXRlID0gRGF0ZVV0aWxzLmFkZChcbiAgICAgICAgICAgIG5ld1N0YXJ0RGF0ZSxcbiAgICAgICAgICAgIHdpZHRoX2luX3VuaXRzICogdGhpcy5fZ2FudHQub3B0aW9ucy5zdGVwLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyBuZXdTdGFydERhdGUsIG5ld0VuZERhdGUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wdXRlWCgpIHtcbiAgICAgICAgY29uc3QgeyBzdGVwLCBjb2x1bW5XaWR0aCB9ID0gdGhpcy5fZ2FudHQub3B0aW9ucztcbiAgICAgICAgY29uc3QgZGlmZiA9IERhdGVVdGlscy5kaWZmKHRoaXMudGFzay5zdGFydCwgdGhpcy5fZ2FudHQubWluRGF0ZSwgXCJob3VyXCIpO1xuICAgICAgICBsZXQgeCA9IChkaWZmIC8gc3RlcCkgKiBjb2x1bW5XaWR0aDtcblxuICAgICAgICBpZiAodGhpcy5fZ2FudHQudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBEYXRlVXRpbHMuZGlmZih0aGlzLnRhc2suc3RhcnQsIHRoaXMuX2dhbnR0Lm1pbkRhdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgeCA9IChkaWZmICogY29sdW1uV2lkdGgpIC8gMzA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29tcHV0ZVkoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcgK1xuICAgICAgICAgICAgdGhpcy50YXNrLl9pbmRleCAqICh0aGlzLl9oZWlnaHQgKyB0aGlzLl9nYW50dC5vcHRpb25zLnBhZGRpbmcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXR0cihlbGVtZW50OiBhbnksIGF0dHI6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91cGRhdGVMYWJlbFBvc2l0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBiYXIgPSB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICBsYWJlbCA9IHRoaXMuZ3JvdXAucXVlcnlTZWxlY3RvcihcIi5iYXItbGFiZWxcIik7XG5cbiAgICAgICAgaWYgKGxhYmVsLmdldEJCb3goKS53aWR0aCA+IGJhci5nZXRXaWR0aCgpKSB7XG4gICAgICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwiYmlnXCIpO1xuICAgICAgICAgICAgbGFiZWwuc2V0QXR0cmlidXRlKFwieFwiLCBiYXIuZ2V0WCgpICsgYmFyLmdldFdpZHRoKCkgKyA1KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoXCJiaWdcIik7XG4gICAgICAgICAgICBsYWJlbC5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGJhci5nZXRYKCkgKyBiYXIuZ2V0V2lkdGgoKSAvIDIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXJyb3dQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXJyb3dzID0gdGhpcy5fYXJyb3dzIHx8IFtdO1xuICAgICAgICBmb3IgKGxldCBhcnJvdyBvZiB0aGlzLl9hcnJvd3MpIHtcbiAgICAgICAgICAgIGFycm93LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19