@seniorsistemas/angular-components 16.13.2 → 17.1.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 (70) hide show
  1. package/bundles/seniorsistemas-angular-components.umd.js +1829 -24
  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/components/switch/index.d.ts +2 -0
  21. package/components/switch/switch.component.d.ts +21 -0
  22. package/components/switch/switch.module.d.ts +2 -0
  23. package/esm2015/components/gantt/components/gantt/arrow.js +82 -0
  24. package/esm2015/components/gantt/components/gantt/bar.js +236 -0
  25. package/esm2015/components/gantt/components/gantt/gantt-options.js +16 -0
  26. package/esm2015/components/gantt/components/gantt/gantt.js +767 -0
  27. package/esm2015/components/gantt/components/gantt/popup.js +68 -0
  28. package/esm2015/components/gantt/components/gantt/utils/date-utils.js +126 -0
  29. package/esm2015/components/gantt/components/gantt/utils/svg-utils.js +119 -0
  30. package/esm2015/components/gantt/components/side-table/side-table.component.js +26 -0
  31. package/esm2015/components/gantt/gantt.component.js +112 -0
  32. package/esm2015/components/gantt/gantt.module.js +19 -0
  33. package/esm2015/components/gantt/index.js +4 -0
  34. package/esm2015/components/gantt/models/index.js +2 -0
  35. package/esm2015/components/gantt/models/options.js +1 -0
  36. package/esm2015/components/gantt/models/task.js +1 -0
  37. package/esm2015/components/gantt/models/view-mode.js +11 -0
  38. package/esm2015/components/switch/index.js +3 -0
  39. package/esm2015/components/switch/switch.component.js +86 -0
  40. package/esm2015/components/switch/switch.module.js +15 -0
  41. package/esm2015/public-api.js +3 -1
  42. package/esm2015/seniorsistemas-angular-components.js +25 -24
  43. package/esm5/components/gantt/components/gantt/arrow.js +81 -0
  44. package/esm5/components/gantt/components/gantt/bar.js +271 -0
  45. package/esm5/components/gantt/components/gantt/gantt-options.js +16 -0
  46. package/esm5/components/gantt/components/gantt/gantt.js +883 -0
  47. package/esm5/components/gantt/components/gantt/popup.js +59 -0
  48. package/esm5/components/gantt/components/gantt/utils/date-utils.js +134 -0
  49. package/esm5/components/gantt/components/gantt/utils/svg-utils.js +121 -0
  50. package/esm5/components/gantt/components/side-table/side-table.component.js +27 -0
  51. package/esm5/components/gantt/gantt.component.js +114 -0
  52. package/esm5/components/gantt/gantt.module.js +22 -0
  53. package/esm5/components/gantt/index.js +4 -0
  54. package/esm5/components/gantt/models/index.js +2 -0
  55. package/esm5/components/gantt/models/options.js +1 -0
  56. package/esm5/components/gantt/models/task.js +1 -0
  57. package/esm5/components/gantt/models/view-mode.js +11 -0
  58. package/esm5/components/switch/index.js +3 -0
  59. package/esm5/components/switch/switch.component.js +88 -0
  60. package/esm5/components/switch/switch.module.js +18 -0
  61. package/esm5/public-api.js +3 -1
  62. package/esm5/seniorsistemas-angular-components.js +25 -24
  63. package/fesm2015/seniorsistemas-angular-components.js +1647 -2
  64. package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
  65. package/fesm5/seniorsistemas-angular-components.js +1802 -2
  66. package/fesm5/seniorsistemas-angular-components.js.map +1 -1
  67. package/package.json +1 -1
  68. package/public-api.d.ts +2 -0
  69. package/seniorsistemas-angular-components.d.ts +24 -23
  70. 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,2 @@
1
+ export { SwitchComponent } from "./switch.component";
2
+ export { SwitchModule } from "./switch.module";
@@ -0,0 +1,21 @@
1
+ import { ElementRef, EventEmitter } from '@angular/core';
2
+ import { ControlValueAccessor } from "@angular/forms";
3
+ export declare class SwitchComponent implements ControlValueAccessor {
4
+ readonly: boolean;
5
+ trueLabel?: string;
6
+ falseLabel?: string;
7
+ inputId: string;
8
+ disabled: boolean;
9
+ valueChanged: EventEmitter<boolean>;
10
+ value: boolean;
11
+ switchRef: ElementRef;
12
+ onFocusIn(): void;
13
+ onFocusOut(): void;
14
+ private _onChange;
15
+ private _onTouched;
16
+ writeValue(value: boolean): void;
17
+ registerOnChange(onChange: (value: boolean) => void): void;
18
+ registerOnTouched(onTouched: (value: boolean) => void): void;
19
+ setDisabledState?(disabled: boolean): void;
20
+ toggleCheck(): void;
21
+ }
@@ -0,0 +1,2 @@
1
+ export declare class SwitchModule {
2
+ }
@@ -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=