ms-time-sheet 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/badge-overflow/badge-overflow.component.mjs +123 -0
- package/esm2022/lib/ms-time-sheet.component.mjs +170 -18
- package/fesm2022/ms-time-sheet.mjs +289 -19
- package/fesm2022/ms-time-sheet.mjs.map +1 -1
- package/lib/components/badge-overflow/badge-overflow.component.d.ts +45 -0
- package/lib/ms-time-sheet.component.d.ts +20 -2
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class BadgeOverflowComponent {
|
|
6
|
+
constructor(elementRef, cdr) {
|
|
7
|
+
this.elementRef = elementRef;
|
|
8
|
+
this.cdr = cdr;
|
|
9
|
+
this.badges = [];
|
|
10
|
+
this.maxWidth = 200;
|
|
11
|
+
this.badgeMouseEnter = new EventEmitter();
|
|
12
|
+
this.badgeMouseLeave = new EventEmitter();
|
|
13
|
+
this.overflowCountClick = new EventEmitter();
|
|
14
|
+
this.visibleBadges = [];
|
|
15
|
+
this.overflowBadges = [];
|
|
16
|
+
this.overflowCount = 0;
|
|
17
|
+
this.resizeObserver = null;
|
|
18
|
+
this.containerElement = null;
|
|
19
|
+
}
|
|
20
|
+
ngAfterViewInit() {
|
|
21
|
+
this.containerElement = this.elementRef.nativeElement.querySelector('.badge-overflow-container');
|
|
22
|
+
this.setupResizeObserver();
|
|
23
|
+
this.updateBadgeVisibility();
|
|
24
|
+
}
|
|
25
|
+
ngOnDestroy() {
|
|
26
|
+
if (this.resizeObserver) {
|
|
27
|
+
this.resizeObserver.disconnect();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
setupResizeObserver() {
|
|
31
|
+
if (!this.containerElement)
|
|
32
|
+
return;
|
|
33
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
34
|
+
this.updateBadgeVisibility();
|
|
35
|
+
});
|
|
36
|
+
// Observe the parent container for width changes
|
|
37
|
+
const parentElement = this.elementRef.nativeElement.parentElement;
|
|
38
|
+
if (parentElement) {
|
|
39
|
+
this.resizeObserver.observe(parentElement);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
updateBadgeVisibility() {
|
|
43
|
+
if (!this.containerElement || !this.badges.length)
|
|
44
|
+
return;
|
|
45
|
+
const containerWidth = this.containerElement.parentElement?.clientWidth || this.maxWidth;
|
|
46
|
+
let totalWidth = 0;
|
|
47
|
+
const visible = [];
|
|
48
|
+
const overflow = [];
|
|
49
|
+
// Calculate width needed for each badge
|
|
50
|
+
for (let i = 0; i < this.badges.length; i++) {
|
|
51
|
+
const badge = this.badges[i];
|
|
52
|
+
const badgeWidth = this.estimateBadgeWidth(badge);
|
|
53
|
+
if (totalWidth + badgeWidth <= containerWidth || visible.length === 0) {
|
|
54
|
+
visible.push(badge);
|
|
55
|
+
totalWidth += badgeWidth + 4; // +4 for gap
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
overflow.push(badge);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// If we have overflow, check if we need to show count badge
|
|
62
|
+
if (overflow.length > 0) {
|
|
63
|
+
const countBadgeWidth = this.estimateCountBadgeWidth(overflow.length);
|
|
64
|
+
const lastVisibleIndex = visible.length - 1;
|
|
65
|
+
// If adding count badge would exceed width, remove one more visible badge
|
|
66
|
+
if (totalWidth + countBadgeWidth > containerWidth && visible.length > 1) {
|
|
67
|
+
const removedBadge = visible.pop();
|
|
68
|
+
if (removedBadge) {
|
|
69
|
+
overflow.unshift(removedBadge);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
this.visibleBadges = visible;
|
|
74
|
+
this.overflowBadges = overflow;
|
|
75
|
+
this.overflowCount = overflow.length;
|
|
76
|
+
this.cdr.detectChanges();
|
|
77
|
+
}
|
|
78
|
+
estimateBadgeWidth(badge) {
|
|
79
|
+
// Rough estimation: text length * 8px per character + padding
|
|
80
|
+
const textWidth = badge.text.length * 8;
|
|
81
|
+
const padding = 16; // 8px left + 8px right
|
|
82
|
+
return textWidth + padding;
|
|
83
|
+
}
|
|
84
|
+
estimateCountBadgeWidth(count) {
|
|
85
|
+
const text = `+${count}`;
|
|
86
|
+
const textWidth = text.length * 8;
|
|
87
|
+
const padding = 16;
|
|
88
|
+
return textWidth + padding;
|
|
89
|
+
}
|
|
90
|
+
getOverflowTooltip() {
|
|
91
|
+
return this.overflowBadges.map(b => b.text).join(', ');
|
|
92
|
+
}
|
|
93
|
+
onBadgeMouseEnter(event, badge) {
|
|
94
|
+
this.badgeMouseEnter.emit({ event, badge });
|
|
95
|
+
}
|
|
96
|
+
onBadgeMouseLeave(event, badge) {
|
|
97
|
+
this.badgeMouseLeave.emit({ event, badge });
|
|
98
|
+
}
|
|
99
|
+
onOverflowCountClick(event) {
|
|
100
|
+
this.overflowCountClick.emit({ event, overflowBadges: this.overflowBadges });
|
|
101
|
+
}
|
|
102
|
+
// In BadgeOverflowComponent
|
|
103
|
+
refresh() {
|
|
104
|
+
this.updateBadgeVisibility();
|
|
105
|
+
}
|
|
106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeOverflowComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
107
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BadgeOverflowComponent, isStandalone: true, selector: "app-badge-overflow", inputs: { badges: "badges", maxWidth: "maxWidth" }, outputs: { badgeMouseEnter: "badgeMouseEnter", badgeMouseLeave: "badgeMouseLeave", overflowCountClick: "overflowCountClick" }, ngImport: i0, template: "<div class=\"badge-overflow-container\" #container>\r\n <span\r\n *ngFor=\"let badge of visibleBadges; let i = index\"\r\n class=\"badge\"\r\n [class]=\"badge.class || 'badge-secondary'\"\r\n \r\n (mouseenter)=\"onBadgeMouseEnter($event, badge)\"\r\n (mouseleave)=\"onBadgeMouseLeave($event, badge)\"\r\n >\r\n {{ badge.text }}\r\n </span>\r\n <span\r\n *ngIf=\"overflowCount > 0\"\r\n class=\"badge badge-overflow-count\"\r\n [title]=\"getOverflowTooltip()\"\r\n (click)=\"onOverflowCountClick($event)\"\r\n >\r\n +{{ overflowCount }}\r\n </span>\r\n</div>", styles: [".badge-overflow-container{display:flex;flex-wrap:nowrap;gap:4px;align-items:center;min-width:0;overflow:hidden;width:100%}.badge{flex-shrink:0;white-space:nowrap;font-size:12px;padding:4px 8px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:600;line-height:1;text-transform:uppercase;letter-spacing:.5px;transition:all .3s cubic-bezier(.4,0,.2,1);border:2px solid transparent;width:32px;height:32px;box-sizing:border-box;cursor:pointer;transform:translateZ(0);will-change:transform,box-shadow,background-color;backface-visibility:hidden;color:#fff!important;&:hover{transform:scale(1.15) translateY(-2px);box-shadow:0 6px 16px #007bff40}&:active{transform:scale(1.08) translateY(-1px);transition-duration:.15s}}.break-color-paid{background-color:#4caf50!important;border-color:#4caf50!important}.break-color-unpaid{background-color:#f44336!important;border-color:#f44336!important}.break-color-lunch{background-color:#2196f3!important;border-color:#2196f3!important}.break-color-default{background-color:#f44336!important;border-color:#f44336!important}.badge-overflow-count{background-color:#6c757d!important;color:#fff!important;cursor:pointer;border:2px solid #6c757d!important;flex-shrink:0;border-radius:50%;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);transform:translateZ(0);will-change:transform,box-shadow,background-color;backface-visibility:hidden;font-size:12px;line-height:1;text-transform:uppercase;letter-spacing:.5px;&:hover{background-color:#5a6268!important;border-color:#5a6268!important;transform:scale(1.15) translateY(-2px);box-shadow:0 6px 16px #007bff40}&:active{transform:scale(1.08) translateY(-1px);transition-duration:.15s}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
108
|
+
}
|
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeOverflowComponent, decorators: [{
|
|
110
|
+
type: Component,
|
|
111
|
+
args: [{ selector: 'app-badge-overflow', standalone: true, imports: [CommonModule], template: "<div class=\"badge-overflow-container\" #container>\r\n <span\r\n *ngFor=\"let badge of visibleBadges; let i = index\"\r\n class=\"badge\"\r\n [class]=\"badge.class || 'badge-secondary'\"\r\n \r\n (mouseenter)=\"onBadgeMouseEnter($event, badge)\"\r\n (mouseleave)=\"onBadgeMouseLeave($event, badge)\"\r\n >\r\n {{ badge.text }}\r\n </span>\r\n <span\r\n *ngIf=\"overflowCount > 0\"\r\n class=\"badge badge-overflow-count\"\r\n [title]=\"getOverflowTooltip()\"\r\n (click)=\"onOverflowCountClick($event)\"\r\n >\r\n +{{ overflowCount }}\r\n </span>\r\n</div>", styles: [".badge-overflow-container{display:flex;flex-wrap:nowrap;gap:4px;align-items:center;min-width:0;overflow:hidden;width:100%}.badge{flex-shrink:0;white-space:nowrap;font-size:12px;padding:4px 8px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:600;line-height:1;text-transform:uppercase;letter-spacing:.5px;transition:all .3s cubic-bezier(.4,0,.2,1);border:2px solid transparent;width:32px;height:32px;box-sizing:border-box;cursor:pointer;transform:translateZ(0);will-change:transform,box-shadow,background-color;backface-visibility:hidden;color:#fff!important;&:hover{transform:scale(1.15) translateY(-2px);box-shadow:0 6px 16px #007bff40}&:active{transform:scale(1.08) translateY(-1px);transition-duration:.15s}}.break-color-paid{background-color:#4caf50!important;border-color:#4caf50!important}.break-color-unpaid{background-color:#f44336!important;border-color:#f44336!important}.break-color-lunch{background-color:#2196f3!important;border-color:#2196f3!important}.break-color-default{background-color:#f44336!important;border-color:#f44336!important}.badge-overflow-count{background-color:#6c757d!important;color:#fff!important;cursor:pointer;border:2px solid #6c757d!important;flex-shrink:0;border-radius:50%;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);transform:translateZ(0);will-change:transform,box-shadow,background-color;backface-visibility:hidden;font-size:12px;line-height:1;text-transform:uppercase;letter-spacing:.5px;&:hover{background-color:#5a6268!important;border-color:#5a6268!important;transform:scale(1.15) translateY(-2px);box-shadow:0 6px 16px #007bff40}&:active{transform:scale(1.08) translateY(-1px);transition-duration:.15s}}\n"] }]
|
|
112
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { badges: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], maxWidth: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], badgeMouseEnter: [{
|
|
117
|
+
type: Output
|
|
118
|
+
}], badgeMouseLeave: [{
|
|
119
|
+
type: Output
|
|
120
|
+
}], overflowCountClick: [{
|
|
121
|
+
type: Output
|
|
122
|
+
}] } });
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2Utb3ZlcmZsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXMtdGltZS1zaGVldC9zcmMvbGliL2NvbXBvbmVudHMvYmFkZ2Utb3ZlcmZsb3cvYmFkZ2Utb3ZlcmZsb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXMtdGltZS1zaGVldC9zcmMvbGliL2NvbXBvbmVudHMvYmFkZ2Utb3ZlcmZsb3cvYmFkZ2Utb3ZlcmZsb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBMkQsTUFBTSxlQUFlLENBQUM7QUFDaEksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFxSC9DLE1BQU0sT0FBTyxzQkFBc0I7SUFjakMsWUFDVSxVQUFzQixFQUN0QixHQUFzQjtRQUR0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBZnZCLFdBQU0sR0FBZ0IsRUFBRSxDQUFDO1FBQ3pCLGFBQVEsR0FBVyxHQUFHLENBQUM7UUFDdEIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBeUMsQ0FBQztRQUM1RSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUF5QyxDQUFDO1FBQzVFLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFzRCxDQUFDO1FBRXRHLGtCQUFhLEdBQWdCLEVBQUUsQ0FBQztRQUNoQyxtQkFBYyxHQUFnQixFQUFFLENBQUM7UUFDakMsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFFVixtQkFBYyxHQUEwQixJQUFJLENBQUM7UUFDN0MscUJBQWdCLEdBQXVCLElBQUksQ0FBQztJQUtqRCxDQUFDO0lBRUosZUFBZTtRQUNiLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMs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QWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsNEJBQTRCO0lBQzlCLE9BQU87UUFDTCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQXRIWSxzQkFBc0I7bUdBQXRCLHNCQUFzQixpUUN0SG5DLHlsQkFtQk0sOHpERE5NLFlBQVk7OzRGQXlHWCxzQkFBc0I7a0JBNUdsQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7K0dBMEdkLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCYWRnZUl0ZW0ge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBjbGFzcz86IHN0cmluZztcclxuICB0b29sdGlwPzogc3RyaW5nO1xyXG4gIGRhdGE/OiBhbnk7IC8vIEFkZGl0aW9uYWwgZGF0YSBmb3IgY2FsbGJhY2tzXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhZGdlLW92ZXJmbG93JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYWRnZS1vdmVyZmxvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmJhZGdlLW92ZXJmbG93LWNvbnRhaW5lciB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgICBnYXA6IDRweDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgbWluLXdpZHRoOiAwO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAuYmFkZ2Uge1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICBwYWRkaW5nOiA0cHggOHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7IC8qIE1ha2UgYmFkZ2VzIGNpcmN1bGFyIGxpa2UgY2lyY2xlLXZhbHVlICovXHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDsgLyogTWF0Y2ggY2lyY2xlLXZhbHVlIGZvbnQtd2VpZ2h0ICovXHJcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xyXG4gICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7IC8qIE1hdGNoIGNpcmNsZS12YWx1ZSB0cmFuc2l0aW9uICovXHJcbiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OyAvKiBNYXRjaCBjaXJjbGUtdmFsdWUgYm9yZGVyIHN0eWxlICovXHJcbiAgICAgIHdpZHRoOiAzMnB4OyAvKiBGaXhlZCBjaXJjdWxhciBzaXplICovXHJcbiAgICAgIGhlaWdodDogMzJweDsgLyogRml4ZWQgY2lyY3VsYXIgc2l6ZSAqL1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7IC8qIE1hdGNoIGNpcmNsZS12YWx1ZSBjdXJzb3IgKi9cclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOyAvKiBIYXJkd2FyZSBhY2NlbGVyYXRpb24gKi9cclxuICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgYm94LXNoYWRvdywgYmFja2dyb3VuZC1jb2xvcjtcclxuICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcclxuXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xNSkgdHJhbnNsYXRlWSgtMnB4KTsgLyogTWF0Y2ggY2lyY2xlLXZhbHVlIGhvdmVyIGVmZmVjdCAqL1xyXG4gICAgICAgIGJveC1zaGFkb3c6IDAgNnB4IDE2cHggcmdiYSgwLCAxMjMsIDI1NSwgMC4yNSk7IC8qIE1hdGNoIGNpcmNsZS12YWx1ZSBzaGFkb3cgKi9cclxuICAgICAgfVxyXG5cclxuICAgICAgJjphY3RpdmUge1xyXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wOCkgdHJhbnNsYXRlWSgtMXB4KTsgLyogTWF0Y2ggY2lyY2xlLXZhbHVlIGFjdGl2ZSBlZmZlY3QgKi9cclxuICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE1cztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIEJyZWFrIGNvbG9yIGNsYXNzZXMgZm9yIHByb3BlciBiYWRnZSBjb2xvcmluZyAqL1xyXG4gICAgLmJyZWFrLWNvbG9yLXBhaWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNENBRjUwICFpbXBvcnRhbnQ7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzRDQUY1MCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5icmVhay1jb2xvci11bnBhaWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjQ0MzM2ICFpbXBvcnRhbnQ7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogI0Y0NDMzNiAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5icmVhay1jb2xvci1sdW5jaCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMTk2RjMgIWltcG9ydGFudDtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjMjE5NkYzICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmJyZWFrLWNvbG9yLWRlZmF1bHQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjQ0MzM2ICFpbXBvcnRhbnQ7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogI0Y0NDMzNiAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5iYWRnZS1vdmVyZmxvdy1jb3VudCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2Yzc1N2QgIWltcG9ydGFudDtcclxuICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgYm9yZGVyOiAycHggc29saWQgIzZjNzU3ZCAhaW1wb3J0YW50OyAvKiBNYXRjaCBjaXJjdWxhciBib3JkZXIgc3R5bGUgKi9cclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsgLyogTWFrZSBjb3VudCBiYWRnZSBjaXJjdWxhciB0b28gKi9cclxuICAgICAgd2lkdGg6IDMycHg7IC8qIE1hdGNoIHNpemUgKi9cclxuICAgICAgaGVpZ2h0OiAzMnB4OyAvKiBNYXRjaCBzaXplICovXHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDsgLyogTWF0Y2ggZm9udC13ZWlnaHQgKi9cclxuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsgLyogTWF0Y2ggdHJhbnNpdGlvbiAqL1xyXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XHJcbiAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIGJveC1zaGFkb3csIGJhY2tncm91bmQtY29sb3I7XHJcbiAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcclxuICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICBsaW5lLWhlaWdodDogMTtcclxuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcclxuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xyXG5cclxuICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzVhNjI2OCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogIzVhNjI2OCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xNSkgdHJhbnNsYXRlWSgtMnB4KTsgLyogTWF0Y2ggaG92ZXIgZWZmZWN0ICovXHJcbiAgICAgICAgYm94LXNoYWRvdzogMCA2cHggMTZweCByZ2JhKDAsIDEyMywgMjU1LCAwLjI1KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJjphY3RpdmUge1xyXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wOCkgdHJhbnNsYXRlWSgtMXB4KTtcclxuICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE1cztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYWRnZU92ZXJmbG93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBiYWRnZXM6IEJhZGdlSXRlbVtdID0gW107XHJcbiAgQElucHV0KCkgbWF4V2lkdGg6IG51bWJlciA9IDIwMDtcclxuICBAT3V0cHV0KCkgYmFkZ2VNb3VzZUVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7ZXZlbnQ6IE1vdXNlRXZlbnQsIGJhZGdlOiBCYWRnZUl0ZW19PigpO1xyXG4gIEBPdXRwdXQoKSBiYWRnZU1vdXNlTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHtldmVudDogTW91c2VFdmVudCwgYmFkZ2U6IEJhZGdlSXRlbX0+KCk7XHJcbiAgQE91dHB1dCgpIG92ZXJmbG93Q291bnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgb3ZlcmZsb3dCYWRnZXM6IEJhZGdlSXRlbVtdIH0+KCk7XHJcblxyXG4gIHZpc2libGVCYWRnZXM6IEJhZGdlSXRlbVtdID0gW107XHJcbiAgb3ZlcmZsb3dCYWRnZXM6IEJhZGdlSXRlbVtdID0gW107XHJcbiAgb3ZlcmZsb3dDb3VudCA9IDA7XHJcblxyXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmJhZGdlLW92ZXJmbG93LWNvbnRhaW5lcicpO1xyXG4gICAgdGhpcy5zZXR1cFJlc2l6ZU9ic2VydmVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUJhZGdlVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBSZXNpemVPYnNlcnZlcigpIHtcclxuICAgIGlmICghdGhpcy5jb250YWluZXJFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlQmFkZ2VWaXNpYmlsaXR5KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBPYnNlcnZlIHRoZSBwYXJlbnQgY29udGFpbmVyIGZvciB3aWR0aCBjaGFuZ2VzXHJcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIGlmIChwYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShwYXJlbnRFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQmFkZ2VWaXNpYmlsaXR5KCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lckVsZW1lbnQgfHwgIXRoaXMuYmFkZ2VzLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbGVtZW50LnBhcmVudEVsZW1lbnQ/LmNsaWVudFdpZHRoIHx8IHRoaXMubWF4V2lkdGg7XHJcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICBjb25zdCB2aXNpYmxlOiBCYWRnZUl0ZW1bXSA9IFtdO1xyXG4gICAgY29uc3Qgb3ZlcmZsb3c6IEJhZGdlSXRlbVtdID0gW107XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIG5lZWRlZCBmb3IgZWFjaCBiYWRnZVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJhZGdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBiYWRnZSA9IHRoaXMuYmFkZ2VzW2ldO1xyXG4gICAgICBjb25zdCBiYWRnZVdpZHRoID0gdGhpcy5lc3RpbWF0ZUJhZGdlV2lkdGgoYmFkZ2UpO1xyXG5cclxuICAgICAgaWYgKHRvdGFsV2lkdGggKyBiYWRnZVdpZHRoIDw9IGNvbnRhaW5lcldpZHRoIHx8IHZpc2libGUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdmlzaWJsZS5wdXNoKGJhZGdlKTtcclxuICAgICAgICB0b3RhbFdpZHRoICs9IGJhZGdlV2lkdGggKyA0OyAvLyArNCBmb3IgZ2FwXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3ZlcmZsb3cucHVzaChiYWRnZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3ZSBoYXZlIG92ZXJmbG93LCBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgY291bnQgYmFkZ2VcclxuICAgIGlmIChvdmVyZmxvdy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGNvdW50QmFkZ2VXaWR0aCA9IHRoaXMuZXN0aW1hdGVDb3VudEJhZGdlV2lkdGgob3ZlcmZsb3cubGVuZ3RoKTtcclxuICAgICAgY29uc3QgbGFzdFZpc2libGVJbmRleCA9IHZpc2libGUubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgIC8vIElmIGFkZGluZyBjb3VudCBiYWRnZSB3b3VsZCBleGNlZWQgd2lkdGgsIHJlbW92ZSBvbmUgbW9yZSB2aXNpYmxlIGJhZGdlXHJcbiAgICAgIGlmICh0b3RhbFdpZHRoICsgY291bnRCYWRnZVdpZHRoID4gY29udGFpbmVyV2lkdGggJiYgdmlzaWJsZS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZEJhZGdlID0gdmlzaWJsZS5wb3AoKTtcclxuICAgICAgICBpZiAocmVtb3ZlZEJhZGdlKSB7XHJcbiAgICAgICAgICBvdmVyZmxvdy51bnNoaWZ0KHJlbW92ZWRCYWRnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aXNpYmxlQmFkZ2VzID0gdmlzaWJsZTtcclxuICAgIHRoaXMub3ZlcmZsb3dCYWRnZXMgPSBvdmVyZmxvdztcclxuICAgIHRoaXMub3ZlcmZsb3dDb3VudCA9IG92ZXJmbG93Lmxlbmd0aDtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXN0aW1hdGVCYWRnZVdpZHRoKGJhZGdlOiBCYWRnZUl0ZW0pOiBudW1iZXIge1xyXG4gICAgLy8gUm91Z2ggZXN0aW1hdGlvbjogdGV4dCBsZW5ndGggKiA4cHggcGVyIGNoYXJhY3RlciArIHBhZGRpbmdcclxuICAgIGNvbnN0IHRleHRXaWR0aCA9IGJhZGdlLnRleHQubGVuZ3RoICogODtcclxuICAgIGNvbnN0IHBhZGRpbmcgPSAxNjsgLy8gOHB4IGxlZnQgKyA4cHggcmlnaHRcclxuICAgIHJldHVybiB0ZXh0V2lkdGggKyBwYWRkaW5nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc3RpbWF0ZUNvdW50QmFkZ2VXaWR0aChjb3VudDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHRleHQgPSBgKyR7Y291bnR9YDtcclxuICAgIGNvbnN0IHRleHRXaWR0aCA9IHRleHQubGVuZ3RoICogODtcclxuICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcclxuICAgIHJldHVybiB0ZXh0V2lkdGggKyBwYWRkaW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3ZlcmZsb3dUb29sdGlwKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0JhZGdlcy5tYXAoYiA9PiBiLnRleHQpLmpvaW4oJywgJyk7XHJcbiAgfVxyXG5cclxuICBvbkJhZGdlTW91c2VFbnRlcihldmVudDogTW91c2VFdmVudCwgYmFkZ2U6IEJhZGdlSXRlbSkge1xyXG4gICAgdGhpcy5iYWRnZU1vdXNlRW50ZXIuZW1pdCh7IGV2ZW50LCBiYWRnZSB9KTtcclxuICB9XHJcblxyXG4gIG9uQmFkZ2VNb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50LCBiYWRnZTogQmFkZ2VJdGVtKSB7XHJcbiAgICB0aGlzLmJhZGdlTW91c2VMZWF2ZS5lbWl0KHsgZXZlbnQsIGJhZGdlIH0pO1xyXG4gIH1cclxuXHJcbiAgb25PdmVyZmxvd0NvdW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMub3ZlcmZsb3dDb3VudENsaWNrLmVtaXQoeyBldmVudCwgb3ZlcmZsb3dCYWRnZXM6IHRoaXMub3ZlcmZsb3dCYWRnZXMgfSk7XHJcbiAgfVxyXG4gIC8vIEluIEJhZGdlT3ZlcmZsb3dDb21wb25lbnRcclxucmVmcmVzaCgpIHtcclxuICB0aGlzLnVwZGF0ZUJhZGdlVmlzaWJpbGl0eSgpO1xyXG59XHJcbn0iLCI8ZGl2IGNsYXNzPVwiYmFkZ2Utb3ZlcmZsb3ctY29udGFpbmVyXCIgI2NvbnRhaW5lcj5cclxuICA8c3BhblxyXG4gICAgKm5nRm9yPVwibGV0IGJhZGdlIG9mIHZpc2libGVCYWRnZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgY2xhc3M9XCJiYWRnZVwiXHJcbiAgICBbY2xhc3NdPVwiYmFkZ2UuY2xhc3MgfHwgJ2JhZGdlLXNlY29uZGFyeSdcIlxyXG4gICAgXHJcbiAgICAobW91c2VlbnRlcik9XCJvbkJhZGdlTW91c2VFbnRlcigkZXZlbnQsIGJhZGdlKVwiXHJcbiAgICAobW91c2VsZWF2ZSk9XCJvbkJhZGdlTW91c2VMZWF2ZSgkZXZlbnQsIGJhZGdlKVwiXHJcbiAgPlxyXG4gICAge3sgYmFkZ2UudGV4dCB9fVxyXG4gIDwvc3Bhbj5cclxuICA8c3BhblxyXG4gICAgKm5nSWY9XCJvdmVyZmxvd0NvdW50ID4gMFwiXHJcbiAgICBjbGFzcz1cImJhZGdlIGJhZGdlLW92ZXJmbG93LWNvdW50XCJcclxuICAgIFt0aXRsZV09XCJnZXRPdmVyZmxvd1Rvb2x0aXAoKVwiXHJcbiAgICAoY2xpY2spPVwib25PdmVyZmxvd0NvdW50Q2xpY2soJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgK3t7IG92ZXJmbG93Q291bnQgfX1cclxuICA8L3NwYW4+XHJcbjwvZGl2PiJdfQ==
|