@ngutil/aria 0.0.80 → 0.0.82
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/fesm2022/ngutil-aria.mjs +88 -65
- package/fesm2022/ngutil-aria.mjs.map +1 -1
- package/focus/focus-state.directive.d.ts +1 -2
- package/focus/focus.service.d.ts +1 -1
- package/focus/focusable.directive.d.ts +0 -1
- package/package.json +7 -9
- package/ui-state/abstract.d.ts +1 -1
- package/ui-state/dirty.directive.d.ts +9 -0
- package/ui-state/index.d.ts +5 -3
- package/ui-state/progress-state.d.ts +1 -1
- package/esm2022/activity/activity.service.mjs +0 -49
- package/esm2022/activity/index.mjs +0 -2
- package/esm2022/focus/focus-state.directive.mjs +0 -63
- package/esm2022/focus/focus-trap.directive.mjs +0 -25
- package/esm2022/focus/focus.service.mjs +0 -145
- package/esm2022/focus/focusable.directive.mjs +0 -52
- package/esm2022/focus/index.mjs +0 -5
- package/esm2022/gestures/gesture-drag.mjs +0 -81
- package/esm2022/gestures/gesture-event.mjs +0 -44
- package/esm2022/gestures/gesture-longtap.mjs +0 -34
- package/esm2022/gestures/gesture-tap.mjs +0 -37
- package/esm2022/gestures/gesture.mjs +0 -66
- package/esm2022/gestures/gesture.service.mjs +0 -279
- package/esm2022/gestures/index.mjs +0 -7
- package/esm2022/index.mjs +0 -6
- package/esm2022/keystroke/index.mjs +0 -2
- package/esm2022/keystroke/keystroke.service.mjs +0 -92
- package/esm2022/ngutil-aria.mjs +0 -5
- package/esm2022/ui-state/abstract.mjs +0 -41
- package/esm2022/ui-state/busy.directive.mjs +0 -27
- package/esm2022/ui-state/disabled.directive.mjs +0 -28
- package/esm2022/ui-state/index.mjs +0 -25
- package/esm2022/ui-state/progress-state.mjs +0 -141
- package/esm2022/ui-state/readonly.directive.mjs +0 -27
- package/esm2022/ui-state/selector.mjs +0 -308
- package/esm2022/ui-state/ui-state.mjs +0 -91
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from "@angular/common";
|
|
2
|
-
import { inject, Injectable, NgZone } from "@angular/core";
|
|
3
|
-
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
|
4
|
-
import { combineLatest, connect, debounceTime, filter, finalize, map, merge, Observable, scan, share, startWith, Subject, switchMap, takeWhile, tap } from "rxjs";
|
|
5
|
-
import { __zone_symbol__, coerceElement, isFalsy, isTruthy } from "@ngutil/common";
|
|
6
|
-
import { Listeners } from "./gesture-event";
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
const ADD_EVENT_LISTENER = __zone_symbol__("addEventListener");
|
|
9
|
-
const REMOVE_EVENT_LISTENER = __zone_symbol__("removeEventListener");
|
|
10
|
-
const DISPATCH_EVENT = __zone_symbol__("dispatchEvent");
|
|
11
|
-
const SCROLL_LISTENER_OPTIONS = { passive: true, capture: true };
|
|
12
|
-
export class GestureService {
|
|
13
|
-
#zone = inject(NgZone);
|
|
14
|
-
#document = inject(DOCUMENT);
|
|
15
|
-
#watchers = [];
|
|
16
|
-
#trigger = new Subject();
|
|
17
|
-
#moving = merge(...Object.keys(Listeners)
|
|
18
|
-
.filter(name => Listeners[name].phase === "moving" /* GesturePhase.Moving */)
|
|
19
|
-
.map(name => this.#listen(name, Listeners[name]))).pipe(share());
|
|
20
|
-
#end = merge(...Object.keys(Listeners)
|
|
21
|
-
.filter(name => Listeners[name].phase === "end" /* GesturePhase.End */)
|
|
22
|
-
.map(name => this.#listen(name, Listeners[name]))).pipe(share());
|
|
23
|
-
#eventStream = merge(this.#moving, this.#end).pipe(share());
|
|
24
|
-
#begin = new Observable((dst) => {
|
|
25
|
-
let pointerType;
|
|
26
|
-
return this.#trigger
|
|
27
|
-
.pipe(filter(event => {
|
|
28
|
-
if (pointerType == null) {
|
|
29
|
-
pointerType = event.pointerType;
|
|
30
|
-
}
|
|
31
|
-
return event.pointerType === pointerType;
|
|
32
|
-
}), connect(events => merge(events,
|
|
33
|
-
// reset pointerType on end, after 200ms, because touchend is maybe followed by a mouse event
|
|
34
|
-
this.#end.pipe(debounceTime(200), tap(() => {
|
|
35
|
-
pointerType = undefined;
|
|
36
|
-
this.#enableTouchAction();
|
|
37
|
-
}), filter(() => false)))),
|
|
38
|
-
// Select active watchers
|
|
39
|
-
map((detail) => {
|
|
40
|
-
updatePointers(detail);
|
|
41
|
-
const eventTarget = detail.origin.target;
|
|
42
|
-
detail.target = eventTarget;
|
|
43
|
-
let includeScrollDistance = false;
|
|
44
|
-
const gestures = this.#watchers
|
|
45
|
-
.filter(({ gesture, el }) => (el === eventTarget || ("contains" in el && el.contains(eventTarget))) &&
|
|
46
|
-
gesture.shouldCapture(detail))
|
|
47
|
-
.reduce((gestures, { gesture }) => {
|
|
48
|
-
if (!gestures.has(gesture)) {
|
|
49
|
-
includeScrollDistance = includeScrollDistance || gesture.includeScrollDistance;
|
|
50
|
-
gestures.set(gesture, 0 /* GestureCaptureState.Unchecked */);
|
|
51
|
-
}
|
|
52
|
-
return gestures;
|
|
53
|
-
}, new Map());
|
|
54
|
-
return { detail: detail, gestures, includeScrollDistance };
|
|
55
|
-
}), filter(({ gestures }) => gestures.size > 0), tap(this.#disableTouchAction)
|
|
56
|
-
// finalize(() => console.log("FINALIZE BEGIN"))
|
|
57
|
-
)
|
|
58
|
-
.subscribe(dst);
|
|
59
|
-
});
|
|
60
|
-
#gesture = this.#begin.pipe(switchMap(({ detail: startEvent, gestures, includeScrollDistance }) => {
|
|
61
|
-
const pointerType = startEvent.pointerType;
|
|
62
|
-
const startAt = startEvent.origin.timeStamp;
|
|
63
|
-
const targetEl = startEvent.origin.target;
|
|
64
|
-
const dispatchEvent = targetEl[DISPATCH_EVENT].bind(targetEl);
|
|
65
|
-
const eventStreamInit = this.#eventStream.pipe(startWith(startEvent), filter(event => event.pointerType === pointerType));
|
|
66
|
-
const eventStreamSource = !includeScrollDistance
|
|
67
|
-
? eventStreamInit
|
|
68
|
-
: combineLatest([eventStreamInit, this.#scrollDistance(targetEl)]).pipe(map(([src, distance]) => {
|
|
69
|
-
;
|
|
70
|
-
src.scrollDistance = distance;
|
|
71
|
-
return src;
|
|
72
|
-
}));
|
|
73
|
-
const eventStream = eventStreamSource.pipe(scan((state, curr) => updatePointers({
|
|
74
|
-
...state,
|
|
75
|
-
...curr,
|
|
76
|
-
target: targetEl,
|
|
77
|
-
elapsed: curr.origin.timeStamp - startAt
|
|
78
|
-
}), startEvent), takeWhile(event => event.phase !== "end" /* GesturePhase.End */, true),
|
|
79
|
-
// finalize(() => console.log("FINALIZE STREAM")),
|
|
80
|
-
share());
|
|
81
|
-
const captureState = eventStream.pipe(connect(src => {
|
|
82
|
-
const state = { events: [], gestures, includeScrollDistance };
|
|
83
|
-
return merge(src.pipe(tap(event => state.events.push(event))), ...Array.from(gestures.keys())
|
|
84
|
-
.sort(sortByPripority)
|
|
85
|
-
.map(gesture => gesture.capture(src.pipe(filter(gesture.shouldCapture.bind(gesture)))).pipe(takeWhile(result => result !== 2 /* GestureCaptureState.Skip */, true), tap(result => gestures.set(gesture, result))))).pipe(map(() => state));
|
|
86
|
-
})
|
|
87
|
-
// finalize(() => console.log("FINALIZE CAPTURE"))
|
|
88
|
-
);
|
|
89
|
-
const selectGesture = captureState.pipe(map(state => {
|
|
90
|
-
const partitions = {};
|
|
91
|
-
for (const [gesture, captureState] of state.gestures) {
|
|
92
|
-
const partition = (partitions[captureState] ??= []);
|
|
93
|
-
partition.push(gesture);
|
|
94
|
-
}
|
|
95
|
-
if (partitions[4 /* GestureCaptureState.Instant */] != null) {
|
|
96
|
-
return {
|
|
97
|
-
gesture: partitions[4 /* GestureCaptureState.Instant */].sort(sortByPripority)[0],
|
|
98
|
-
events: state.events
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
// while not all gestures return from Gesture.capture
|
|
102
|
-
if (partitions[0 /* GestureCaptureState.Unchecked */] != null) {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
// while has pending, the capture is continued
|
|
106
|
-
if (partitions[1 /* GestureCaptureState.Pending */] != null) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
// no pendig & has maybe
|
|
110
|
-
if (partitions[3 /* GestureCaptureState.Maybe */] != null) {
|
|
111
|
-
return {
|
|
112
|
-
gesture: partitions[3 /* GestureCaptureState.Maybe */].sort(sortByPripority)[0],
|
|
113
|
-
events: state.events
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
// no pending & no maybe & no terminate
|
|
117
|
-
// so, nothign matched
|
|
118
|
-
return { events: state.events };
|
|
119
|
-
}), takeWhile(isFalsy, true), filter(isTruthy), takeWhile(v => v.gesture != null, false)
|
|
120
|
-
// tap((v: CaptureSelectState) => v.events.forEach(({ origin }) => preventDefault(origin)))
|
|
121
|
-
// finalize(() => console.log("FINALIZE SELECT"))
|
|
122
|
-
);
|
|
123
|
-
return selectGesture.pipe(switchMap(({ events, gesture }) => gesture
|
|
124
|
-
.handle(eventStream.pipe(startWith(...events), tap(({ origin }) => preventDefault(origin)), filter(gesture.isRelevantEvent.bind(gesture))))
|
|
125
|
-
.pipe(takeWhile(v => v.phase !== "end" /* GesturePhase.End */, true), tap(detail => dispatchEvent(new CustomEvent(gesture.type, { detail, bubbles: true, cancelable: true })))
|
|
126
|
-
// finalize(() => console.log("GESTURE FINALIZE"))
|
|
127
|
-
)),
|
|
128
|
-
// finalize(() => console.log("FINALIZE RESULT")),
|
|
129
|
-
finalize(this.#enableTouchAction));
|
|
130
|
-
}), share());
|
|
131
|
-
constructor() {
|
|
132
|
-
const triggers = merge(...Object.keys(Listeners)
|
|
133
|
-
.filter(name => Listeners[name].phase === "start" /* GesturePhase.Start */)
|
|
134
|
-
.map(name => this.#listen(name, Listeners[name])));
|
|
135
|
-
triggers.pipe(takeUntilDestroyed()).subscribe(this.#trigger);
|
|
136
|
-
}
|
|
137
|
-
listen(el, ...gestures) {
|
|
138
|
-
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
139
|
-
const element = coerceElement(el);
|
|
140
|
-
const next = dst.next.bind(dst);
|
|
141
|
-
for (const gesture of gestures) {
|
|
142
|
-
element[ADD_EVENT_LISTENER](gesture.type, next);
|
|
143
|
-
dst.add(element[REMOVE_EVENT_LISTENER].bind(element, gesture.type, next));
|
|
144
|
-
}
|
|
145
|
-
dst.add(this.#watch(element, ...gestures).subscribe());
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
148
|
-
#watch(el, ...gestures) {
|
|
149
|
-
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
150
|
-
const element = coerceElement(el);
|
|
151
|
-
const watchers = gestures.map(gesture => {
|
|
152
|
-
return { gesture, el: element };
|
|
153
|
-
});
|
|
154
|
-
this.#add(watchers);
|
|
155
|
-
dst.add(this.#gesture.subscribe(dst));
|
|
156
|
-
return () => {
|
|
157
|
-
this.#remove(watchers);
|
|
158
|
-
};
|
|
159
|
-
}));
|
|
160
|
-
}
|
|
161
|
-
#add(watchers) {
|
|
162
|
-
this.#watchers = this.#watchers.concat(watchers);
|
|
163
|
-
}
|
|
164
|
-
#remove(watchers) {
|
|
165
|
-
this.#watchers = this.#watchers.filter(v => !watchers.includes(v));
|
|
166
|
-
}
|
|
167
|
-
#listen(name, config) {
|
|
168
|
-
const { phase, pointerType, options } = config;
|
|
169
|
-
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
170
|
-
const listener = (origin) => {
|
|
171
|
-
if (origin.defaultPrevented) {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
dst.next({ origin, phase, pointerType });
|
|
175
|
-
};
|
|
176
|
-
// console.log("addEventListener", name)
|
|
177
|
-
this.#document[ADD_EVENT_LISTENER](name, listener, options);
|
|
178
|
-
return () => {
|
|
179
|
-
// console.log("removeEventListener", name)
|
|
180
|
-
this.#document[REMOVE_EVENT_LISTENER](name, listener, options);
|
|
181
|
-
};
|
|
182
|
-
}));
|
|
183
|
-
}
|
|
184
|
-
#scrollDistance(element) {
|
|
185
|
-
const scrollPosition = () => {
|
|
186
|
-
let x = 0;
|
|
187
|
-
let y = 0;
|
|
188
|
-
let p = element;
|
|
189
|
-
do {
|
|
190
|
-
x += p.scrollLeft ?? 0;
|
|
191
|
-
y += p.scrollTop ?? 0;
|
|
192
|
-
p = p.parentNode;
|
|
193
|
-
} while (p != null);
|
|
194
|
-
return { x, y };
|
|
195
|
-
};
|
|
196
|
-
return new Observable((dst) => this.#zone.runOutsideAngular(() => {
|
|
197
|
-
const initial = scrollPosition();
|
|
198
|
-
const listener = () => {
|
|
199
|
-
const current = scrollPosition();
|
|
200
|
-
dst.next({ x: current.x - initial.x, y: current.y - initial.y });
|
|
201
|
-
};
|
|
202
|
-
dst.next({ x: 0, y: 0 });
|
|
203
|
-
this.#document[ADD_EVENT_LISTENER]("scroll", listener, SCROLL_LISTENER_OPTIONS);
|
|
204
|
-
return () => {
|
|
205
|
-
this.#document[REMOVE_EVENT_LISTENER]("scroll", listener, SCROLL_LISTENER_OPTIONS);
|
|
206
|
-
};
|
|
207
|
-
}));
|
|
208
|
-
}
|
|
209
|
-
#lastTouchAction;
|
|
210
|
-
#disableTouchAction = () => {
|
|
211
|
-
if (this.#lastTouchAction == null) {
|
|
212
|
-
this.#lastTouchAction = window.getComputedStyle(this.#document.body).touchAction;
|
|
213
|
-
this.#document.body.style.touchAction = "none";
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
#enableTouchAction = () => {
|
|
217
|
-
if (this.#lastTouchAction != null) {
|
|
218
|
-
this.#document.body.style.touchAction = this.#lastTouchAction;
|
|
219
|
-
this.#lastTouchAction = undefined;
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
223
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, providedIn: "root" }); }
|
|
224
|
-
}
|
|
225
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, decorators: [{
|
|
226
|
-
type: Injectable,
|
|
227
|
-
args: [{ providedIn: "root" }]
|
|
228
|
-
}], ctorParameters: () => [] });
|
|
229
|
-
function sortByPripority(a, b) {
|
|
230
|
-
return b.priority - a.priority;
|
|
231
|
-
}
|
|
232
|
-
function pointersFromEvent(event) {
|
|
233
|
-
if (event instanceof MouseEvent) {
|
|
234
|
-
return [
|
|
235
|
-
{
|
|
236
|
-
x: event.clientX,
|
|
237
|
-
y: event.clientY
|
|
238
|
-
}
|
|
239
|
-
];
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
return Array.from(event.touches).map(t => {
|
|
243
|
-
return { x: t.clientX, y: t.clientY };
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
function updatePointers(state) {
|
|
248
|
-
if (state.phase === "start" /* GesturePhase.Start */) {
|
|
249
|
-
state.pointers = pointersFromEvent(state.origin).map(v => {
|
|
250
|
-
return { start: v, current: v, distance: { x: 0, y: 0 }, direction: { x: 0, y: 0 } };
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
else if (state.pointers) {
|
|
254
|
-
const pointers = pointersFromEvent(state.origin);
|
|
255
|
-
if (pointers.length === 0) {
|
|
256
|
-
return state;
|
|
257
|
-
}
|
|
258
|
-
state.pointers = state.pointers.map((v, i) => {
|
|
259
|
-
const p = pointers[i];
|
|
260
|
-
return {
|
|
261
|
-
start: v.start,
|
|
262
|
-
current: p,
|
|
263
|
-
distance: { x: p.x - v.start.x, y: p.y - v.start.y },
|
|
264
|
-
direction: { x: direction(v.start.x, p.x), y: direction(v.start.y, p.y) }
|
|
265
|
-
};
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
return state;
|
|
269
|
-
}
|
|
270
|
-
function direction(prev, curr) {
|
|
271
|
-
return curr > prev ? 1 : curr < prev ? -1 : 0;
|
|
272
|
-
}
|
|
273
|
-
function preventDefault(event) {
|
|
274
|
-
if (event.cancelable && !event.defaultPrevented) {
|
|
275
|
-
// console.log(`PREVENT ${event.type}`)
|
|
276
|
-
event.preventDefault();
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VzdHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvZ2VzdHVyZXMvZ2VzdHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFL0QsT0FBTyxFQUNILGFBQWEsRUFDYixPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEVBQ1YsSUFBSSxFQUNKLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUVQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNOLE1BQU0sTUFBTSxDQUFBO0FBSWIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUloRyxPQUFPLEVBTUgsU0FBUyxFQUNaLE1BQU0saUJBQWlCLENBQUE7O0FBRXhCLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUE7QUFDOUQsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUE7QUFvQ3ZELE1BQU0sdUJBQXVCLEdBQTRCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7QUFHekYsTUFBTSxPQUFPLGNBQWM7SUFDZCxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RCLFNBQVMsR0FBRyxN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RCxTQUFTLGNBQWMsQ0FBQyxLQUFZO0lBQ2hDLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLHVDQUF1QztRQUN2QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7SUFDMUIsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIlxuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIlxuXG5pbXBvcnQge1xuICAgIGNvbWJpbmVMYXRlc3QsXG4gICAgY29ubmVjdCxcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgZmlsdGVyLFxuICAgIGZpbmFsaXplLFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBPYnNlcnZhYmxlLFxuICAgIHNjYW4sXG4gICAgc2hhcmUsXG4gICAgc3RhcnRXaXRoLFxuICAgIFN1YmplY3QsXG4gICAgU3Vic2NyaWJlcixcbiAgICBzd2l0Y2hNYXAsXG4gICAgdGFrZVdoaWxlLFxuICAgIHRhcFxufSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IE11dGFibGUgfSBmcm9tIFwidXRpbGl0eS10eXBlc1wiXG5cbmltcG9ydCB7IF9fem9uZV9zeW1ib2xfXywgY29lcmNlRWxlbWVudCwgRWxlbWVudElucHV0LCBpc0ZhbHN5LCBpc1RydXRoeSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5pbXBvcnQgeyBQb3NpdGlvbiB9IGZyb20gXCJAbmd1dGlsL3N0eWxlXCJcblxuaW1wb3J0IHsgR2VzdHVyZSwgR2VzdHVyZUNhcHR1cmVTdGF0ZSwgR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vZ2VzdHVyZVwiXG5pbXBvcnQge1xuICAgIEdlc3R1cmVEZXRhaWwsXG4gICAgR2VzdHVyZUxpc3RlbmVyQ29uZmlnLFxuICAgIEdlc3R1cmVPcmlnaW4sXG4gICAgR2VzdHVyZVBoYXNlLFxuICAgIEdlc3R1cmVQb2ludGVyVHlwZSxcbiAgICBMaXN0ZW5lcnNcbn0gZnJvbSBcIi4vZ2VzdHVyZS1ldmVudFwiXG5cbmNvbnN0IEFERF9FVkVOVF9MSVNURU5FUiA9IF9fem9uZV9zeW1ib2xfXyhcImFkZEV2ZW50TGlzdGVuZXJcIilcbmNvbnN0IFJFTU9WRV9FVkVOVF9MSVNURU5FUiA9IF9fem9uZV9zeW1ib2xfXyhcInJlbW92ZUV2ZW50TGlzdGVuZXJcIilcbmNvbnN0IERJU1BBVENIX0VWRU5UID0gX196b25lX3N5bWJvbF9fKFwiZGlzcGF0Y2hFdmVudFwiKVxuXG50eXBlIEdlc3R1cmVzVG9FdmVudHNUeXBlPFQgZXh0ZW5kcyBBcnJheTxHZXN0dXJlPj4gPVxuICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBHPiA/IChHIGV4dGVuZHMgR2VzdHVyZSA/IEdlc3R1cmVFdmVudDxHPiA6IG5ldmVyKSA6IG5ldmVyXG5cbnR5cGUgR2VzdHVyZUV2ZW50RGlzY3JpbWluYXRvcjxUPiA9IFQgZXh0ZW5kcyB7IHR5cGU6IGluZmVyIE4gfSA/IHsgdHlwZTogTiB9ICYgVCA6IG5ldmVyXG5cbmV4cG9ydCB0eXBlIEdlc3R1cmVXYXRjaFJldHVybnM8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9IE9ic2VydmFibGU8XG4gICAgR2VzdHVyZUV2ZW50RGlzY3JpbWluYXRvcjxHZXN0dXJlc1RvRXZlbnRzVHlwZTxUPj5cbj5cblxuZXhwb3J0IHR5cGUgR2VzdHVyZUxpc3RlblJldHVybnM8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9IE9ic2VydmFibGU8R2VzdHVyZXNUb0V2ZW50c1R5cGU8VD4+XG5cbmludGVyZmFjZSBCZWdpblN0YXRlIHtcbiAgICBkZXRhaWw6IEdlc3R1cmVEZXRhaWxcbiAgICBnZXN0dXJlczogTWFwPEdlc3R1cmUsIEdlc3R1cmVDYXB0dXJlU3RhdGU+XG4gICAgaW5jbHVkZVNjcm9sbERpc3RhbmNlOiBib29sZWFuXG59XG5cbmludGVyZmFjZSBDYXB0dXJlU3RhdGUge1xuICAgIGV2ZW50czogR2VzdHVyZURldGFpbFtdXG4gICAgZ2VzdHVyZXM6IEJlZ2luU3RhdGVbXCJnZXN0dXJlc1wiXVxuICAgIGluY2x1ZGVTY3JvbGxEaXN0YW5jZTogQmVnaW5TdGF0ZVtcImluY2x1ZGVTY3JvbGxEaXN0YW5jZVwiXVxufVxuXG5pbnRlcmZhY2UgQ2FwdHVyZVNlbGVjdFN0YXRlIHtcbiAgICBldmVudHM6IEdlc3R1cmVEZXRhaWxbXVxuICAgIGdlc3R1cmU/OiBHZXN0dXJlXG4gICAgd2F0Y2hlcnM/OiBBcnJheTxXYXRjaGVyPlxufVxuXG5pbnRlcmZhY2UgV2F0Y2hlciB7XG4gICAgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50XG4gICAgcmVhZG9ubHkgZ2VzdHVyZTogR2VzdHVyZVxufVxuXG5jb25zdCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUsIGNhcHR1cmU6IHRydWUgfVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgR2VzdHVyZVNlcnZpY2Uge1xuICAgIHJlYWRvbmx5ICN6b25lID0gaW5qZWN0KE5nWm9uZSlcbiAgICByZWFkb25seSAjZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpXG5cbiAgICAjd2F0Y2hlcnM6IFdhdGNoZXJbXSA9IFtdXG4gICAgcmVhZG9ubHkgI3RyaWdnZXIgPSBuZXcgU3ViamVjdDxHZXN0dXJlRGV0YWlsPigpXG5cbiAgICByZWFkb25seSAjbW92aW5nOiBPYnNlcnZhYmxlPEdlc3R1cmVEZXRhaWw+ID0gbWVyZ2UoXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKExpc3RlbmVycylcbiAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiBMaXN0ZW5lcnNbbmFtZV0ucGhhc2UgPT09IEdlc3R1cmVQaGFzZS5Nb3ZpbmcpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy4jbGlzdGVuKG5hbWUsIExpc3RlbmVyc1tuYW1lXSkpXG4gICAgKS5waXBlKHNoYXJlKCkpXG5cbiAgICByZWFkb25seSAjZW5kOiBPYnNlcnZhYmxlPEdlc3R1cmVEZXRhaWw+ID0gbWVyZ2UoXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKExpc3RlbmVycylcbiAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiBMaXN0ZW5lcnNbbmFtZV0ucGhhc2UgPT09IEdlc3R1cmVQaGFzZS5FbmQpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy4jbGlzdGVuKG5hbWUsIExpc3RlbmVyc1tuYW1lXSkpXG4gICAgKS5waXBlKHNoYXJlKCkpXG5cbiAgICByZWFkb25seSAjZXZlbnRTdHJlYW0gPSBtZXJnZSh0aGlzLiNtb3ZpbmcsIHRoaXMuI2VuZCkucGlwZShzaGFyZSgpKVxuXG4gICAgcmVhZG9ubHkgI2JlZ2luID0gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxCZWdpblN0YXRlPikgPT4ge1xuICAgICAgICBsZXQgcG9pbnRlclR5cGU6IEdlc3R1cmVQb2ludGVyVHlwZSB8IHVuZGVmaW5lZFxuXG4gICAgICAgIHJldHVybiB0aGlzLiN0cmlnZ2VyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRlclR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGUgPSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJUeXBlID09PSBwb2ludGVyVHlwZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNvbm5lY3QoZXZlbnRzID0+XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcG9pbnRlclR5cGUgb24gZW5kLCBhZnRlciAyMDBtcywgYmVjYXVzZSB0b3VjaGVuZCBpcyBtYXliZSBmb2xsb3dlZCBieSBhIG1vdXNlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbmQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbmFibGVUb3VjaEFjdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAvLyBTZWxlY3QgYWN0aXZlIHdhdGNoZXJzXG4gICAgICAgICAgICAgICAgbWFwKChkZXRhaWw6IE11dGFibGU8R2VzdHVyZURldGFpbD4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUG9pbnRlcnMoZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudFRhcmdldCA9IGRldGFpbC5vcmlnaW4udGFyZ2V0IGFzIEhUTUxFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbC50YXJnZXQgPSBldmVudFRhcmdldFxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5jbHVkZVNjcm9sbERpc3RhbmNlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VzdHVyZXMgPSB0aGlzLiN3YXRjaGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyBnZXN0dXJlLCBlbCB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwgPT09IGV2ZW50VGFyZ2V0IHx8IChcImNvbnRhaW5zXCIgaW4gZWwgJiYgZWwuY29udGFpbnMoZXZlbnRUYXJnZXQpKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZS5zaG91bGRDYXB0dXJlKGRldGFpbClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlc3R1cmVzLCB7IGdlc3R1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdlc3R1cmVzLmhhcyhnZXN0dXJlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVNjcm9sbERpc3RhbmNlID0gaW5jbHVkZVNjcm9sbERpc3RhbmNlIHx8IGdlc3R1cmUuaW5jbHVkZVNjcm9sbERpc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlcy5zZXQoZ2VzdHVyZSwgR2VzdHVyZUNhcHR1cmVTdGF0ZS5VbmNoZWNrZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlc3R1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKCkgYXMgQmVnaW5TdGF0ZVtcImdlc3R1cmVzXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGV0YWlsOiBkZXRhaWwsIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfSBzYXRpc2ZpZXMgQmVnaW5TdGF0ZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoeyBnZXN0dXJlcyB9KSA9PiBnZXN0dXJlcy5zaXplID4gMCksXG4gICAgICAgICAgICAgICAgdGFwKHRoaXMuI2Rpc2FibGVUb3VjaEFjdGlvbilcbiAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSgoKSA9PiBjb25zb2xlLmxvZyhcIkZJTkFMSVpFIEJFR0lOXCIpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShkc3QpXG4gICAgfSlcblxuICAgIHJlYWRvbmx5ICNnZXN0dXJlID0gdGhpcy4jYmVnaW4ucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCh7IGRldGFpbDogc3RhcnRFdmVudCwgZ2VzdHVyZXMsIGluY2x1ZGVTY3JvbGxEaXN0YW5jZSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludGVyVHlwZSA9IHN0YXJ0RXZlbnQucG9pbnRlclR5cGVcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0QXQgPSBzdGFydEV2ZW50Lm9yaWdpbi50aW1lU3RhbXBcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsID0gc3RhcnRFdmVudC5vcmlnaW4udGFyZ2V0IGFzIEhUTUxFbGVtZW50XG4gICAgICAgICAgICBjb25zdCBkaXNwYXRjaEV2ZW50ID0gdGFyZ2V0RWxbRElTUEFUQ0hfRVZFTlRdLmJpbmQodGFyZ2V0RWwpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtSW5pdCA9IHRoaXMuI2V2ZW50U3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHN0YXJ0RXZlbnQpLFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtU291cmNlID0gIWluY2x1ZGVTY3JvbGxEaXN0YW5jZVxuICAgICAgICAgICAgICAgID8gZXZlbnRTdHJlYW1Jbml0XG4gICAgICAgICAgICAgICAgOiBjb21iaW5lTGF0ZXN0KFtldmVudFN0cmVhbUluaXQsIHRoaXMuI3Njcm9sbERpc3RhbmNlKHRhcmdldEVsKV0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgbWFwKChbc3JjLCBkaXN0YW5jZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOyhzcmMgYXMgTXV0YWJsZTxHZXN0dXJlRGV0YWlsPikuc2Nyb2xsRGlzdGFuY2UgPSBkaXN0YW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgZXZlbnRTdHJlYW0gPSBldmVudFN0cmVhbVNvdXJjZS5waXBlKFxuICAgICAgICAgICAgICAgIHNjYW4oXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZSwgY3VycikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBvaW50ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0RWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZDogY3Vyci5vcmlnaW4udGltZVN0YW1wIC0gc3RhcnRBdCFcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzdGFydEV2ZW50XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoZXZlbnQgPT4gZXZlbnQucGhhc2UgIT09IEdlc3R1cmVQaGFzZS5FbmQsIHRydWUpLFxuICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgU1RSRUFNXCIpKSxcbiAgICAgICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVTdGF0ZSA9IGV2ZW50U3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgY29ubmVjdChzcmMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZTogQ2FwdHVyZVN0YXRlID0geyBldmVudHM6IFtdLCBnZXN0dXJlcywgaW5jbHVkZVNjcm9sbERpc3RhbmNlIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjLnBpcGUodGFwKGV2ZW50ID0+IHN0YXRlLmV2ZW50cy5wdXNoKGV2ZW50KSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXJyYXkuZnJvbShnZXN0dXJlcy5rZXlzKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoc29ydEJ5UHJpcG9yaXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZ2VzdHVyZSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlLmNhcHR1cmUoc3JjLnBpcGUoZmlsdGVyKGdlc3R1cmUuc2hvdWxkQ2FwdHVyZS5iaW5kKGdlc3R1cmUpKSkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlV2hpbGUocmVzdWx0ID0+IHJlc3VsdCAhPT0gR2VzdHVyZUNhcHR1cmVTdGF0ZS5Ta2lwLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChyZXN1bHQgPT4gZ2VzdHVyZXMuc2V0KGdlc3R1cmUsIHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkucGlwZShtYXAoKCkgPT4gc3RhdGUpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gZmluYWxpemUoKCkgPT4gY29uc29sZS5sb2coXCJGSU5BTElaRSBDQVBUVVJFXCIpKVxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RHZXN0dXJlID0gY2FwdHVyZVN0YXRlLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uczogeyBbayBpbiBHZXN0dXJlQ2FwdHVyZVN0YXRlXT86IEdlc3R1cmVbXSB9ID0ge31cblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtnZXN0dXJlLCBjYXB0dXJlU3RhdGVdIG9mIHN0YXRlLmdlc3R1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aXRpb24gPSAocGFydGl0aW9uc1tjYXB0dXJlU3RhdGVdID8/PSBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbi5wdXNoKGdlc3R1cmUpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLkluc3RhbnRdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZTogcGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLkluc3RhbnRdLnNvcnQoc29ydEJ5UHJpcG9yaXR5KVswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHN0YXRlLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBDYXB0dXJlU2VsZWN0U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIG5vdCBhbGwgZ2VzdHVyZXMgcmV0dXJuIGZyb20gR2VzdHVyZS5jYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25zW0dlc3R1cmVDYXB0dXJlU3RhdGUuVW5jaGVja2VkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgaGFzIHBlbmRpbmcsIHRoZSBjYXB0dXJlIGlzIGNvbnRpbnVlZFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLlBlbmRpbmddICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBubyBwZW5kaWcgJiBoYXMgbWF5YmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5NYXliZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlOiBwYXJ0aXRpb25zW0dlc3R1cmVDYXB0dXJlU3RhdGUuTWF5YmVdLnNvcnQoc29ydEJ5UHJpcG9yaXR5KVswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHN0YXRlLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBDYXB0dXJlU2VsZWN0U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIHBlbmRpbmcgJiBubyBtYXliZSAmIG5vIHRlcm1pbmF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBzbywgbm90aGlnbiBtYXRjaGVkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGV2ZW50czogc3RhdGUuZXZlbnRzIH0gYXMgQ2FwdHVyZVNlbGVjdFN0YXRlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVdoaWxlKGlzRmFsc3ksIHRydWUpLFxuICAgICAgICAgICAgICAgIGZpbHRlcihpc1RydXRoeSksXG4gICAgICAgICAgICAgICAgdGFrZVdoaWxlKHYgPT4gdiEuZ2VzdHVyZSAhPSBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAvLyB0YXAoKHY6IENhcHR1cmVTZWxlY3RTdGF0ZSkgPT4gdi5ldmVudHMuZm9yRWFjaCgoeyBvcmlnaW4gfSkgPT4gcHJldmVudERlZmF1bHQob3JpZ2luKSkpXG4gICAgICAgICAgICAgICAgLy8gZmluYWxpemUoKCkgPT4gY29uc29sZS5sb2coXCJGSU5BTElaRSBTRUxFQ1RcIikpXG4gICAgICAgICAgICApIGFzIE9ic2VydmFibGU8UmVxdWlyZWQ8Q2FwdHVyZVNlbGVjdFN0YXRlPj5cblxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdlc3R1cmUucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHsgZXZlbnRzLCBnZXN0dXJlIH0pID0+XG4gICAgICAgICAgICAgICAgICAgIGdlc3R1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXaXRoKC4uLmV2ZW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcCgoeyBvcmlnaW4gfSkgPT4gcHJldmVudERlZmF1bHQob3JpZ2luKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihnZXN0dXJlLmlzUmVsZXZhbnRFdmVudC5iaW5kKGdlc3R1cmUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VXaGlsZSh2ID0+IHYucGhhc2UgIT09IEdlc3R1cmVQaGFzZS5FbmQsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChkZXRhaWwgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChnZXN0dXJlLnR5cGUsIHsgZGV0YWlsLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxpemUoKCkgPT4gY29uc29sZS5sb2coXCJHRVNUVVJFIEZJTkFMSVpFXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgLy8gZmluYWxpemUoKCkgPT4gY29uc29sZS5sb2coXCJGSU5BTElaRSBSRVNVTFRcIikpLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKHRoaXMuI2VuYWJsZVRvdWNoQWN0aW9uKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmUoKVxuICAgIClcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCB0cmlnZ2VycyA9IG1lcmdlKFxuICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoTGlzdGVuZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiBMaXN0ZW5lcnNbbmFtZV0ucGhhc2UgPT09IEdlc3R1cmVQaGFzZS5TdGFydClcbiAgICAgICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy4jbGlzdGVuKG5hbWUsIExpc3RlbmVyc1tuYW1lXSkpXG4gICAgICAgIClcbiAgICAgICAgdHJpZ2dlcnMucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKHRoaXMuI3RyaWdnZXIpXG4gICAgfVxuXG4gICAgbGlzdGVuPFQgZXh0ZW5kcyBBcnJheTxHZXN0dXJlPj4oZWw6IEVsZW1lbnRJbnB1dCwgLi4uZ2VzdHVyZXM6IFQpOiBHZXN0dXJlTGlzdGVuUmV0dXJuczxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoZHN0OiBTdWJzY3JpYmVyPEdlc3R1cmVEZXRhaWw+KSA9PlxuICAgICAgICAgICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvZXJjZUVsZW1lbnQoZWwpXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGRzdC5uZXh0LmJpbmQoZHN0KVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZ2VzdHVyZSBvZiBnZXN0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50W0FERF9FVkVOVF9MSVNURU5FUl0oZ2VzdHVyZS50eXBlIGFzIGFueSwgbmV4dClcbiAgICAgICAgICAgICAgICAgICAgZHN0LmFkZChlbGVtZW50W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uYmluZChlbGVtZW50LCBnZXN0dXJlLnR5cGUgYXMgYW55LCBuZXh0IGFzIGFueSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRzdC5hZGQodGhpcy4jd2F0Y2goZWxlbWVudCwgLi4uZ2VzdHVyZXMpLnN1YnNjcmliZSgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKSBhcyBhbnlcbiAgICB9XG5cbiAgICAjd2F0Y2g8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PihlbDogRWxlbWVudElucHV0LCAuLi5nZXN0dXJlczogVCk6IEdlc3R1cmVXYXRjaFJldHVybnM8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxHZXN0dXJlRGV0YWlsPikgPT5cbiAgICAgICAgICAgIHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsKVxuICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoZXJzID0gZ2VzdHVyZXMubWFwKGdlc3R1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBnZXN0dXJlLCBlbDogZWxlbWVudCB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGQod2F0Y2hlcnMpXG4gICAgICAgICAgICAgICAgZHN0LmFkZCh0aGlzLiNnZXN0dXJlLnN1YnNjcmliZShkc3QpKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZSh3YXRjaGVycylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApIGFzIGFueVxuICAgIH1cblxuICAgICNhZGQod2F0Y2hlcnM6IFdhdGNoZXJbXSkge1xuICAgICAgICB0aGlzLiN3YXRjaGVycyA9IHRoaXMuI3dhdGNoZXJzLmNvbmNhdCh3YXRjaGVycylcbiAgICB9XG5cbiAgICAjcmVtb3ZlKHdhdGNoZXJzOiBXYXRjaGVyW10pIHtcbiAgICAgICAgdGhpcy4jd2F0Y2hlcnMgPSB0aGlzLiN3YXRjaGVycy5maWx0ZXIodiA9PiAhd2F0Y2hlcnMuaW5jbHVkZXModikpXG4gICAgfVxuXG4gICAgI2xpc3RlbihuYW1lOiBzdHJpbmcsIGNvbmZpZzogR2VzdHVyZUxpc3RlbmVyQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcGhhc2UsIHBvaW50ZXJUeXBlLCBvcHRpb25zIH0gPSBjb25maWdcblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxHZXN0dXJlRGV0YWlsPikgPT5cbiAgICAgICAgICAgIHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKG9yaWdpbjogR2VzdHVyZU9yaWdpbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRzdC5uZXh0KHsgb3JpZ2luLCBwaGFzZSwgcG9pbnRlclR5cGUgfSBhcyBHZXN0dXJlRGV0YWlsKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWRkRXZlbnRMaXN0ZW5lclwiLCBuYW1lKVxuICAgICAgICAgICAgICAgIHRoaXMuI2RvY3VtZW50W0FERF9FVkVOVF9MSVNURU5FUl0obmFtZSBhcyBrZXlvZiBEb2N1bWVudEV2ZW50TWFwLCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZW1vdmVFdmVudExpc3RlbmVyXCIsIG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RvY3VtZW50W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0obmFtZSBhcyBrZXlvZiBEb2N1bWVudEV2ZW50TWFwLCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgICNzY3JvbGxEaXN0YW5jZShlbGVtZW50OiBFbGVtZW50KTogT2JzZXJ2YWJsZTxQb3NpdGlvbj4ge1xuICAgICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0gMFxuICAgICAgICAgICAgbGV0IHkgPSAwXG4gICAgICAgICAgICBsZXQgcCA9IGVsZW1lbnRcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB4ICs9IHAuc2Nyb2xsTGVmdCA/PyAwXG4gICAgICAgICAgICAgICAgeSArPSBwLnNjcm9sbFRvcCA/PyAwXG4gICAgICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZSBhcyBFbGVtZW50XG4gICAgICAgICAgICB9IHdoaWxlIChwICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4geyB4LCB5IH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoZHN0OiBTdWJzY3JpYmVyPFBvc2l0aW9uPikgPT5cbiAgICAgICAgICAgIHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSBzY3JvbGxQb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzY3JvbGxQb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIGRzdC5uZXh0KHsgeDogY3VycmVudC54IC0gaW5pdGlhbC54LCB5OiBjdXJyZW50LnkgLSBpbml0aWFsLnkgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZHN0Lm5leHQoeyB4OiAwLCB5OiAwIH0pXG4gICAgICAgICAgICAgICAgdGhpcy4jZG9jdW1lbnRbQUREX0VWRU5UX0xJU1RFTkVSXShcInNjcm9sbFwiLCBsaXN0ZW5lciwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpXG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZG9jdW1lbnRbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXShcInNjcm9sbFwiLCBsaXN0ZW5lciwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgICNsYXN0VG91Y2hBY3Rpb24/OiBzdHJpbmdcbiAgICAjZGlzYWJsZVRvdWNoQWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy4jbGFzdFRvdWNoQWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI2xhc3RUb3VjaEFjdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuI2RvY3VtZW50LmJvZHkpLnRvdWNoQWN0aW9uXG4gICAgICAgICAgICB0aGlzLiNkb2N1bWVudC5ib2R5LnN0eWxlLnRvdWNoQWN0aW9uID0gXCJub25lXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgICNlbmFibGVUb3VjaEFjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI2xhc3RUb3VjaEFjdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiNkb2N1bWVudC5ib2R5LnN0eWxlLnRvdWNoQWN0aW9uID0gdGhpcy4jbGFzdFRvdWNoQWN0aW9uXG4gICAgICAgICAgICB0aGlzLiNsYXN0VG91Y2hBY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc29ydEJ5UHJpcG9yaXR5KGE6IEdlc3R1cmUsIGI6IEdlc3R1cmUpIHtcbiAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHlcbn1cblxuZnVuY3Rpb24gcG9pbnRlcnNGcm9tRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogUG9zaXRpb25bXSB7XG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZXZlbnQudG91Y2hlcykubWFwKHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogdC5jbGllbnRYLCB5OiB0LmNsaWVudFkgfVxuICAgICAgICB9KVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9pbnRlcnMoc3RhdGU6IE11dGFibGU8R2VzdHVyZURldGFpbD4pOiBHZXN0dXJlRGV0YWlsIHtcbiAgICBpZiAoc3RhdGUucGhhc2UgPT09IEdlc3R1cmVQaGFzZS5TdGFydCkge1xuICAgICAgICBzdGF0ZS5wb2ludGVycyA9IHBvaW50ZXJzRnJvbUV2ZW50KHN0YXRlLm9yaWdpbikubWFwKHYgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHYsIGN1cnJlbnQ6IHYsIGRpc3RhbmNlOiB7IHg6IDAsIHk6IDAgfSwgZGlyZWN0aW9uOiB7IHg6IDAsIHk6IDAgfSB9XG4gICAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb2ludGVycykge1xuICAgICAgICBjb25zdCBwb2ludGVycyA9IHBvaW50ZXJzRnJvbUV2ZW50KHN0YXRlLm9yaWdpbilcbiAgICAgICAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5wb2ludGVycyA9IHN0YXRlLnBvaW50ZXJzLm1hcCgodiwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBvaW50ZXJzW2ldXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB2LnN0YXJ0LFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHAsXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IHsgeDogcC54IC0gdi5zdGFydC54LCB5OiBwLnkgLSB2LnN0YXJ0LnkgfSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHsgeDogZGlyZWN0aW9uKHYuc3RhcnQueCwgcC54KSwgeTogZGlyZWN0aW9uKHYuc3RhcnQueSwgcC55KSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlXG59XG5cbmZ1bmN0aW9uIGRpcmVjdGlvbihwcmV2OiBudW1iZXIsIGN1cnI6IG51bWJlcik6IC0xIHwgMCB8IDEge1xuICAgIHJldHVybiBjdXJyID4gcHJldiA/IDEgOiBjdXJyIDwgcHJldiA/IC0xIDogMFxufVxuXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgUFJFVkVOVCAke2V2ZW50LnR5cGV9YClcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export * from "./gesture-drag";
|
|
2
|
-
export * from "./gesture-event";
|
|
3
|
-
export * from "./gesture-longtap";
|
|
4
|
-
export * from "./gesture-tap";
|
|
5
|
-
export * from "./gesture.service";
|
|
6
|
-
export * from "./gesture";
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9nZXN0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFBO0FBQzlCLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxjQUFjLGVBQWUsQ0FBQTtBQUM3QixjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZS1kcmFnXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUtZXZlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZS1sb25ndGFwXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUtdGFwXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUuc2VydmljZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZXN0dXJlXCJcbiJdfQ==
|
package/esm2022/index.mjs
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { ActivityService } from "./activity";
|
|
2
|
-
export { FocusService, FocusTrap, Focusable, FocusState } from "./focus";
|
|
3
|
-
export { KeystrokeService } from "./keystroke";
|
|
4
|
-
export * from "./gestures";
|
|
5
|
-
export * from "./ui-state";
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMzRSxPQUFPLEVBQWUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFnQyxNQUFNLFNBQVMsQ0FBQTtBQUNuSCxPQUFPLEVBQTZCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3pFLGNBQWMsWUFBWSxDQUFBO0FBQzFCLGNBQWMsWUFBWSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgQWN0aXZpdHlFdmVudCwgQWN0aXZpdHlPcmlnaW4sIEFjdGl2aXR5U2VydmljZSB9IGZyb20gXCIuL2FjdGl2aXR5XCJcbmV4cG9ydCB7IEZvY3VzT3JpZ2luLCBGb2N1c1NlcnZpY2UsIEZvY3VzVHJhcCwgRm9jdXNhYmxlLCBGb2N1c1N0YXRlLCBGb2N1c2FibGVFdmVudCwgRm9jdXNDaGFuZ2VzIH0gZnJvbSBcIi4vZm9jdXNcIlxuZXhwb3J0IHsgS2V5c3Ryb2tlLCBLZXlzdHJva2VFdmVudCwgS2V5c3Ryb2tlU2VydmljZSB9IGZyb20gXCIuL2tleXN0cm9rZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZXN0dXJlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi91aS1zdGF0ZVwiXG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from "./keystroke.service";
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9rZXlzdHJva2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2tleXN0cm9rZS5zZXJ2aWNlXCJcbiJdfQ==
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from "@angular/common";
|
|
2
|
-
import { inject, Injectable, NgZone } from "@angular/core";
|
|
3
|
-
import { distinctUntilChanged, EMPTY, filter, from, fromEvent, map, merge, Observable, of, share, shareReplay, startWith, switchMap } from "rxjs";
|
|
4
|
-
import { coerceElement, isElementInput } from "@ngutil/common";
|
|
5
|
-
import { FocusState } from "../focus";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class KeystrokeService {
|
|
8
|
-
#document = inject(DOCUMENT);
|
|
9
|
-
#zone = inject(NgZone);
|
|
10
|
-
#keyEvent = this.#zone.runOutsideAngular(() => merge(fromEvent(this.#document, "keydown", { capture: true, passive: false }), fromEvent(this.#document, "keyup", { capture: true, passive: false })).pipe(filter(event => event.defaultPrevented === false), share()));
|
|
11
|
-
#focusEvent = this.#zone.runOutsideAngular(() => fromEvent(this.#document, "focus", { capture: true, passive: true }).pipe(startWith(null), map(() => this.#document.activeElement), shareReplay(1)));
|
|
12
|
-
watch(activation, ...keystrokes) {
|
|
13
|
-
return new Observable((dst) => this.#trigger(activation)
|
|
14
|
-
.pipe(distinctUntilChanged(), switchMap(enabled => {
|
|
15
|
-
if (enabled) {
|
|
16
|
-
return this.#keyEvent;
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
return EMPTY;
|
|
20
|
-
}
|
|
21
|
-
}), map(event => {
|
|
22
|
-
if (event.defaultPrevented) {
|
|
23
|
-
return [];
|
|
24
|
-
}
|
|
25
|
-
const idFromEvent = keystrokeId(eventToKeystroke(event));
|
|
26
|
-
const matches = keystrokes
|
|
27
|
-
.filter(ks => keystrokeId(ks) === idFromEvent)
|
|
28
|
-
.map(ks => {
|
|
29
|
-
return {
|
|
30
|
-
original: event,
|
|
31
|
-
keystroke: ks
|
|
32
|
-
};
|
|
33
|
-
});
|
|
34
|
-
if (matches.length > 0) {
|
|
35
|
-
event.preventDefault();
|
|
36
|
-
}
|
|
37
|
-
return matches;
|
|
38
|
-
}), filter(matches => matches.length > 0), switchMap(matches => of(...matches)))
|
|
39
|
-
.subscribe(dst));
|
|
40
|
-
}
|
|
41
|
-
#trigger(activation) {
|
|
42
|
-
if (isElementInput(activation)) {
|
|
43
|
-
return this.#focusActivation(coerceElement(activation));
|
|
44
|
-
}
|
|
45
|
-
else if (activation instanceof FocusState) {
|
|
46
|
-
return activation.origin$.pipe(map(origin => origin != null));
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
return from(activation).pipe(switchMap(value => {
|
|
50
|
-
if (isElementInput(value) || value instanceof FocusState) {
|
|
51
|
-
return this.#trigger(value);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
return of(value);
|
|
55
|
-
}
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
#focusActivation(element) {
|
|
60
|
-
return this.#focusEvent.pipe(map(focused => focused === element || element.contains(focused)));
|
|
61
|
-
}
|
|
62
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KeystrokeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
63
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KeystrokeService, providedIn: "root" }); }
|
|
64
|
-
}
|
|
65
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KeystrokeService, decorators: [{
|
|
66
|
-
type: Injectable,
|
|
67
|
-
args: [{ providedIn: "root" }]
|
|
68
|
-
}] });
|
|
69
|
-
function keystrokeId(ks) {
|
|
70
|
-
let res = ks.key;
|
|
71
|
-
if (ks.shift) {
|
|
72
|
-
res += "+shift";
|
|
73
|
-
}
|
|
74
|
-
if (ks.ctrl) {
|
|
75
|
-
res += "+ctrl";
|
|
76
|
-
}
|
|
77
|
-
if (ks.alt) {
|
|
78
|
-
res += "+alt";
|
|
79
|
-
}
|
|
80
|
-
res += `${ks.state}`;
|
|
81
|
-
return res;
|
|
82
|
-
}
|
|
83
|
-
function eventToKeystroke(event) {
|
|
84
|
-
return {
|
|
85
|
-
key: event.key,
|
|
86
|
-
shift: event.shiftKey,
|
|
87
|
-
ctrl: event.ctrlKey,
|
|
88
|
-
alt: event.altKey,
|
|
89
|
-
state: event.type === "keyup" ? "up" : "down"
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5c3Ryb2tlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9rZXlzdHJva2Uva2V5c3Ryb2tlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUUxRCxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxNQUFNLEVBQ04sSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEVBQ0gsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBRVQsU0FBUyxFQUNaLE1BQU0sTUFBTSxDQUFBO0FBRWIsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTs7QUFtQnJDLE1BQU0sT0FBTyxnQkFBZ0I7SUFDaEIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM1QixLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXRCLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUNuRCxLQUFLLENBQ0QsU0FBUyxDQUFnQixJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQ3RGLFNBQVMsQ0FBZ0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUN2RixDQUFD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LElBQUksRUFBRSxLQUFLLENBQUMsT0FBTztRQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDakIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07S0FDaEQsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIlxuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7XG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgRU1QVFksXG4gICAgZmlsdGVyLFxuICAgIGZyb20sXG4gICAgZnJvbUV2ZW50LFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBPYnNlcnZhYmxlLFxuICAgIG9mLFxuICAgIHNoYXJlLFxuICAgIHNoYXJlUmVwbGF5LFxuICAgIHN0YXJ0V2l0aCxcbiAgICBTdWJzY3JpYmVyLFxuICAgIHN3aXRjaE1hcFxufSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IGNvZXJjZUVsZW1lbnQsIEVsZW1lbnRJbnB1dCwgaXNFbGVtZW50SW5wdXQgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyBGb2N1c1N0YXRlIH0gZnJvbSBcIi4uL2ZvY3VzXCJcblxuZXhwb3J0IGludGVyZmFjZSBLZXlzdHJva2Uge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VSV9FdmVudHMvS2V5Ym9hcmRfZXZlbnRfa2V5X3ZhbHVlc1xuICAgIGtleTogS2V5Ym9hcmRFdmVudFtcImtleVwiXVxuICAgIHNoaWZ0PzogYm9vbGVhblxuICAgIGN0cmw/OiBib29sZWFuXG4gICAgYWx0PzogYm9vbGVhblxuICAgIHN0YXRlOiBcImRvd25cIiB8IFwidXBcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleXN0cm9rZUV2ZW50IHtcbiAgICBvcmlnaW5hbDogS2V5Ym9hcmRFdmVudFxuICAgIGtleXN0cm9rZTogS2V5c3Ryb2tlXG59XG5cbmV4cG9ydCB0eXBlIEtleXN0cm9rZUFjdGl2YXRpb24gPSBFbGVtZW50SW5wdXQgfCBGb2N1c1N0YXRlIHwgT2JzZXJ2YWJsZTxFbGVtZW50SW5wdXQgfCBGb2N1c1N0YXRlIHwgYm9vbGVhbj5cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIEtleXN0cm9rZVNlcnZpY2Uge1xuICAgIHJlYWRvbmx5ICNkb2N1bWVudCA9IGluamVjdChET0NVTUVOVClcbiAgICByZWFkb25seSAjem9uZSA9IGluamVjdChOZ1pvbmUpXG5cbiAgICByZWFkb25seSAja2V5RXZlbnQgPSB0aGlzLiN6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KHRoaXMuI2RvY3VtZW50LCBcImtleWRvd25cIiwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZSB9KSxcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pih0aGlzLiNkb2N1bWVudCwgXCJrZXl1cFwiLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlIH0pXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5kZWZhdWx0UHJldmVudGVkID09PSBmYWxzZSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgIClcbiAgICApXG5cbiAgICByZWFkb25seSAjZm9jdXNFdmVudCA9IHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMuI2RvY3VtZW50LCBcImZvY3VzXCIsIHsgY2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogdHJ1ZSB9KS5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuI2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgKVxuICAgIClcblxuICAgIHdhdGNoKGFjdGl2YXRpb246IEtleXN0cm9rZUFjdGl2YXRpb24sIC4uLmtleXN0cm9rZXM6IEtleXN0cm9rZVtdKTogT2JzZXJ2YWJsZTxLZXlzdHJva2VFdmVudD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxLZXlzdHJva2VFdmVudD4pID0+XG4gICAgICAgICAgICB0aGlzLiN0cmlnZ2VyKGFjdGl2YXRpb24pXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlbmFibGVkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2tleUV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkRnJvbUV2ZW50ID0ga2V5c3Ryb2tlSWQoZXZlbnRUb0tleXN0cm9rZShldmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzID0ga2V5c3Ryb2tlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa3MgPT4ga2V5c3Ryb2tlSWQoa3MpID09PSBpZEZyb21FdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGtzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZToga3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIobWF0Y2hlcyA9PiBtYXRjaGVzLmxlbmd0aCA+IDApLFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAobWF0Y2hlcyA9PiBvZiguLi5tYXRjaGVzKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShkc3QpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjdHJpZ2dlcihhY3RpdmF0aW9uOiBLZXlzdHJva2VBY3RpdmF0aW9uKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgSFRNTEVsZW1lbnQ+IHtcbiAgICAgICAgaWYgKGlzRWxlbWVudElucHV0KGFjdGl2YXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZm9jdXNBY3RpdmF0aW9uKGNvZXJjZUVsZW1lbnQoYWN0aXZhdGlvbikpXG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiBpbnN0YW5jZW9mIEZvY3VzU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3RpdmF0aW9uLm9yaWdpbiQucGlwZShtYXAob3JpZ2luID0+IG9yaWdpbiAhPSBudWxsKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKGFjdGl2YXRpb24pLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRWxlbWVudElucHV0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZvY3VzU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiN0cmlnZ2VyKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgICNmb2N1c0FjdGl2YXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZvY3VzRXZlbnQucGlwZShtYXAoZm9jdXNlZCA9PiBmb2N1c2VkID09PSBlbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnMoZm9jdXNlZCkpKVxuICAgIH1cbn1cblxuZnVuY3Rpb24ga2V5c3Ryb2tlSWQoa3M6IEtleXN0cm9rZSk6IHN0cmluZyB7XG4gICAgbGV0IHJlcyA9IGtzLmtleVxuICAgIGlmIChrcy5zaGlmdCkge1xuICAgICAgICByZXMgKz0gXCIrc2hpZnRcIlxuICAgIH1cbiAgICBpZiAoa3MuY3RybCkge1xuICAgICAgICByZXMgKz0gXCIrY3RybFwiXG4gICAgfVxuICAgIGlmIChrcy5hbHQpIHtcbiAgICAgICAgcmVzICs9IFwiK2FsdFwiXG4gICAgfVxuICAgIHJlcyArPSBgJHtrcy5zdGF0ZX1gXG4gICAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBldmVudFRvS2V5c3Ryb2tlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogS2V5c3Ryb2tlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICBjdHJsOiBldmVudC5jdHJsS2V5LFxuICAgICAgICBhbHQ6IGV2ZW50LmFsdEtleSxcbiAgICAgICAgc3RhdGU6IGV2ZW50LnR5cGUgPT09IFwia2V5dXBcIiA/IFwidXBcIiA6IFwiZG93blwiXG4gICAgfVxufVxuIl19
|
package/esm2022/ngutil-aria.mjs
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd1dGlsLWFyaWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9uZ3V0aWwtYXJpYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { computed, Directive, effect, inject } from "@angular/core";
|
|
2
|
-
import { coerceBoolAttr } from "@ngutil/common";
|
|
3
|
-
import { UiState } from "./ui-state";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export const NOTSET = Symbol("NOTSET");
|
|
6
|
-
export class AbstractUiState {
|
|
7
|
-
constructor(name) {
|
|
8
|
-
this.name = name;
|
|
9
|
-
this.state = inject(UiState);
|
|
10
|
-
this.yes = computed(() => {
|
|
11
|
-
const when = this.when();
|
|
12
|
-
if (when !== NOTSET) {
|
|
13
|
-
// TODO: add prefix if only provide loading, or simething simple selector
|
|
14
|
-
return this.state.is(`${this.name}.self || (${when})`);
|
|
15
|
-
}
|
|
16
|
-
return this.state.is(this.name);
|
|
17
|
-
});
|
|
18
|
-
this.no = computed(() => !this.yes());
|
|
19
|
-
effect(() => {
|
|
20
|
-
const input = this.input();
|
|
21
|
-
if (input !== NOTSET) {
|
|
22
|
-
this.state.set(name, !!coerceBoolAttr(input));
|
|
23
|
-
}
|
|
24
|
-
}, { allowSignalWrites: true });
|
|
25
|
-
}
|
|
26
|
-
set(value, source) {
|
|
27
|
-
this.state.set(this.name, value, source);
|
|
28
|
-
}
|
|
29
|
-
intercept(source) {
|
|
30
|
-
return this.state.intercept(this.name, source);
|
|
31
|
-
}
|
|
32
|
-
wrap(observable, source) {
|
|
33
|
-
return this.state.wrap(observable, this.name, source);
|
|
34
|
-
}
|
|
35
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: AbstractUiState, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
|
|
36
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: AbstractUiState, ngImport: i0 }); }
|
|
37
|
-
}
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: AbstractUiState, decorators: [{
|
|
39
|
-
type: Directive
|
|
40
|
-
}], ctorParameters: () => [{ type: undefined }] });
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9hYnN0cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBSTNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFBOztBQUVwQyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQVEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBRzNDLE1BQU0sT0FBZ0IsZUFBZTtJQWdCakMsWUFBcUIsSUFBTztRQUFQLFNBQUksR0FBSixJQUFJLENBQUc7UUFmbkIsVUFBSyxHQUFlLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUtuQyxRQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDeEIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLHlFQUF5RTtnQkFDekUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLGFBQWEsSUFBSSxHQUFHLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFDTyxPQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFHckMsTUFBTSxDQUNGLEdBQUcsRUFBRTtZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUMxQixJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUNqRCxDQUFDO1FBQ0wsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzlCLENBQUE7SUFDTCxDQUFDO0lBRUQsR0FBRyxDQUFDLEtBQWMsRUFBRSxNQUFjO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYztRQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVELElBQUksQ0FBSSxVQUF5QixFQUFFLE1BQWM7UUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN6RCxDQUFDOzhHQXRDaUIsZUFBZTtrR0FBZixlQUFlOzsyRkFBZixlQUFlO2tCQURwQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIERpcmVjdGl2ZSwgZWZmZWN0LCBpbmplY3QsIFNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCJcblxuaW1wb3J0IHsgY29lcmNlQm9vbEF0dHIgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyBVaVN0YXRlIH0gZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5leHBvcnQgY29uc3QgTk9UU0VUOiBhbnkgPSBTeW1ib2woXCJOT1RTRVRcIilcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVaVN0YXRlPE4gZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICByZWFkb25seSBzdGF0ZTogVWlTdGF0ZTxOPiA9IGluamVjdChVaVN0YXRlKVxuXG4gICAgYWJzdHJhY3QgcmVhZG9ubHkgaW5wdXQ6IFNpZ25hbDxib29sZWFuPlxuICAgIGFic3RyYWN0IHJlYWRvbmx5IHdoZW46IFNpZ25hbDxzdHJpbmc+XG5cbiAgICByZWFkb25seSB5ZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdoZW4gPSB0aGlzLndoZW4oKVxuICAgICAgICBpZiAod2hlbiAhPT0gTk9UU0VUKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBhZGQgcHJlZml4IGlmIG9ubHkgcHJvdmlkZSBsb2FkaW5nLCBvciBzaW1ldGhpbmcgc2ltcGxlIHNlbGVjdG9yXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pcyhgJHt0aGlzLm5hbWV9LnNlbGYgfHwgKCR7d2hlbn0pYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pcyh0aGlzLm5hbWUpXG4gICAgfSlcbiAgICByZWFkb25seSBubyA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLnllcygpKVxuXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbmFtZTogTikge1xuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0KClcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT09IE5PVFNFVCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNldChuYW1lLCAhIWNvZXJjZUJvb2xBdHRyKGlucHV0KSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBzZXQodmFsdWU6IGJvb2xlYW4sIHNvdXJjZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0KHRoaXMubmFtZSwgdmFsdWUsIHNvdXJjZSlcbiAgICB9XG5cbiAgICBpbnRlcmNlcHQoc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaW50ZXJjZXB0KHRoaXMubmFtZSwgc291cmNlKVxuICAgIH1cblxuICAgIHdyYXA8VD4ob2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUPiwgc291cmNlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUud3JhcChvYnNlcnZhYmxlLCB0aGlzLm5hbWUsIHNvdXJjZSlcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Directive, input } from "@angular/core";
|
|
2
|
-
import { AbstractUiState, NOTSET } from "./abstract";
|
|
3
|
-
import { UiState } from "./ui-state";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class BusyDirective extends AbstractUiState {
|
|
6
|
-
constructor() {
|
|
7
|
-
super("busy");
|
|
8
|
-
this.input = input(NOTSET, { alias: "nuBusy" });
|
|
9
|
-
this.when = input(NOTSET, { alias: "nuBusyWhen" });
|
|
10
|
-
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: BusyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
12
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.6", type: BusyDirective, isStandalone: true, selector: "[nuBusy], [nuBusyWhen]", inputs: { input: { classPropertyName: "input", publicName: "nuBusy", isSignal: true, isRequired: false, transformFunction: null }, when: { classPropertyName: "when", publicName: "nuBusyWhen", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-busy": "yes() ? 'true' : 'false'", "attr.inert": "state.isInert() ? '' : null" } }, providers: [UiState], exportAs: ["busy"], usesInheritance: true, ngImport: i0 }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: BusyDirective, decorators: [{
|
|
15
|
-
type: Directive,
|
|
16
|
-
args: [{
|
|
17
|
-
selector: "[nuBusy], [nuBusyWhen]",
|
|
18
|
-
exportAs: "busy",
|
|
19
|
-
standalone: true,
|
|
20
|
-
host: {
|
|
21
|
-
"[attr.aria-busy]": "yes() ? 'true' : 'false'",
|
|
22
|
-
"[attr.inert]": "state.isInert() ? '' : null"
|
|
23
|
-
},
|
|
24
|
-
providers: [UiState]
|
|
25
|
-
}]
|
|
26
|
-
}], ctorParameters: () => [] });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVzeS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9idXN5LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFBOztBQVlwQyxNQUFNLE9BQU8sYUFBYyxTQUFRLGVBQXVCO0lBSXREO1FBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBSlIsVUFBSyxHQUFHLEtBQUssQ0FBQyxNQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDckQsU0FBSSxHQUFHLEtBQUssQ0FBQyxNQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7SUFJaEUsQ0FBQzs4R0FOUSxhQUFhO2tHQUFiLGFBQWEsMGJBRlgsQ0FBQyxPQUFPLENBQUM7OzJGQUVYLGFBQWE7a0JBVnpCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLE1BQU07b0JBQ2hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUU7d0JBQ0Ysa0JBQWtCLEVBQUUsMEJBQTBCO3dCQUM5QyxjQUFjLEVBQUUsNkJBQTZCO3FCQUNoRDtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgQWJzdHJhY3RVaVN0YXRlLCBOT1RTRVQgfSBmcm9tIFwiLi9hYnN0cmFjdFwiXG5pbXBvcnQgeyBVaVN0YXRlIH0gZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVCdXN5XSwgW251QnVzeVdoZW5dXCIsXG4gICAgZXhwb3J0QXM6IFwiYnVzeVwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICBcIlthdHRyLmFyaWEtYnVzeV1cIjogXCJ5ZXMoKSA/ICd0cnVlJyA6ICdmYWxzZSdcIixcbiAgICAgICAgXCJbYXR0ci5pbmVydF1cIjogXCJzdGF0ZS5pc0luZXJ0KCkgPyAnJyA6IG51bGxcIlxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbVWlTdGF0ZV1cbn0pXG5leHBvcnQgY2xhc3MgQnVzeURpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0VWlTdGF0ZTxcImJ1c3lcIj4ge1xuICAgIHJlYWRvbmx5IGlucHV0ID0gaW5wdXQoTk9UU0VUIGFzIGJvb2xlYW4sIHsgYWxpYXM6IFwibnVCdXN5XCIgfSlcbiAgICByZWFkb25seSB3aGVuID0gaW5wdXQoTk9UU0VUIGFzIHN0cmluZywgeyBhbGlhczogXCJudUJ1c3lXaGVuXCIgfSlcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImJ1c3lcIilcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Directive, input } from "@angular/core";
|
|
2
|
-
import { AbstractUiState, NOTSET } from "./abstract";
|
|
3
|
-
import { UiState } from "./ui-state";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class DisabledDirective extends AbstractUiState {
|
|
6
|
-
constructor() {
|
|
7
|
-
super("disabled");
|
|
8
|
-
this.input = input(NOTSET, { alias: "nuDisabled" });
|
|
9
|
-
this.when = input(NOTSET, { alias: "nuDisabledWhen" });
|
|
10
|
-
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: DisabledDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
12
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.6", type: DisabledDirective, isStandalone: true, selector: "[nuDisabled], [nuDisabledWhen]", inputs: { input: { classPropertyName: "input", publicName: "nuDisabled", isSignal: true, isRequired: false, transformFunction: null }, when: { classPropertyName: "when", publicName: "nuDisabledWhen", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-disabled": "yes() ? 'true' : 'false'", "attr.disabled": "yes() ? '' : null", "attr.inert": "state.isInert() ? '' : null" } }, providers: [UiState], exportAs: ["disabled"], usesInheritance: true, ngImport: i0 }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: DisabledDirective, decorators: [{
|
|
15
|
-
type: Directive,
|
|
16
|
-
args: [{
|
|
17
|
-
selector: "[nuDisabled], [nuDisabledWhen]",
|
|
18
|
-
exportAs: "disabled",
|
|
19
|
-
standalone: true,
|
|
20
|
-
host: {
|
|
21
|
-
"[attr.aria-disabled]": "yes() ? 'true' : 'false'",
|
|
22
|
-
"[attr.disabled]": "yes() ? '' : null",
|
|
23
|
-
"[attr.inert]": "state.isInert() ? '' : null"
|
|
24
|
-
},
|
|
25
|
-
providers: [UiState]
|
|
26
|
-
}]
|
|
27
|
-
}], ctorParameters: () => [] });
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzYWJsZWQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvdWktc3RhdGUvZGlzYWJsZWQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7O0FBYXBDLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUEyQjtJQUk5RDtRQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUpaLFVBQUssR0FBRyxLQUFLLENBQUMsTUFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELFNBQUksR0FBRyxLQUFLLENBQUMsTUFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7SUFJcEUsQ0FBQzs4R0FOUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixvZkFGZixDQUFDLE9BQU8sQ0FBQzs7MkZBRVgsaUJBQWlCO2tCQVg3QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRSxVQUFVO29CQUNwQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNGLHNCQUFzQixFQUFFLDBCQUEwQjt3QkFDbEQsaUJBQWlCLEVBQUUsbUJBQW1CO3dCQUN0QyxjQUFjLEVBQUUsNkJBQTZCO3FCQUNoRDtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgQWJzdHJhY3RVaVN0YXRlLCBOT1RTRVQgfSBmcm9tIFwiLi9hYnN0cmFjdFwiXG5pbXBvcnQgeyBVaVN0YXRlIH0gZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVEaXNhYmxlZF0sIFtudURpc2FibGVkV2hlbl1cIixcbiAgICBleHBvcnRBczogXCJkaXNhYmxlZFwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICBcIlthdHRyLmFyaWEtZGlzYWJsZWRdXCI6IFwieWVzKCkgPyAndHJ1ZScgOiAnZmFsc2UnXCIsXG4gICAgICAgIFwiW2F0dHIuZGlzYWJsZWRdXCI6IFwieWVzKCkgPyAnJyA6IG51bGxcIixcbiAgICAgICAgXCJbYXR0ci5pbmVydF1cIjogXCJzdGF0ZS5pc0luZXJ0KCkgPyAnJyA6IG51bGxcIlxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbVWlTdGF0ZV1cbn0pXG5leHBvcnQgY2xhc3MgRGlzYWJsZWREaXJlY3RpdmUgZXh0ZW5kcyBBYnN0cmFjdFVpU3RhdGU8XCJkaXNhYmxlZFwiPiB7XG4gICAgcmVhZG9ubHkgaW5wdXQgPSBpbnB1dChOT1RTRVQgYXMgYm9vbGVhbiwgeyBhbGlhczogXCJudURpc2FibGVkXCIgfSlcbiAgICByZWFkb25seSB3aGVuID0gaW5wdXQoTk9UU0VUIGFzIHN0cmluZywgeyBhbGlhczogXCJudURpc2FibGVkV2hlblwiIH0pXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJkaXNhYmxlZFwiKVxuICAgIH1cbn1cbiJdfQ==
|