@smart-solutions-tech/smart-angular-calendar 0.0.10 → 0.0.12

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.
@@ -4,11 +4,13 @@ import * as i1 from "@angular/common";
4
4
  import * as i2 from "../calendar/calendar.component";
5
5
  import * as i3 from "../month-selector/month-selector.component";
6
6
  import * as i4 from "../day/day.component";
7
- import * as i5 from "../../pipes/translate.pipe";
8
- import * as i6 from "../../pipes/translate-month.pipe";
7
+ import * as i5 from "../week/week.component";
8
+ import * as i6 from "../../pipes/translate.pipe";
9
+ import * as i7 from "../../pipes/translate-month.pipe";
9
10
  export class SmartCalendarComponent {
10
11
  constructor() {
11
12
  this.mode = 'month';
13
+ this.startAt = 'sunday';
12
14
  this.currentMonth = {
13
15
  year: new Date().getFullYear(),
14
16
  month: new Date().getMonth() + 1
@@ -20,6 +22,9 @@ export class SmartCalendarComponent {
20
22
  this.showDateSelector = false;
21
23
  this.selectedDate = new Date();
22
24
  this.selectedDateEvents = [];
25
+ this.weekStartDate = new Date();
26
+ this.weekEndDate = new Date(this.weekStartDate.getTime() + 6 * 24 * 60 * 60 * 1000);
27
+ this.weekEvents = [];
23
28
  }
24
29
  onDocumentClick(event) {
25
30
  if (!this.showDateSelector)
@@ -89,24 +94,25 @@ export class SmartCalendarComponent {
89
94
  oldMonth
90
95
  });
91
96
  }
92
- goToToday() {
93
- const today = new Date();
97
+ nextDay() {
94
98
  const oldMonth = { ...this.currentMonth };
99
+ const newDate = new Date(this.selectedDate);
100
+ newDate.setDate(newDate.getDate() + 1);
101
+ this.selectDate(newDate);
95
102
  this.currentMonth = {
96
- year: today.getFullYear(),
97
- month: today.getMonth() + 1
103
+ year: newDate.getFullYear(),
104
+ month: newDate.getMonth() + 1
98
105
  };
99
- this.selectDate(today);
100
106
  if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
101
107
  this.monthChange.emit({
102
108
  newMonth: this.currentMonth,
103
109
  oldMonth
104
110
  });
105
111
  }
106
- nextDay() {
112
+ prevDay() {
107
113
  const oldMonth = { ...this.currentMonth };
108
114
  const newDate = new Date(this.selectedDate);
109
- newDate.setDate(newDate.getDate() + 1);
115
+ newDate.setDate(newDate.getDate() - 1);
110
116
  this.selectDate(newDate);
111
117
  this.currentMonth = {
112
118
  year: newDate.getFullYear(),
@@ -118,11 +124,26 @@ export class SmartCalendarComponent {
118
124
  oldMonth
119
125
  });
120
126
  }
121
- prevDay() {
127
+ nextWeek() {
122
128
  const oldMonth = { ...this.currentMonth };
123
- const newDate = new Date(this.selectedDate);
124
- newDate.setDate(newDate.getDate() - 1);
125
- this.selectDate(newDate);
129
+ const newDate = new Date(this.weekStartDate);
130
+ newDate.setDate(newDate.getDate() + 7);
131
+ this.selectWeekByDate(newDate);
132
+ this.currentMonth = {
133
+ year: newDate.getFullYear(),
134
+ month: newDate.getMonth() + 1
135
+ };
136
+ if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
137
+ this.monthChange.emit({
138
+ newMonth: this.currentMonth,
139
+ oldMonth
140
+ });
141
+ }
142
+ prevWeek() {
143
+ const oldMonth = { ...this.currentMonth };
144
+ const newDate = new Date(this.weekStartDate);
145
+ newDate.setDate(newDate.getDate() - 7);
146
+ this.selectWeekByDate(newDate);
126
147
  this.currentMonth = {
127
148
  year: newDate.getFullYear(),
128
149
  month: newDate.getMonth() + 1
@@ -136,15 +157,34 @@ export class SmartCalendarComponent {
136
157
  onNext() {
137
158
  if (this.mode === 'month')
138
159
  this.nextMonth();
160
+ else if (this.mode === 'week')
161
+ this.nextWeek();
139
162
  else if (this.mode === 'day')
140
163
  this.nextDay();
141
164
  }
142
165
  onPrev() {
143
166
  if (this.mode === 'month')
144
167
  this.prevMonth();
168
+ else if (this.mode === 'week')
169
+ this.prevWeek();
145
170
  else if (this.mode === 'day')
146
171
  this.prevDay();
147
172
  }
173
+ goToToday() {
174
+ const today = new Date();
175
+ const oldMonth = { ...this.currentMonth };
176
+ this.currentMonth = {
177
+ year: today.getFullYear(),
178
+ month: today.getMonth() + 1
179
+ };
180
+ this.selectDate(today);
181
+ this.selectWeekByDate(today, false);
182
+ if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
183
+ this.monthChange.emit({
184
+ newMonth: this.currentMonth,
185
+ oldMonth
186
+ });
187
+ }
148
188
  setSelectedDateEvents() {
149
189
  this.selectedDateEvents = this.events.filter(event => {
150
190
  const eventDate = new Date(event.start);
@@ -174,20 +214,58 @@ export class SmartCalendarComponent {
174
214
  });
175
215
  this.dateChanged.emit(this.selectedDate);
176
216
  }
217
+ selectWeekByDate(date, emitChange = true) {
218
+ // Calculate the start date of the week based on startAt
219
+ const dayOfWeek = date.getDay(); // 0 (Sun) to 6 (Sat)
220
+ let diffToStart;
221
+ if (this.startAt === 'monday') {
222
+ diffToStart = (dayOfWeek === 0) ? -6 : 1 - dayOfWeek; // If Sunday, go back 6 days
223
+ }
224
+ else {
225
+ diffToStart = -dayOfWeek; // Sunday start
226
+ }
227
+ this.weekStartDate = new Date(date);
228
+ this.weekStartDate.setDate(date.getDate() + diffToStart);
229
+ this.weekEndDate = new Date(this.weekStartDate);
230
+ this.weekEndDate.setDate(this.weekStartDate.getDate() + 6);
231
+ // Filter events for the week
232
+ this.weekEvents = this.events.filter(event => {
233
+ const eventStart = new Date(event.start);
234
+ const eventEnd = event.end ? new Date(event.end) : eventStart;
235
+ return (eventStart <= this.weekEndDate) && (eventEnd >= this.weekStartDate);
236
+ });
237
+ if (emitChange) {
238
+ const oldMonth = this.currentMonth;
239
+ this.currentMonth = {
240
+ year: this.weekStartDate.getFullYear(),
241
+ month: this.weekStartDate.getMonth() + 1
242
+ };
243
+ if (this.currentMonth.month !== oldMonth.month || this.currentMonth.year !== oldMonth.year)
244
+ this.monthChange.emit({
245
+ newMonth: this.currentMonth,
246
+ oldMonth
247
+ });
248
+ }
249
+ }
177
250
  setMode(newMode) {
178
251
  this.mode = newMode;
179
252
  if (newMode === 'day') {
180
253
  this.setSelectedDateEvents();
181
254
  }
255
+ else if (newMode === 'week') {
256
+ this.selectWeekByDate(this.selectedDate);
257
+ }
182
258
  }
183
259
  }
184
260
  SmartCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SmartCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
185
- SmartCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SmartCalendarComponent, selector: "smart-calendar", inputs: { mode: "mode", currentMonth: "currentMonth", events: "events" }, outputs: { monthChange: "monthChange", dateChanged: "dateChanged", eventClick: "eventClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "dateSelectorDropdown", first: true, predicate: ["dateSelectorDropdown"], descendants: true }], ngImport: i0, template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"setMode('month')\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"setMode('week')\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"setMode('day')\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalendarComponent, selector: "lib-calendar", inputs: ["currentMonth", "events", "startAt"], outputs: ["eventClick"] }, { kind: "component", type: i3.MonthSelectorComponent, selector: "lib-month-selector", inputs: ["selectedMonth"], outputs: ["monthSelected"] }, { kind: "component", type: i4.DayComponent, selector: "lib-day", inputs: ["events", "date"], outputs: ["eventClick"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i6.TranslateMonthPipe, name: "translateMonth" }] });
261
+ SmartCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SmartCalendarComponent, selector: "smart-calendar", inputs: { mode: "mode", startAt: "startAt", currentMonth: "currentMonth", events: "events" }, outputs: { monthChange: "monthChange", dateChanged: "dateChanged", eventClick: "eventClick" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "dateSelectorDropdown", first: true, predicate: ["dateSelectorDropdown"], descendants: true }], ngImport: i0, template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'week'\">\n {{ weekStartDate.toDateString() }} - {{ weekEndDate.toDateString() }}\n </span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"setMode('month')\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"setMode('week')\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"setMode('day')\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\" [startAt]=\"startAt\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-week *ngIf=\"mode === 'week'\" [startAt]=\"startAt\" [startDate]=\"weekStartDate\"\n [events]=\"weekEvents\"></lib-week>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalendarComponent, selector: "lib-calendar", inputs: ["currentMonth", "events", "startAt"], outputs: ["eventClick"] }, { kind: "component", type: i3.MonthSelectorComponent, selector: "lib-month-selector", inputs: ["selectedMonth"], outputs: ["monthSelected"] }, { kind: "component", type: i4.DayComponent, selector: "lib-day", inputs: ["events", "date"], outputs: ["eventClick"] }, { kind: "component", type: i5.WeekComponent, selector: "lib-week", inputs: ["startAt", "events", "startDate"], outputs: ["eventClick"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.TranslateMonthPipe, name: "translateMonth" }] });
186
262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SmartCalendarComponent, decorators: [{
187
263
  type: Component,
188
- args: [{ selector: 'smart-calendar', template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"setMode('month')\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"setMode('week')\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"setMode('day')\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"] }]
264
+ args: [{ selector: 'smart-calendar', template: "<div class=\"smart-calendar-component\">\n <div class=\"header\">\n <div class=\"nav-controls\">\n <button class=\"btn-prev\" (click)=\"onPrev()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\" />\n </svg>\n </button>\n\n <button class=\"btn-today\" (click)=\"goToToday()\">{{'today' | translate}}</button>\n\n <button class=\"btn-next\" (click)=\"onNext()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"date-selector-container\">\n <button class=\"btn-date-selector\" (click)=\"toggleDateSelector()\">\n <span *ngIf=\"mode === 'month'\">{{ currentMonth.month | translateMonth}} - {{ currentMonth.year }}</span>\n <span *ngIf=\"mode === 'week'\">\n {{ weekStartDate.toDateString() }} - {{ weekEndDate.toDateString() }}\n </span>\n <span *ngIf=\"mode === 'day'\">{{ selectedDate.toDateString() }}</span>\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path d=\"M480-360 280-560h400L480-360Z\" />\n </svg>\n </button>\n\n <div class=\"date-selector-dropdown\" *ngIf=\"showDateSelector\" #dateSelectorDropdown>\n <lib-month-selector [selectedMonth]=\"currentMonth\"\n (monthSelected)=\"onMonthSelected($event)\"></lib-month-selector>\n </div>\n </div>\n\n <div class=\"spacer\"></div>\n\n <div class=\"view-selector\">\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'month'}\" (click)=\"setMode('month')\">\n <!-- month view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Zm280 240q-17 0-28.5-11.5T440-440q0-17 11.5-28.5T480-480q17 0 28.5 11.5T520-440q0 17-11.5 28.5T480-400Zm-160 0q-17 0-28.5-11.5T280-440q0-17 11.5-28.5T320-480q17 0 28.5 11.5T360-440q0 17-11.5 28.5T320-400Zm320 0q-17 0-28.5-11.5T600-440q0-17 11.5-28.5T640-480q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400ZM480-240q-17 0-28.5-11.5T440-280q0-17 11.5-28.5T480-320q17 0 28.5 11.5T520-280q0 17-11.5 28.5T480-240Zm-160 0q-17 0-28.5-11.5T280-280q0-17 11.5-28.5T320-320q17 0 28.5 11.5T360-280q0 17-11.5 28.5T320-240Zm320 0q-17 0-28.5-11.5T600-280q0-17 11.5-28.5T640-320q17 0 28.5 11.5T680-280q0 17-11.5 28.5T640-240Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'week'}\" (click)=\"setMode('week')\">\n <!-- week view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm360-80h100v-480H520v480Zm-180 0h100v-480H340v480Zm-180 0h100v-480H160v480Zm540 0h100v-480H700v480Z\" />\n </svg>\n </button>\n\n <button class=\"btn-view\" [ngClass]=\"{active: mode === 'day'}\" (click)=\"setMode('day')\">\n <!-- day view -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\"\n fill=\"currentColor\">\n <path\n d=\"M120-160v-80h720v80H120Zm0-560v-80h720v80H120Zm80 400q-33 0-56.5-23.5T120-400v-160q0-33 23.5-56.5T200-640h560q33 0 56.5 23.5T840-560v160q0 33-23.5 56.5T760-320H200Zm0-80h560v-160H200v160Zm0-160v160-160Z\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"view-container\">\n <lib-calendar [events]=\"events\" [currentMonth]=\"currentMonth\" *ngIf=\"mode === 'month'\" [startAt]=\"startAt\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar>\n\n <lib-week *ngIf=\"mode === 'week'\" [startAt]=\"startAt\" [startDate]=\"weekStartDate\"\n [events]=\"weekEvents\"></lib-week>\n\n <lib-day *ngIf=\"mode === 'day'\" [date]=\"selectedDate\" [events]=\"selectedDateEvents\"\n (eventClick)=\"onEventClick($event)\"></lib-day>\n </div>\n\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.smart-calendar-component{display:flex;flex-direction:column;width:100%;height:100%;background-color:#fff}.header{flex-shrink:0;display:flex;align-items:center;gap:16px;padding:2px 16px}.header .spacer{flex:1 1 auto}.header .nav-controls{display:flex;align-items:center}.header .nav-controls .btn-prev,.header .nav-controls .btn-next{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:none;border-radius:50%;cursor:pointer;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-prev:hover,.header .nav-controls .btn-next:hover{background-color:#eee}.header .nav-controls .btn-today{display:flex;align-items:center;height:30px;padding:0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .nav-controls .btn-today:hover{background-color:#eee}.header .view-selector{display:flex;align-items:center}.header .view-selector .btn-view{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid #cccccc;background:none;cursor:pointer;-webkit-user-select:none;user-select:none}.header .view-selector .btn-view:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-right:none}.header .view-selector .btn-view:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-left:none}.header .view-selector .btn-view:hover{background-color:#eee}.header .view-selector .btn-view svg{width:22px;height:22px}.header .view-selector .btn-view.active{background-color:#0000001a}.header .date-selector-container{position:relative}.header .date-selector-container .date-selector-dropdown{position:absolute;top:100%;left:50%;transform:translate(-50%);background-color:#fff;border-radius:4px;box-shadow:0 2px 24px #0000004d;z-index:3}.header .date-selector-container .date-selector-dropdown:before{content:\"\";position:absolute;top:-6px;left:50%;transform:translate(-50%) rotate(45deg);width:12px;height:12px;background-color:#fff;border-radius:2px}.header .btn-date-selector{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px 0 12px;border:none;background:none;border-radius:50px;cursor:pointer;font-weight:600;-webkit-user-select:none;user-select:none}.header .btn-date-selector:hover{background-color:#eee}.view-container{flex:1 1 auto;overflow:hidden}\n"] }]
189
265
  }], ctorParameters: function () { return []; }, propDecorators: { mode: [{
190
266
  type: Input
267
+ }], startAt: [{
268
+ type: Input
191
269
  }], currentMonth: [{
192
270
  type: Input
193
271
  }], events: [{
@@ -205,4 +283,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
205
283
  type: HostListener,
206
284
  args: ['document:click', ['$event']]
207
285
  }] } });
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFRbkksTUFBTSxPQUFPLHNCQUFzQjtJQXFDakM7UUFuQ1MsU0FBSSxHQUE2QixPQUFPLENBQUM7UUFFekMsaUJBQVksR0FBb0M7WUFDdkQsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQzlCLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7U0FDakMsQ0FBQztRQUVPLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBRTVCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBR3BDLENBQUM7UUFFSyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFdkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBY3pELHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVsQyxpQkFBWSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEMsdUJBQWtCLEdBQW9CLEVBQUUsQ0FBQztJQUV6QixDQUFDO0lBZGpCLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixJQUFJLENBQUMsSUFB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QUssS0FBSyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQzs7bUhBaE9VLHNCQUFzQjt1R0FBdEIsc0JBQXNCLG1hQ1JuQyxneEpBK0VNOzJGRHZFTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsZ0JBQWdCOzBFQU1qQixJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRStDLG9CQUFvQjtzQkFBekUsU0FBUzt1QkFBQyxzQkFBc0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR3BELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzbWFydC1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydC1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LWNhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU21hcnRDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgbW9kZTogJ21vbnRoJyB8ICd3ZWVrJyB8ICdkYXknID0gJ21vbnRoJztcblxuICBASW5wdXQoKSBjdXJyZW50TW9udGg6IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyIH0gPSB7XG4gICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxXG4gIH07XG5cbiAgQElucHV0KCkgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBuZXdNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfSxcbiAgICBvbGRNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfVxuICB9PigpO1xuXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICBAT3V0cHV0KCkgZXZlbnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJFdmVudD4oKTtcblxuICBAVmlld0NoaWxkKCdkYXRlU2VsZWN0b3JEcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkYXRlU2VsZWN0b3JEcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd0RhdGVTZWxlY3RvcikgcmV0dXJuO1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5kYXRlU2VsZWN0b3JEcm9wZG93bj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLWRhdGUtc2VsZWN0b3InKTtcbiAgICBpZiAoZHJvcGRvd24gJiYgIWRyb3Bkb3duLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgYnV0dG9uICYmICFidXR0b24uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaG93RGF0ZVNlbGVjdG9yOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgc2VsZWN0ZWREYXRlRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIHRvZ2dsZURhdGVTZWxlY3RvcigpIHtcbiAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSAhdGhpcy5zaG93RGF0ZVNlbGVjdG9yO1xuICB9XG5cbiAgb25Nb250aFNlbGVjdGVkKG5ld01vbnRoOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciB9KSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXdNb250aDtcblxuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSh0aGlzLmN1cnJlbnRNb250aC55ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5tb250aCAtIDEsIDEpKTtcblxuICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICBvbGRNb250aFxuICAgIH0pO1xuXG4gICAgdGhpcy5zaG93RGF0ZVNlbGVjdG9yID0gZmFsc2U7XG4gIH1cblxuICBvbkV2ZW50Q2xpY2soZXZlbnQ6IENhbGVuZGFyRXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBuZXh0TW9udGgoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggPT09IDEyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhciArIDEsXG4gICAgICAgIG1vbnRoOiAxXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICsgMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUodGhpcy5jdXJyZW50TW9udGgueWVhciwgdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxLCAxKSk7XG5cbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgb2xkTW9udGhcbiAgICB9KTtcbiAgfVxuXG4gIHByZXZNb250aCgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggPT09IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRNb250aC55ZWFyIC0gMSxcbiAgICAgICAgbW9udGg6IDEyXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoLm1vbnRoIC0gMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUodGhpcy5jdXJyZW50TW9udGgueWVhciwgdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxLCAxKSk7XG5cbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgb2xkTW9udGhcbiAgICB9KTtcbiAgfVxuXG4gIGdvVG9Ub2RheSgpIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IHRvZGF5LmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDFcbiAgICB9O1xuXG4gICAgdGhpcy5zZWxlY3REYXRlKHRvZGF5KTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgbmV4dERheSgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpICsgMSk7XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJldkRheSgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpIC0gMSk7XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3RGF0ZSk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aC5tb250aCAhPT0gb2xkTW9udGgubW9udGggfHwgdGhpcy5jdXJyZW50TW9udGgueWVhciAhPT0gb2xkTW9udGgueWVhcilcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgb2xkTW9udGhcbiAgICAgIH0pO1xuICB9XG5cbiAgb25OZXh0KCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpXG4gICAgICB0aGlzLm5leHRNb250aCgpO1xuICAgIGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2RheScpXG4gICAgICB0aGlzLm5leHREYXkoKTtcbiAgfVxuXG4gIG9uUHJldigpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKVxuICAgICAgdGhpcy5wcmV2TW9udGgoKTtcbiAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdkYXknKVxuICAgICAgdGhpcy5wcmV2RGF5KCk7XG4gIH1cblxuICBzZXRTZWxlY3RlZERhdGVFdmVudHMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVFdmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZXZlbnREYXRlID0gbmV3IERhdGUoZXZlbnQuc3RhcnQpO1xuXG4gICAgICAvLyByZXR1cm4gZXZlbnRzIHRoYXQgc3RhcnRzLCBlbmRzIG9yIHNwYW5zIHRoZSBzZWxlY3RlZCBkYXRlXG4gICAgICByZXR1cm4gKGV2ZW50RGF0ZS5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldERhdGUoKSAmJlxuICAgICAgICBldmVudERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSAmJlxuICAgICAgICBldmVudERhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKSkgfHxcbiAgICAgICAgKGV2ZW50LmVuZCAmJlxuICAgICAgICAgIGV2ZW50LmVuZC5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldERhdGUoKSAmJlxuICAgICAgICAgIGV2ZW50LmVuZC5nZXRNb250aCgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgZXZlbnQuZW5kLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCkpIHx8XG4gICAgICAgIChldmVudC5zdGFydCA8IHRoaXMuc2VsZWN0ZWREYXRlICYmIGV2ZW50LmVuZCAmJiBldmVudC5lbmQgPiB0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZUV2ZW50cygpO1xuXG4gICAgY29uc3Qgb2xkTW9udGggPSB0aGlzLmN1cnJlbnRNb250aDtcblxuICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgeWVhcjogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgbW9udGg6IGRhdGUuZ2V0TW9udGgoKSArIDFcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICE9PSBvbGRNb250aC5tb250aCB8fCB0aGlzLmN1cnJlbnRNb250aC55ZWFyICE9PSBvbGRNb250aC55ZWFyKVxuICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHtcbiAgICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgICBvbGRNb250aFxuICAgICAgfSk7XG5cbiAgICB0aGlzLmRhdGVDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICB9XG5cbiAgc2V0TW9kZShuZXdNb2RlOiB0eXBlb2YgdGhpcy5tb2RlKSB7XG4gICAgdGhpcy5tb2RlID0gbmV3TW9kZTtcbiAgICBpZiAobmV3TW9kZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlRXZlbnRzKCk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzbWFydC1jYWxlbmRhci1jb21wb25lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuYXYtY29udHJvbHNcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tcHJldlwiIChjbGljayk9XCJvblByZXYoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi10b2RheVwiIChjbGljayk9XCJnb1RvVG9kYXkoKVwiPnt7J3RvZGF5JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tbmV4dFwiIChjbGljayk9XCJvbk5leHQoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNTA0LTQ4MCAzMjAtNjY0bDU2LTU2IDI0MCAyNDAtMjQwIDI0MC01Ni01NiAxODQtMTg0WlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlclwiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdG9yLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1kYXRlLXNlbGVjdG9yXCIgKGNsaWNrKT1cInRvZ2dsZURhdGVTZWxlY3RvcigpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlID09PSAnbW9udGgnXCI+e3sgY3VycmVudE1vbnRoLm1vbnRoIHwgdHJhbnNsYXRlTW9udGh9fSAtIHt7IGN1cnJlbnRNb250aC55ZWFyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kZSA9PT0gJ2RheSdcIj57eyBzZWxlY3RlZERhdGUudG9EYXRlU3RyaW5nKCkgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQ4MC0zNjAgMjgwLTU2MGg0MDBMNDgwLTM2MFpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdG9yLWRyb3Bkb3duXCIgKm5nSWY9XCJzaG93RGF0ZVNlbGVjdG9yXCIgI2RhdGVTZWxlY3RvckRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIDxsaWItbW9udGgtc2VsZWN0b3IgW3NlbGVjdGVkTW9udGhdPVwiY3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwib25Nb250aFNlbGVjdGVkKCRldmVudClcIj48L2xpYi1tb250aC1zZWxlY3Rvcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctc2VsZWN0b3JcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdmlld1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6IG1vZGUgPT09ICdtb250aCd9XCIgKGNsaWNrKT1cInNldE1vZGUoJ21vbnRoJylcIj5cbiAgICAgICAgICAgICAgICA8IS0tIG1vbnRoIHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAwLTgwcS0zMyAwLTU2LjUtMjMuNVQxMjAtMTYwdi01NjBxMC0zMyAyMy41LTU2LjVUMjAwLTgwMGg0MHYtODBoODB2ODBoMzIwdi04MGg4MHY4MGg0MHEzMyAwIDU2LjUgMjMuNVQ4NDAtNzIwdjU2MHEwIDMzLTIzLjUgNTYuNVQ3NjAtODBIMjAwWm0wLTgwaDU2MHYtNDAwSDIwMHY0MDBabTAtNDgwaDU2MHYtODBIMjAwdjgwWm0wIDB2LTgwIDgwWm0yODAgMjQwcS0xNyAwLTI4LjUtMTEuNVQ0NDAtNDQwcTAtMTcgMTEuNS0yOC41VDQ4MC00ODBxMTcgMCAyOC41IDExLjVUNTIwLTQ0MHEwIDE3LTExLjUgMjguNVQ0ODAtNDAwWm0tMTYwIDBxLTE3IDAtMjguNS0xMS41VDI4MC00NDBxMC0xNyAxMS41LTI4LjVUMzIwLTQ4MHExNyAwIDI4LjUgMTEuNVQzNjAtNDQwcTAgMTctMTEuNSAyOC41VDMyMC00MDBabTMyMCAwcS0xNyAwLTI4LjUtMTEuNVQ2MDAtNDQwcTAtMTcgMTEuNS0yOC41VDY0MC00ODBxMTcgMCAyOC41IDExLjVUNjgwLTQ0MHEwIDE3LTExLjUgMjguNVQ2NDAtNDAwWk00ODAtMjQwcS0xNyAwLTI4LjUtMTEuNVQ0NDAtMjgwcTAtMTcgMTEuNS0yOC41VDQ4MC0zMjBxMTcgMCAyOC41IDExLjVUNTIwLTI4MHEwIDE3LTExLjUgMjguNVQ0ODAtMjQwWm0tMTYwIDBxLTE3IDAtMjguNS0xMS41VDI4MC0yODBxMC0xNyAxMS41LTI4LjVUMzIwLTMyMHExNyAwIDI4LjUgMTEuNVQzNjAtMjgwcTAgMTctMTEuNSAyOC41VDMyMC0yNDBabTMyMCAwcS0xNyAwLTI4LjUtMTEuNVQ2MDAtMjgwcTAtMTcgMTEuNS0yOC41VDY0MC0zMjBxMTcgMCAyOC41IDExLjVUNjgwLTI4MHEwIDE3LTExLjUgMjguNVQ2NDAtMjQwWlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi12aWV3XCIgW25nQ2xhc3NdPVwie2FjdGl2ZTogbW9kZSA9PT0gJ3dlZWsnfVwiIChjbGljayk9XCJzZXRNb2RlKCd3ZWVrJylcIj5cbiAgICAgICAgICAgICAgICA8IS0tIHdlZWsgdmlldyAtLT5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNjAtMTYwcS0zMyAwLTU2LjUtMjMuNVQ4MC0yNDB2LTQ4MHEwLTMzIDIzLjUtNTYuNVQxNjAtODAwaDY0MHEzMyAwIDU2LjUgMjMuNVQ4ODAtNzIwdjQ4MHEwIDMzLTIzLjUgNTYuNVQ4MDAtMTYwSDE2MFptMzYwLTgwaDEwMHYtNDgwSDUyMHY0ODBabS0xODAgMGgxMDB2LTQ4MEgzNDB2NDgwWm0tMTgwIDBoMTAwdi00ODBIMTYwdjQ4MFptNTQwIDBoMTAwdi00ODBINzAwdjQ4MFpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdmlld1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6IG1vZGUgPT09ICdkYXknfVwiIChjbGljayk9XCJzZXRNb2RlKCdkYXknKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gZGF5IHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIwLTE2MHYtODBoNzIwdjgwSDEyMFptMC01NjB2LTgwaDcyMHY4MEgxMjBabTgwIDQwMHEtMzMgMC01Ni41LTIzLjVUMTIwLTQwMHYtMTYwcTAtMzMgMjMuNS01Ni41VDIwMC02NDBoNTYwcTMzIDAgNTYuNSAyMy41VDg0MC01NjB2MTYwcTAgMzMtMjMuNSA1Ni41VDc2MC0zMjBIMjAwWm0wLTgwaDU2MHYtMTYwSDIwMHYxNjBabTAtMTYwdjE2MC0xNjBaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ2aWV3LWNvbnRhaW5lclwiPlxuICAgICAgICA8bGliLWNhbGVuZGFyIFtldmVudHNdPVwiZXZlbnRzXCIgW2N1cnJlbnRNb250aF09XCJjdXJyZW50TW9udGhcIiAqbmdJZj1cIm1vZGUgPT09ICdtb250aCdcIlxuICAgICAgICAgICAgKGV2ZW50Q2xpY2spPVwib25FdmVudENsaWNrKCRldmVudClcIj48L2xpYi1jYWxlbmRhcj5cblxuICAgICAgICA8bGliLWRheSAqbmdJZj1cIm1vZGUgPT09ICdkYXknXCIgW2RhdGVdPVwic2VsZWN0ZWREYXRlXCIgW2V2ZW50c109XCJzZWxlY3RlZERhdGVFdmVudHNcIlxuICAgICAgICAgICAgKGV2ZW50Q2xpY2spPVwib25FdmVudENsaWNrKCRldmVudClcIj48L2xpYi1kYXk+XG4gICAgPC9kaXY+XG5cbjwvZGl2PiJdfQ==
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvc21hcnQtY2FsZW5kYXIvc21hcnQtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBUW5JLE1BQU0sT0FBTyxzQkFBc0I7SUEyQ2pDO1FBekNTLFNBQUksR0FBNkIsT0FBTyxDQUFDO1FBRXpDLFlBQU8sR0FBd0IsUUFBUSxDQUFDO1FBRXhDLGlCQUFZLEdBQW9DO1lBQ3ZELElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUM5QixLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ2pDLENBQUM7UUFFTyxXQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUU1QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUdwQyxDQUFDO1FBRUssZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQWN6RCxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFFbEMsaUJBQVksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2hDLHVCQUFrQixHQUFvQixFQUFFLENBQUM7UUFFekMsa0JBQWEsR0FBUyxJQUFJLElB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SyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJO2dCQUN4RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUMzQixRQUFRO2lCQUNULENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQixJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7WUFDckIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUI7YUFBTSxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7O21IQTNUVSxzQkFBc0I7dUdBQXRCLHNCQUFzQix1YkNSbkMsZ21LQXFGTTsyRkQ3RU8sc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLGdCQUFnQjswRUFNakIsSUFBSTtzQkFBWixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFFK0Msb0JBQW9CO3NCQUF6RSxTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHcEQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NtYXJ0LWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTbWFydENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBtb2RlOiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgPSAnbW9udGgnO1xuXG4gIEBJbnB1dCgpIHN0YXJ0QXQ6ICdtb25kYXknIHwgJ3N1bmRheScgPSAnc3VuZGF5JztcblxuICBASW5wdXQoKSBjdXJyZW50TW9udGg6IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyIH0gPSB7XG4gICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxXG4gIH07XG5cbiAgQElucHV0KCkgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBuZXdNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfSxcbiAgICBvbGRNb250aDogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIgfVxuICB9PigpO1xuXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICBAT3V0cHV0KCkgZXZlbnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJFdmVudD4oKTtcblxuICBAVmlld0NoaWxkKCdkYXRlU2VsZWN0b3JEcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkYXRlU2VsZWN0b3JEcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd0RhdGVTZWxlY3RvcikgcmV0dXJuO1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5kYXRlU2VsZWN0b3JEcm9wZG93bj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLWRhdGUtc2VsZWN0b3InKTtcbiAgICBpZiAoZHJvcGRvd24gJiYgIWRyb3Bkb3duLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgYnV0dG9uICYmICFidXR0b24uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaG93RGF0ZVNlbGVjdG9yOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgc2VsZWN0ZWREYXRlRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICB3ZWVrU3RhcnREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgd2Vla0VuZERhdGU6IERhdGUgPSBuZXcgRGF0ZSh0aGlzLndlZWtTdGFydERhdGUuZ2V0VGltZSgpICsgNiAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICB3ZWVrRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIHRvZ2dsZURhdGVTZWxlY3RvcigpIHtcbiAgICB0aGlzLnNob3dEYXRlU2VsZWN0b3IgPSAhdGhpcy5zaG93RGF0ZVNlbGVjdG9yO1xuICB9XG5cbiAgb25Nb250aFNlbGVjdGVkKG5ld01vbnRoOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciB9KSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXdNb250aDtcblxuICAgIHRoaXMuc2VsZWN0RGF0ZShuZXcgRGF0ZSh0aGlzLmN1cnJlbnRNb250aC55ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5tb250aCAtIDEsIDEpKTtcblxuICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7XG4gICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICBvbGRNb250aFxuICAgIH0pO1xuXG4gICAgdGhpcy5zaG93RGF0ZVNlbGVjdG9yID0gZmFsc2U7XG4gIH1cblxuICBvbkV2ZW50Q2xpY2soZXZlbnQ6IENhbGVuZGFyRXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBuZXh0TW9udGgoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggPT09IDEyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhciArIDEsXG4gICAgICAgIG1vbnRoOiAxXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICsgMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUodGhpcy5jdXJyZW50TW9udGgueWVhciwgdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxLCAxKSk7XG5cbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgb2xkTW9udGhcbiAgICB9KTtcbiAgfVxuXG4gIHByZXZNb250aCgpIHtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggPT09IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRNb250aC55ZWFyIC0gMSxcbiAgICAgICAgbW9udGg6IDEyXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50TW9udGgueWVhcixcbiAgICAgICAgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoLm1vbnRoIC0gMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUobmV3IERhdGUodGhpcy5jdXJyZW50TW9udGgueWVhciwgdGhpcy5jdXJyZW50TW9udGgubW9udGggLSAxLCAxKSk7XG5cbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgb2xkTW9udGhcbiAgICB9KTtcbiAgfVxuXG4gIG5leHREYXkoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIG5ld0RhdGUuc2V0RGF0ZShuZXdEYXRlLmdldERhdGUoKSArIDEpO1xuXG4gICAgdGhpcy5zZWxlY3REYXRlKG5ld0RhdGUpO1xuXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpICsgMVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggIT09IG9sZE1vbnRoLm1vbnRoIHx8IHRoaXMuY3VycmVudE1vbnRoLnllYXIgIT09IG9sZE1vbnRoLnllYXIpXG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICAgIG9sZE1vbnRoXG4gICAgICB9KTtcbiAgfVxuXG4gIHByZXZEYXkoKSB7XG4gICAgY29uc3Qgb2xkTW9udGggPSB7IC4uLnRoaXMuY3VycmVudE1vbnRoIH07XG5cbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIG5ld0RhdGUuc2V0RGF0ZShuZXdEYXRlLmdldERhdGUoKSAtIDEpO1xuXG4gICAgdGhpcy5zZWxlY3REYXRlKG5ld0RhdGUpO1xuXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpICsgMVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggIT09IG9sZE1vbnRoLm1vbnRoIHx8IHRoaXMuY3VycmVudE1vbnRoLnllYXIgIT09IG9sZE1vbnRoLnllYXIpXG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICAgIG9sZE1vbnRoXG4gICAgICB9KTtcbiAgfVxuXG4gIG5leHRXZWVrKCkge1xuICAgIGNvbnN0IG9sZE1vbnRoID0geyAuLi50aGlzLmN1cnJlbnRNb250aCB9O1xuXG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpICsgNyk7XG4gICAgdGhpcy5zZWxlY3RXZWVrQnlEYXRlKG5ld0RhdGUpO1xuXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpICsgMVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggIT09IG9sZE1vbnRoLm1vbnRoIHx8IHRoaXMuY3VycmVudE1vbnRoLnllYXIgIT09IG9sZE1vbnRoLnllYXIpXG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICAgIG9sZE1vbnRoXG4gICAgICB9KTtcbiAgfVxuXG4gIHByZXZXZWVrKCkge1xuICAgIGNvbnN0IG9sZE1vbnRoID0geyAuLi50aGlzLmN1cnJlbnRNb250aCB9O1xuXG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZSk7XG4gICAgbmV3RGF0ZS5zZXREYXRlKG5ld0RhdGUuZ2V0RGF0ZSgpIC0gNyk7XG4gICAgdGhpcy5zZWxlY3RXZWVrQnlEYXRlKG5ld0RhdGUpO1xuXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB7XG4gICAgICB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpICsgMVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGgubW9udGggIT09IG9sZE1vbnRoLm1vbnRoIHx8IHRoaXMuY3VycmVudE1vbnRoLnllYXIgIT09IG9sZE1vbnRoLnllYXIpXG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgICBuZXdNb250aDogdGhpcy5jdXJyZW50TW9udGgsXG4gICAgICAgIG9sZE1vbnRoXG4gICAgICB9KTtcbiAgfVxuXG4gIG9uTmV4dCgpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKVxuICAgICAgdGhpcy5uZXh0TW9udGgoKTtcbiAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICd3ZWVrJylcbiAgICAgIHRoaXMubmV4dFdlZWsoKTtcbiAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdkYXknKVxuICAgICAgdGhpcy5uZXh0RGF5KCk7XG4gIH1cblxuICBvblByZXYoKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRoJylcbiAgICAgIHRoaXMucHJldk1vbnRoKCk7XG4gICAgZWxzZSBpZiAodGhpcy5tb2RlID09PSAnd2VlaycpXG4gICAgICB0aGlzLnByZXZXZWVrKCk7XG4gICAgZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZGF5JylcbiAgICAgIHRoaXMucHJldkRheSgpO1xuICB9XG5cbiAgZ29Ub1RvZGF5KCkge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBvbGRNb250aCA9IHsgLi4udGhpcy5jdXJyZW50TW9udGggfTtcblxuICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgeWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMVxuICAgIH07XG5cbiAgICB0aGlzLnNlbGVjdERhdGUodG9kYXkpO1xuICAgIHRoaXMuc2VsZWN0V2Vla0J5RGF0ZSh0b2RheSwgZmFsc2UpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICE9PSBvbGRNb250aC5tb250aCB8fCB0aGlzLmN1cnJlbnRNb250aC55ZWFyICE9PSBvbGRNb250aC55ZWFyKVxuICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHtcbiAgICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgICBvbGRNb250aFxuICAgICAgfSk7XG4gIH1cblxuICBzZXRTZWxlY3RlZERhdGVFdmVudHMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVFdmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZXZlbnREYXRlID0gbmV3IERhdGUoZXZlbnQuc3RhcnQpO1xuXG4gICAgICAvLyByZXR1cm4gZXZlbnRzIHRoYXQgc3RhcnRzLCBlbmRzIG9yIHNwYW5zIHRoZSBzZWxlY3RlZCBkYXRlXG4gICAgICByZXR1cm4gKGV2ZW50RGF0ZS5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldERhdGUoKSAmJlxuICAgICAgICBldmVudERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSAmJlxuICAgICAgICBldmVudERhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKSkgfHxcbiAgICAgICAgKGV2ZW50LmVuZCAmJlxuICAgICAgICAgIGV2ZW50LmVuZC5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldERhdGUoKSAmJlxuICAgICAgICAgIGV2ZW50LmVuZC5nZXRNb250aCgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgZXZlbnQuZW5kLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCkpIHx8XG4gICAgICAgIChldmVudC5zdGFydCA8IHRoaXMuc2VsZWN0ZWREYXRlICYmIGV2ZW50LmVuZCAmJiBldmVudC5lbmQgPiB0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZUV2ZW50cygpO1xuXG4gICAgY29uc3Qgb2xkTW9udGggPSB0aGlzLmN1cnJlbnRNb250aDtcblxuICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgeWVhcjogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgbW9udGg6IGRhdGUuZ2V0TW9udGgoKSArIDFcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICE9PSBvbGRNb250aC5tb250aCB8fCB0aGlzLmN1cnJlbnRNb250aC55ZWFyICE9PSBvbGRNb250aC55ZWFyKVxuICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHtcbiAgICAgICAgbmV3TW9udGg6IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgICBvbGRNb250aFxuICAgICAgfSk7XG5cbiAgICB0aGlzLmRhdGVDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICB9XG5cbiAgc2VsZWN0V2Vla0J5RGF0ZShkYXRlOiBEYXRlLCBlbWl0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3RhcnQgZGF0ZSBvZiB0aGUgd2VlayBiYXNlZCBvbiBzdGFydEF0XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTsgLy8gMCAoU3VuKSB0byA2IChTYXQpXG4gICAgbGV0IGRpZmZUb1N0YXJ0OiBudW1iZXI7XG5cbiAgICBpZiAodGhpcy5zdGFydEF0ID09PSAnbW9uZGF5Jykge1xuICAgICAgZGlmZlRvU3RhcnQgPSAoZGF5T2ZXZWVrID09PSAwKSA/IC02IDogMSAtIGRheU9mV2VlazsgLy8gSWYgU3VuZGF5LCBnbyBiYWNrIDYgZGF5c1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmVG9TdGFydCA9IC1kYXlPZldlZWs7IC8vIFN1bmRheSBzdGFydFxuICAgIH1cblxuICAgIHRoaXMud2Vla1N0YXJ0RGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIHRoaXMud2Vla1N0YXJ0RGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGlmZlRvU3RhcnQpO1xuXG4gICAgdGhpcy53ZWVrRW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZSk7XG4gICAgdGhpcy53ZWVrRW5kRGF0ZS5zZXREYXRlKHRoaXMud2Vla1N0YXJ0RGF0ZS5nZXREYXRlKCkgKyA2KTtcblxuICAgIC8vIEZpbHRlciBldmVudHMgZm9yIHRoZSB3ZWVrXG4gICAgdGhpcy53ZWVrRXZlbnRzID0gdGhpcy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50U3RhcnQgPSBuZXcgRGF0ZShldmVudC5zdGFydCk7XG4gICAgICBjb25zdCBldmVudEVuZCA9IGV2ZW50LmVuZCA/IG5ldyBEYXRlKGV2ZW50LmVuZCkgOiBldmVudFN0YXJ0O1xuICAgICAgcmV0dXJuIChldmVudFN0YXJ0IDw9IHRoaXMud2Vla0VuZERhdGUpICYmIChldmVudEVuZCA+PSB0aGlzLndlZWtTdGFydERhdGUpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVtaXRDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XG5cbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLndlZWtTdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgbW9udGg6IHRoaXMud2Vla1N0YXJ0RGF0ZS5nZXRNb250aCgpICsgMVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoLm1vbnRoICE9PSBvbGRNb250aC5tb250aCB8fCB0aGlzLmN1cnJlbnRNb250aC55ZWFyICE9PSBvbGRNb250aC55ZWFyKVxuICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgIG5ld01vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgICBvbGRNb250aFxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRNb2RlKG5ld01vZGU6IHR5cGVvZiB0aGlzLm1vZGUpIHtcbiAgICB0aGlzLm1vZGUgPSBuZXdNb2RlO1xuICAgIGlmIChuZXdNb2RlID09PSAnZGF5Jykge1xuICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVFdmVudHMoKTtcbiAgICB9IGVsc2UgaWYgKG5ld01vZGUgPT09ICd3ZWVrJykge1xuICAgICAgdGhpcy5zZWxlY3RXZWVrQnlEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInNtYXJ0LWNhbGVuZGFyLWNvbXBvbmVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1jb250cm9sc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1wcmV2XCIgKGNsaWNrKT1cIm9uUHJldigpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01NjAtMjQwIDMyMC00ODBsMjQwLTI0MCA1NiA1Ni0xODQgMTg0IDE4NCAxODQtNTYgNTZaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLXRvZGF5XCIgKGNsaWNrKT1cImdvVG9Ub2RheSgpXCI+e3sndG9kYXknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1uZXh0XCIgKGNsaWNrKT1cIm9uTmV4dCgpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01MDQtNDgwIDMyMC02NjRsNTYtNTYgMjQwIDI0MC0yNDAgMjQwLTU2LTU2IDE4NC0xODRaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtc2VsZWN0b3ItY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWRhdGUtc2VsZWN0b3JcIiAoY2xpY2spPVwidG9nZ2xlRGF0ZVNlbGVjdG9yKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1vZGUgPT09ICdtb250aCdcIj57eyBjdXJyZW50TW9udGgubW9udGggfCB0cmFuc2xhdGVNb250aH19IC0ge3sgY3VycmVudE1vbnRoLnllYXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2RlID09PSAnd2VlaydcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgd2Vla1N0YXJ0RGF0ZS50b0RhdGVTdHJpbmcoKSB9fSAtIHt7IHdlZWtFbmREYXRlLnRvRGF0ZVN0cmluZygpIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kZSA9PT0gJ2RheSdcIj57eyBzZWxlY3RlZERhdGUudG9EYXRlU3RyaW5nKCkgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQ4MC0zNjAgMjgwLTU2MGg0MDBMNDgwLTM2MFpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlbGVjdG9yLWRyb3Bkb3duXCIgKm5nSWY9XCJzaG93RGF0ZVNlbGVjdG9yXCIgI2RhdGVTZWxlY3RvckRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIDxsaWItbW9udGgtc2VsZWN0b3IgW3NlbGVjdGVkTW9udGhdPVwiY3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwib25Nb250aFNlbGVjdGVkKCRldmVudClcIj48L2xpYi1tb250aC1zZWxlY3Rvcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctc2VsZWN0b3JcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdmlld1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6IG1vZGUgPT09ICdtb250aCd9XCIgKGNsaWNrKT1cInNldE1vZGUoJ21vbnRoJylcIj5cbiAgICAgICAgICAgICAgICA8IS0tIG1vbnRoIHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAwLTgwcS0zMyAwLTU2LjUtMjMuNVQxMjAtMTYwdi01NjBxMC0zMyAyMy41LTU2LjVUMjAwLTgwMGg0MHYtODBoODB2ODBoMzIwdi04MGg4MHY4MGg0MHEzMyAwIDU2LjUgMjMuNVQ4NDAtNzIwdjU2MHEwIDMzLTIzLjUgNTYuNVQ3NjAtODBIMjAwWm0wLTgwaDU2MHYtNDAwSDIwMHY0MDBabTAtNDgwaDU2MHYtODBIMjAwdjgwWm0wIDB2LTgwIDgwWm0yODAgMjQwcS0xNyAwLTI4LjUtMTEuNVQ0NDAtNDQwcTAtMTcgMTEuNS0yOC41VDQ4MC00ODBxMTcgMCAyOC41IDExLjVUNTIwLTQ0MHEwIDE3LTExLjUgMjguNVQ0ODAtNDAwWm0tMTYwIDBxLTE3IDAtMjguNS0xMS41VDI4MC00NDBxMC0xNyAxMS41LTI4LjVUMzIwLTQ4MHExNyAwIDI4LjUgMTEuNVQzNjAtNDQwcTAgMTctMTEuNSAyOC41VDMyMC00MDBabTMyMCAwcS0xNyAwLTI4LjUtMTEuNVQ2MDAtNDQwcTAtMTcgMTEuNS0yOC41VDY0MC00ODBxMTcgMCAyOC41IDExLjVUNjgwLTQ0MHEwIDE3LTExLjUgMjguNVQ2NDAtNDAwWk00ODAtMjQwcS0xNyAwLTI4LjUtMTEuNVQ0NDAtMjgwcTAtMTcgMTEuNS0yOC41VDQ4MC0zMjBxMTcgMCAyOC41IDExLjVUNTIwLTI4MHEwIDE3LTExLjUgMjguNVQ0ODAtMjQwWm0tMTYwIDBxLTE3IDAtMjguNS0xMS41VDI4MC0yODBxMC0xNyAxMS41LTI4LjVUMzIwLTMyMHExNyAwIDI4LjUgMTEuNVQzNjAtMjgwcTAgMTctMTEuNSAyOC41VDMyMC0yNDBabTMyMCAwcS0xNyAwLTI4LjUtMTEuNVQ2MDAtMjgwcTAtMTcgMTEuNS0yOC41VDY0MC0zMjBxMTcgMCAyOC41IDExLjVUNjgwLTI4MHEwIDE3LTExLjUgMjguNVQ2NDAtMjQwWlwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi12aWV3XCIgW25nQ2xhc3NdPVwie2FjdGl2ZTogbW9kZSA9PT0gJ3dlZWsnfVwiIChjbGljayk9XCJzZXRNb2RlKCd3ZWVrJylcIj5cbiAgICAgICAgICAgICAgICA8IS0tIHdlZWsgdmlldyAtLT5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNjAtMTYwcS0zMyAwLTU2LjUtMjMuNVQ4MC0yNDB2LTQ4MHEwLTMzIDIzLjUtNTYuNVQxNjAtODAwaDY0MHEzMyAwIDU2LjUgMjMuNVQ4ODAtNzIwdjQ4MHEwIDMzLTIzLjUgNTYuNVQ4MDAtMTYwSDE2MFptMzYwLTgwaDEwMHYtNDgwSDUyMHY0ODBabS0xODAgMGgxMDB2LTQ4MEgzNDB2NDgwWm0tMTgwIDBoMTAwdi00ODBIMTYwdjQ4MFptNTQwIDBoMTAwdi00ODBINzAwdjQ4MFpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdmlld1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6IG1vZGUgPT09ICdkYXknfVwiIChjbGljayk9XCJzZXRNb2RlKCdkYXknKVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gZGF5IHZpZXcgLS0+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIwLTE2MHYtODBoNzIwdjgwSDEyMFptMC01NjB2LTgwaDcyMHY4MEgxMjBabTgwIDQwMHEtMzMgMC01Ni41LTIzLjVUMTIwLTQwMHYtMTYwcTAtMzMgMjMuNS01Ni41VDIwMC02NDBoNTYwcTMzIDAgNTYuNSAyMy41VDg0MC01NjB2MTYwcTAgMzMtMjMuNSA1Ni41VDc2MC0zMjBIMjAwWm0wLTgwaDU2MHYtMTYwSDIwMHYxNjBabTAtMTYwdjE2MC0xNjBaXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ2aWV3LWNvbnRhaW5lclwiPlxuICAgICAgICA8bGliLWNhbGVuZGFyIFtldmVudHNdPVwiZXZlbnRzXCIgW2N1cnJlbnRNb250aF09XCJjdXJyZW50TW9udGhcIiAqbmdJZj1cIm1vZGUgPT09ICdtb250aCdcIiBbc3RhcnRBdF09XCJzdGFydEF0XCJcbiAgICAgICAgICAgIChldmVudENsaWNrKT1cIm9uRXZlbnRDbGljaygkZXZlbnQpXCI+PC9saWItY2FsZW5kYXI+XG5cbiAgICAgICAgPGxpYi13ZWVrICpuZ0lmPVwibW9kZSA9PT0gJ3dlZWsnXCIgW3N0YXJ0QXRdPVwic3RhcnRBdFwiIFtzdGFydERhdGVdPVwid2Vla1N0YXJ0RGF0ZVwiXG4gICAgICAgICAgICBbZXZlbnRzXT1cIndlZWtFdmVudHNcIj48L2xpYi13ZWVrPlxuXG4gICAgICAgIDxsaWItZGF5ICpuZ0lmPVwibW9kZSA9PT0gJ2RheSdcIiBbZGF0ZV09XCJzZWxlY3RlZERhdGVcIiBbZXZlbnRzXT1cInNlbGVjdGVkRGF0ZUV2ZW50c1wiXG4gICAgICAgICAgICAoZXZlbnRDbGljayk9XCJvbkV2ZW50Q2xpY2soJGV2ZW50KVwiPjwvbGliLWRheT5cbiAgICA8L2Rpdj5cblxuPC9kaXY+Il19
@@ -0,0 +1,133 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../calendar-event/calendar-event.component";
5
+ import * as i3 from "../duration-event/duration-event.component";
6
+ import * as i4 from "../../pipes/translate.pipe";
7
+ export class WeekComponent {
8
+ constructor() {
9
+ this.startAt = 'sunday';
10
+ this.events = [];
11
+ this.eventClick = new EventEmitter();
12
+ this.weekDays = [
13
+ { tag: 'sun' },
14
+ { tag: 'mon' },
15
+ { tag: 'tue' },
16
+ { tag: 'wed' },
17
+ { tag: 'thu' },
18
+ { tag: 'fri' },
19
+ { tag: 'sat' },
20
+ ];
21
+ this.hourBlocks = Array.from({ length: 24 }, (_, i) => i);
22
+ this.allDayHeight = 60;
23
+ this.weekDayCols = [];
24
+ this.resizing = false;
25
+ this.startY = 0;
26
+ this.startHeight = 0;
27
+ this.onResizeMouseMove = (event) => {
28
+ if (!this.resizing)
29
+ return;
30
+ const delta = event.clientY - this.startY;
31
+ const newHeight = this.startHeight + delta;
32
+ this.allDayHeight = Math.max(60, newHeight); // mínimo 80px
33
+ };
34
+ this.onResizeMouseUp = () => {
35
+ this.resizing = false;
36
+ document.removeEventListener('mousemove', this.onResizeMouseMove);
37
+ document.removeEventListener('mouseup', this.onResizeMouseUp);
38
+ };
39
+ }
40
+ ngOnInit() {
41
+ if (this.startAt === 'monday') {
42
+ this.weekDays = [
43
+ { tag: 'mon' },
44
+ { tag: 'tue' },
45
+ { tag: 'wed' },
46
+ { tag: 'thu' },
47
+ { tag: 'fri' },
48
+ { tag: 'sat' },
49
+ { tag: 'sun' },
50
+ ];
51
+ }
52
+ this.initWeekDayCols();
53
+ }
54
+ initWeekDayCols() {
55
+ this.weekDayCols = [];
56
+ for (let i = 0; i < 7; i++) {
57
+ const currentDate = new Date(this.startDate.getTime() + i * 24 * 60 * 60 * 1000);
58
+ this.weekDayCols.push({
59
+ date: currentDate,
60
+ eventCols: [],
61
+ allDayEvents: []
62
+ });
63
+ }
64
+ this.events.forEach(event => this.addEvent(event));
65
+ }
66
+ addEvent(event) {
67
+ const index = this.weekDayCols.findIndex(col => col.date.getFullYear() === event.start.getFullYear() &&
68
+ col.date.getMonth() === event.start.getMonth() &&
69
+ col.date.getDate() === event.start.getDate());
70
+ if (index === -1)
71
+ return;
72
+ const eventCols = this.weekDayCols[index].eventCols;
73
+ if (event.allDay) {
74
+ this.weekDayCols[index].allDayEvents.push(event);
75
+ }
76
+ else {
77
+ const colIndex = this.findAvalailableColumn(event, index);
78
+ if (colIndex === eventCols.length) {
79
+ eventCols.push({ events: [event] });
80
+ }
81
+ else {
82
+ eventCols[colIndex].events.push(event);
83
+ }
84
+ }
85
+ }
86
+ findAvalailableColumn(event, dayIndex) {
87
+ const eventCols = this.weekDayCols[dayIndex].eventCols;
88
+ for (let colIndex = 0; colIndex < eventCols.length; colIndex++) {
89
+ const col = eventCols[colIndex];
90
+ // conflict if event overlaps with any existing event in the column
91
+ const hasConflict = col.events.some(existingEvent => {
92
+ const startsDuringExisting = event.start < existingEvent.end && event.start >= existingEvent.start;
93
+ const endsDuringExisting = event.end > existingEvent.start && event.end <= existingEvent.end;
94
+ const spansExisting = event.start <= existingEvent.start && event.end >= existingEvent.end;
95
+ return startsDuringExisting || endsDuringExisting || spansExisting;
96
+ });
97
+ if (!hasConflict) {
98
+ return colIndex;
99
+ }
100
+ }
101
+ return eventCols.length;
102
+ }
103
+ ngOnChanges(changes) {
104
+ if (changes['events'] || changes['startDate']) {
105
+ this.initWeekDayCols();
106
+ }
107
+ }
108
+ onResizeMouseDown(event) {
109
+ this.resizing = true;
110
+ this.startY = event.clientY;
111
+ this.startHeight = this.allDayHeight;
112
+ document.addEventListener('mousemove', this.onResizeMouseMove);
113
+ document.addEventListener('mouseup', this.onResizeMouseUp);
114
+ }
115
+ onEventClick(event) {
116
+ this.eventClick.emit(event);
117
+ }
118
+ }
119
+ WeekComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WeekComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
+ WeekComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WeekComponent, selector: "lib-week", inputs: { startAt: "startAt", events: "events", startDate: "startDate" }, outputs: { eventClick: "eventClick" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"week-view-component\">\n <section class=\"all-day-events\" [style.height.px]=\"allDayHeight\">\n <div class=\"header\">\n {{'allDayEvents' | translate}}\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols; let i = index\">\n <div class=\"week-day\">\n {{ weekDays[i].tag | translate | slice:0:3 }}\n </div>\n\n <lib-calendar-event *ngFor=\"let event of day.allDayEvents\" [event]=\"event\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar-event>\n </div>\n </div>\n </section>\n\n <div class=\"resize-divider\" (mousedown)=\"onResizeMouseDown($event)\"></div>\n\n <section class=\"duration-events\">\n <div class=\"hour-blocks\">\n <div class=\"hour-block\" *ngFor=\"let hour of hourBlocks\">\n <span>{{ hour }}:00</span>\n </div>\n </div>\n\n <div class=\"events-wrapper\">\n <div class=\"time-blocks\">\n <div class=\"day-block\" *ngFor=\"let day of weekDayCols\">\n <div class=\"time-block\" *ngFor=\"let hour of hourBlocks\">\n <div class=\"time-block-middle\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols\"\n [style.gridTemplateColumns]=\"'repeat(' + day.eventCols.length + ', 1fr)'\">\n <div class=\"event-column\" *ngFor=\"let col of day.eventCols\">\n\n <lib-duration-event *ngFor=\"let event of col.events\" [event]=\"event\" [date]=\"day.date\"\n (eventClick)=\"onEventClick($event)\"></lib-duration-event>\n\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.week-view-component{display:flex;flex-direction:column;width:100%;height:100%;max-height:100%;overflow:hidden}section.all-day-events{position:relative;flex-shrink:0;display:flex;flex-direction:column;width:100%;min-height:60px;border-top:1px solid rgba(0,0,0,.12);overflow-y:scroll}section.all-day-events .header{position:sticky;top:0;left:0;z-index:2;width:100%;flex-shrink:0;padding:2px 8px;background-color:#fff;font-size:12px;color:#000000b3;-webkit-user-select:none;user-select:none}section.all-day-events .days-container{display:grid;grid-template-columns:repeat(7,1fr);height:100%;padding-left:45px}section.all-day-events .events-container{display:flex;flex-direction:column;gap:1px;border-right:1px solid rgba(0,0,0,.12)}section.all-day-events .week-day{position:sticky;top:0;left:0;z-index:2;width:100%;font-size:12px;text-align:center;-webkit-user-select:none;user-select:none}section.duration-events{flex-grow:1;display:flex;width:100%;overflow:auto}section.duration-events .hour-blocks{display:flex;flex-direction:column;width:45px;-webkit-user-select:none;user-select:none}section.duration-events .hour-blocks .hour-block{flex-shrink:0;height:60px;padding:4px;border:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper{position:relative;flex-grow:1;width:100%}section.duration-events .events-wrapper .time-blocks{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;display:grid;grid-template-columns:repeat(7,1fr)}section.duration-events .events-wrapper .time-blocks .day-block{display:flex;flex-direction:column;border-right:1px solid rgba(0,0,0,.12)}section.duration-events .events-wrapper .time-blocks .time-block{flex-shrink:0;height:60px;padding:4px;border-bottom:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper .time-blocks .time-block .time-block-middle{width:100%;height:50%;border-bottom:1px dashed rgba(0,0,0,.12)}section.duration-events .events-wrapper .days-container{display:grid;grid-template-columns:repeat(7,1fr);column-gap:1px}section.duration-events .events-wrapper .events-container{display:grid;column-gap:1px}section.duration-events .events-wrapper .events-container .event-column{position:relative}.resize-divider{flex-shrink:0;width:100%;height:4px;background-color:#0000001f;cursor:row-resize;transition:transform .2s ease}.resize-divider:hover{z-index:5;background:repeating-linear-gradient(45deg,rgba(0,0,0,.12),rgba(0,0,0,.12) 4px,#ffffff 4px,#ffffff 8px);background-color:#fff;background-size:22px 8px;animation:stripe-move 1s linear infinite;transform:scaleY(2)}@keyframes stripe-move{0%{background-position:0 0}to{background-position:22px 0}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.CalendarEventComponent, selector: "lib-calendar-event", inputs: ["event"], outputs: ["eventClick"] }, { kind: "component", type: i3.DurationEventComponent, selector: "lib-duration-event", inputs: ["event", "date"], outputs: ["eventClick"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WeekComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'lib-week', template: "<div class=\"week-view-component\">\n <section class=\"all-day-events\" [style.height.px]=\"allDayHeight\">\n <div class=\"header\">\n {{'allDayEvents' | translate}}\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols; let i = index\">\n <div class=\"week-day\">\n {{ weekDays[i].tag | translate | slice:0:3 }}\n </div>\n\n <lib-calendar-event *ngFor=\"let event of day.allDayEvents\" [event]=\"event\"\n (eventClick)=\"onEventClick($event)\"></lib-calendar-event>\n </div>\n </div>\n </section>\n\n <div class=\"resize-divider\" (mousedown)=\"onResizeMouseDown($event)\"></div>\n\n <section class=\"duration-events\">\n <div class=\"hour-blocks\">\n <div class=\"hour-block\" *ngFor=\"let hour of hourBlocks\">\n <span>{{ hour }}:00</span>\n </div>\n </div>\n\n <div class=\"events-wrapper\">\n <div class=\"time-blocks\">\n <div class=\"day-block\" *ngFor=\"let day of weekDayCols\">\n <div class=\"time-block\" *ngFor=\"let hour of hourBlocks\">\n <div class=\"time-block-middle\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"days-container\">\n <div class=\"events-container\" *ngFor=\"let day of weekDayCols\"\n [style.gridTemplateColumns]=\"'repeat(' + day.eventCols.length + ', 1fr)'\">\n <div class=\"event-column\" *ngFor=\"let col of day.eventCols\">\n\n <lib-duration-event *ngFor=\"let event of col.events\" [event]=\"event\" [date]=\"day.date\"\n (eventClick)=\"onEventClick($event)\"></lib-duration-event>\n\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.week-view-component{display:flex;flex-direction:column;width:100%;height:100%;max-height:100%;overflow:hidden}section.all-day-events{position:relative;flex-shrink:0;display:flex;flex-direction:column;width:100%;min-height:60px;border-top:1px solid rgba(0,0,0,.12);overflow-y:scroll}section.all-day-events .header{position:sticky;top:0;left:0;z-index:2;width:100%;flex-shrink:0;padding:2px 8px;background-color:#fff;font-size:12px;color:#000000b3;-webkit-user-select:none;user-select:none}section.all-day-events .days-container{display:grid;grid-template-columns:repeat(7,1fr);height:100%;padding-left:45px}section.all-day-events .events-container{display:flex;flex-direction:column;gap:1px;border-right:1px solid rgba(0,0,0,.12)}section.all-day-events .week-day{position:sticky;top:0;left:0;z-index:2;width:100%;font-size:12px;text-align:center;-webkit-user-select:none;user-select:none}section.duration-events{flex-grow:1;display:flex;width:100%;overflow:auto}section.duration-events .hour-blocks{display:flex;flex-direction:column;width:45px;-webkit-user-select:none;user-select:none}section.duration-events .hour-blocks .hour-block{flex-shrink:0;height:60px;padding:4px;border:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper{position:relative;flex-grow:1;width:100%}section.duration-events .events-wrapper .time-blocks{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;display:grid;grid-template-columns:repeat(7,1fr)}section.duration-events .events-wrapper .time-blocks .day-block{display:flex;flex-direction:column;border-right:1px solid rgba(0,0,0,.12)}section.duration-events .events-wrapper .time-blocks .time-block{flex-shrink:0;height:60px;padding:4px;border-bottom:1px solid rgba(0,0,0,.12);border-top:none;font-size:12px;color:#00000080}section.duration-events .events-wrapper .time-blocks .time-block .time-block-middle{width:100%;height:50%;border-bottom:1px dashed rgba(0,0,0,.12)}section.duration-events .events-wrapper .days-container{display:grid;grid-template-columns:repeat(7,1fr);column-gap:1px}section.duration-events .events-wrapper .events-container{display:grid;column-gap:1px}section.duration-events .events-wrapper .events-container .event-column{position:relative}.resize-divider{flex-shrink:0;width:100%;height:4px;background-color:#0000001f;cursor:row-resize;transition:transform .2s ease}.resize-divider:hover{z-index:5;background:repeating-linear-gradient(45deg,rgba(0,0,0,.12),rgba(0,0,0,.12) 4px,#ffffff 4px,#ffffff 8px);background-color:#fff;background-size:22px 8px;animation:stripe-move 1s linear infinite;transform:scaleY(2)}@keyframes stripe-move{0%{background-position:0 0}to{background-position:22px 0}}\n"] }]
124
+ }], ctorParameters: function () { return []; }, propDecorators: { startAt: [{
125
+ type: Input
126
+ }], events: [{
127
+ type: Input
128
+ }], startDate: [{
129
+ type: Input
130
+ }], eventClick: [{
131
+ type: Output
132
+ }] } });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1hbmd1bGFyLWNhbGVuZGFyL3NyYy9saWIvY29tcG9uZW50cy93ZWVrL3dlZWsuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYW5ndWxhci1jYWxlbmRhci9zcmMvbGliL2NvbXBvbmVudHMvd2Vlay93ZWVrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUXpHLE1BQU0sT0FBTyxhQUFhO0lBK0J4QjtRQTdCUyxZQUFPLEdBQXdCLFFBQVEsQ0FBQztRQUV4QyxXQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUc1QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFekQsYUFBUSxHQUFjO1lBQ3BCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtZQUNkLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtTQUNmLENBQUM7UUFFRixlQUFVLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9ELGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRWxCLGdCQUFXLEdBTUwsRUFBRSxDQUFDO1FBcUZELGFBQVEsR0FBRyxL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QUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJFdmVudCwgV2Vla0RheSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXdlZWsnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2Vlay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dlZWsuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBXZWVrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHN0YXJ0QXQ6ICdtb25kYXknIHwgJ3N1bmRheScgPSAnc3VuZGF5JztcblxuICBASW5wdXQoKSBldmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdO1xuICBASW5wdXQoKSBzdGFydERhdGUhOiBEYXRlO1xuXG4gIEBPdXRwdXQoKSBldmVudENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhckV2ZW50PigpO1xuXG4gIHdlZWtEYXlzOiBXZWVrRGF5W10gPSBbXG4gICAgeyB0YWc6ICdzdW4nIH0sXG4gICAgeyB0YWc6ICdtb24nIH0sXG4gICAgeyB0YWc6ICd0dWUnIH0sXG4gICAgeyB0YWc6ICd3ZWQnIH0sXG4gICAgeyB0YWc6ICd0aHUnIH0sXG4gICAgeyB0YWc6ICdmcmknIH0sXG4gICAgeyB0YWc6ICdzYXQnIH0sXG4gIF07XG5cbiAgaG91ckJsb2NrczogbnVtYmVyW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSk7XG5cbiAgYWxsRGF5SGVpZ2h0ID0gNjA7XG5cbiAgd2Vla0RheUNvbHM6IHtcbiAgICBkYXRlOiBEYXRlO1xuICAgIGV2ZW50Q29sczoge1xuICAgICAgZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gICAgfVtdO1xuICAgIGFsbERheUV2ZW50czogQ2FsZW5kYXJFdmVudFtdO1xuICB9W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXJ0QXQgPT09ICdtb25kYXknKSB7XG4gICAgICB0aGlzLndlZWtEYXlzID0gW1xuICAgICAgICB7IHRhZzogJ21vbicgfSxcbiAgICAgICAgeyB0YWc6ICd0dWUnIH0sXG4gICAgICAgIHsgdGFnOiAnd2VkJyB9LFxuICAgICAgICB7IHRhZzogJ3RodScgfSxcbiAgICAgICAgeyB0YWc6ICdmcmknIH0sXG4gICAgICAgIHsgdGFnOiAnc2F0JyB9LFxuICAgICAgICB7IHRhZzogJ3N1bicgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgdGhpcy5pbml0V2Vla0RheUNvbHMoKTtcbiAgfVxuXG4gIGluaXRXZWVrRGF5Q29scygpIHtcbiAgICB0aGlzLndlZWtEYXlDb2xzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0VGltZSgpICsgaSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgdGhpcy53ZWVrRGF5Q29scy5wdXNoKHtcbiAgICAgICAgZGF0ZTogY3VycmVudERhdGUsXG4gICAgICAgIGV2ZW50Q29sczogW10sXG4gICAgICAgIGFsbERheUV2ZW50czogW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZXZlbnQgPT4gdGhpcy5hZGRFdmVudChldmVudCkpO1xuICB9XG5cbiAgYWRkRXZlbnQoZXZlbnQ6IENhbGVuZGFyRXZlbnQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMud2Vla0RheUNvbHMuZmluZEluZGV4KGNvbCA9PlxuICAgICAgY29sLmRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gZXZlbnQuc3RhcnQuZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgY29sLmRhdGUuZ2V0TW9udGgoKSA9PT0gZXZlbnQuc3RhcnQuZ2V0TW9udGgoKSAmJlxuICAgICAgY29sLmRhdGUuZ2V0RGF0ZSgpID09PSBldmVudC5zdGFydC5nZXREYXRlKClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXZlbnRDb2xzID0gdGhpcy53ZWVrRGF5Q29sc1tpbmRleF0uZXZlbnRDb2xzO1xuXG4gICAgaWYgKGV2ZW50LmFsbERheSkge1xuICAgICAgdGhpcy53ZWVrRGF5Q29sc1tpbmRleF0uYWxsRGF5RXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuZmluZEF2YWxhaWxhYmxlQ29sdW1uKGV2ZW50LCBpbmRleCk7XG5cbiAgICAgIGlmIChjb2xJbmRleCA9PT0gZXZlbnRDb2xzLmxlbmd0aCkge1xuICAgICAgICBldmVudENvbHMucHVzaCh7IGV2ZW50czogW2V2ZW50XSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50Q29sc1tjb2xJbmRleF0uZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbmRBdmFsYWlsYWJsZUNvbHVtbihldmVudDogQ2FsZW5kYXJFdmVudCwgZGF5SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZXZlbnRDb2xzID0gdGhpcy53ZWVrRGF5Q29sc1tkYXlJbmRleF0uZXZlbnRDb2xzO1xuXG4gICAgZm9yIChsZXQgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGV2ZW50Q29scy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNvbCA9IGV2ZW50Q29sc1tjb2xJbmRleF07XG5cbiAgICAgIC8vIGNvbmZsaWN0IGlmIGV2ZW50IG92ZXJsYXBzIHdpdGggYW55IGV4aXN0aW5nIGV2ZW50IGluIHRoZSBjb2x1bW5cbiAgICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gY29sLmV2ZW50cy5zb21lKGV4aXN0aW5nRXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBzdGFydHNEdXJpbmdFeGlzdGluZyA9IGV2ZW50LnN0YXJ0IDwgZXhpc3RpbmdFdmVudC5lbmQhICYmIGV2ZW50LnN0YXJ0ID49IGV4aXN0aW5nRXZlbnQuc3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZHNEdXJpbmdFeGlzdGluZyA9IGV2ZW50LmVuZCEgPiBleGlzdGluZ0V2ZW50LnN0YXJ0ICYmIGV2ZW50LmVuZCEgPD0gZXhpc3RpbmdFdmVudC5lbmQhO1xuICAgICAgICBjb25zdCBzcGFuc0V4aXN0aW5nID0gZXZlbnQuc3RhcnQgPD0gZXhpc3RpbmdFdmVudC5zdGFydCAmJiBldmVudC5lbmQhID49IGV4aXN0aW5nRXZlbnQuZW5kITtcbiAgICAgICAgcmV0dXJuIHN0YXJ0c0R1cmluZ0V4aXN0aW5nIHx8IGVuZHNEdXJpbmdFeGlzdGluZyB8fCBzcGFuc0V4aXN0aW5nO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghaGFzQ29uZmxpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNvbEluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRDb2xzLmxlbmd0aDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZXZlbnRzJ10gfHwgY2hhbmdlc1snc3RhcnREYXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdFdlZWtEYXlDb2xzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNpemluZyA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0WSA9IDA7XG4gIHByaXZhdGUgc3RhcnRIZWlnaHQgPSAwO1xuXG4gIG9uUmVzaXplTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemluZyA9IHRydWU7XG4gICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuICAgIHRoaXMuc3RhcnRIZWlnaHQgPSB0aGlzLmFsbERheUhlaWdodDtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZU1vdXNlVXApO1xuICB9XG5cbiAgb25SZXNpemVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMucmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSB0aGlzLnN0YXJ0SGVpZ2h0ICsgZGVsdGE7XG4gICAgdGhpcy5hbGxEYXlIZWlnaHQgPSBNYXRoLm1heCg2MCwgbmV3SGVpZ2h0KTsgLy8gbcOtbmltbyA4MHB4XG4gIH07XG5cbiAgb25SZXNpemVNb3VzZVVwID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMucmVzaXppbmcgPSBmYWxzZTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZU1vdXNlVXApO1xuICB9O1xuXG4gIG9uRXZlbnRDbGljayhldmVudDogQ2FsZW5kYXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwid2Vlay12aWV3LWNvbXBvbmVudFwiPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiYWxsLWRheS1ldmVudHNcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImFsbERheUhlaWdodFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICB7eydhbGxEYXlFdmVudHMnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRheXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRzLWNvbnRhaW5lclwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheUNvbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vlay1kYXlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgd2Vla0RheXNbaV0udGFnIHwgdHJhbnNsYXRlIHwgc2xpY2U6MDozIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bGliLWNhbGVuZGFyLWV2ZW50ICpuZ0Zvcj1cImxldCBldmVudCBvZiBkYXkuYWxsRGF5RXZlbnRzXCIgW2V2ZW50XT1cImV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50Q2xpY2spPVwib25FdmVudENsaWNrKCRldmVudClcIj48L2xpYi1jYWxlbmRhci1ldmVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3NlY3Rpb24+XG5cbiAgICA8ZGl2IGNsYXNzPVwicmVzaXplLWRpdmlkZXJcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplTW91c2VEb3duKCRldmVudClcIj48L2Rpdj5cblxuICAgIDxzZWN0aW9uIGNsYXNzPVwiZHVyYXRpb24tZXZlbnRzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJob3VyLWJsb2Nrc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvdXItYmxvY2tcIiAqbmdGb3I9XCJsZXQgaG91ciBvZiBob3VyQmxvY2tzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgaG91ciB9fTowMDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnRzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWJsb2Nrc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktYmxvY2tcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlDb2xzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWJsb2NrXCIgKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91ckJsb2Nrc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtYmxvY2stbWlkZGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudHMtY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5Q29sc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zXT1cIidyZXBlYXQoJyArIGRheS5ldmVudENvbHMubGVuZ3RoICsgJywgMWZyKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWNvbHVtblwiICpuZ0Zvcj1cImxldCBjb2wgb2YgZGF5LmV2ZW50Q29sc1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWR1cmF0aW9uLWV2ZW50ICpuZ0Zvcj1cImxldCBldmVudCBvZiBjb2wuZXZlbnRzXCIgW2V2ZW50XT1cImV2ZW50XCIgW2RhdGVdPVwiZGF5LmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudENsaWNrKT1cIm9uRXZlbnRDbGljaygkZXZlbnQpXCI+PC9saWItZHVyYXRpb24tZXZlbnQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuPC9kaXY+Il19