obsidian-dev-utils 86.1.2 → 86.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/dev/main.js +37333 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/__merged.cjs +34 -3
- package/dist/lib/cjs/__merged.d.cts +5 -4
- package/dist/lib/cjs/async-events.cjs +32 -3
- package/dist/lib/cjs/async-events.d.cts +63 -0
- package/dist/lib/cjs/disposable.cjs +103 -115
- package/dist/lib/cjs/disposable.d.cts +81 -57
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +48 -21
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +11 -8
- package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +1 -1
- package/dist/lib/cjs/obsidian/community-plugins.cjs +109 -9
- package/dist/lib/cjs/obsidian/community-plugins.d.cts +175 -3
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +18 -1
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +12 -0
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +8 -4
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +7 -3
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +5 -4
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -2
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +2 -7
- package/dist/lib/cjs/obsidian/events.cjs +165 -0
- package/dist/lib/cjs/obsidian/events.d.cts +98 -0
- package/dist/lib/cjs/obsidian/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +7 -3
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +31 -33
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.d.cts +11 -0
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +39 -52
- package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +1 -5
- package/dist/lib/cjs/type.cjs +31 -12
- package/dist/lib/cjs/type.d.cts +56 -36
- package/dist/lib/esm/__merged.d.mts +5 -4
- package/dist/lib/esm/__merged.mjs +39 -5
- package/dist/lib/esm/async-events.d.mts +63 -0
- package/dist/lib/esm/async-events.mjs +29 -2
- package/dist/lib/esm/disposable.d.mts +81 -57
- package/dist/lib/esm/disposable.mjs +101 -115
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +11 -8
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +49 -22
- package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/community-plugins.d.mts +175 -3
- package/dist/lib/esm/obsidian/community-plugins.mjs +100 -8
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +12 -0
- package/dist/lib/esm/obsidian/components/component-ex.mjs +18 -1
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +7 -3
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +8 -4
- package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -2
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +5 -4
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +5 -7
- package/dist/lib/esm/obsidian/events.d.mts +98 -0
- package/dist/lib/esm/obsidian/events.mjs +55 -0
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +7 -3
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.d.mts +11 -0
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +29 -32
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +40 -55
- package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +1 -5
- package/dist/lib/esm/type.d.mts +56 -36
- package/dist/lib/esm/type.mjs +30 -11
- package/obsidian/events/package.json +6 -0
- package/package.json +18 -15
|
@@ -38,148 +38,141 @@ var MultipleDisposeBehavior = /* @__PURE__ */ ((MultipleDisposeBehavior2) => {
|
|
|
38
38
|
MultipleDisposeBehavior2[MultipleDisposeBehavior2["Throw"] = 2] = "Throw";
|
|
39
39
|
return MultipleDisposeBehavior2;
|
|
40
40
|
})(MultipleDisposeBehavior || {});
|
|
41
|
-
class
|
|
42
|
-
callback;
|
|
43
|
-
isDisposed = false;
|
|
44
|
-
multipleDisposeBehavior;
|
|
41
|
+
class AsyncDisposableBase {
|
|
45
42
|
/**
|
|
46
|
-
*
|
|
43
|
+
* How the disposable behaves when disposed more than once.
|
|
47
44
|
*
|
|
48
|
-
* @
|
|
45
|
+
* @default {@link MultipleDisposeBehavior.Ignore}
|
|
49
46
|
*/
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
multipleDisposeBehavior = 1 /* Ignore */;
|
|
48
|
+
/**
|
|
49
|
+
* Whether this disposable has been disposed (its teardown has run at least once).
|
|
50
|
+
*
|
|
51
|
+
* @returns `true` once disposal has started.
|
|
52
|
+
*/
|
|
53
|
+
get isDisposed() {
|
|
54
|
+
return this._isDisposed;
|
|
53
55
|
}
|
|
56
|
+
_isDisposed = false;
|
|
54
57
|
/**
|
|
55
|
-
* Disposes the object
|
|
56
|
-
* `this[Symbol.asyncDispose]()`.
|
|
58
|
+
* Disposes the object. Convenience alias that delegates to `this[Symbol.asyncDispose]()`.
|
|
57
59
|
*
|
|
58
|
-
* @returns A {@link Promise} that resolves once
|
|
60
|
+
* @returns A {@link Promise} that resolves once teardown completes.
|
|
59
61
|
*/
|
|
60
62
|
asyncDispose() {
|
|
61
63
|
return this[Symbol.asyncDispose]();
|
|
62
64
|
}
|
|
63
65
|
/**
|
|
64
|
-
* Disposes the object by
|
|
66
|
+
* Disposes the object by running {@link AsyncDisposableBase.performDisposeAsync}, honoring the configured
|
|
67
|
+
* {@link MultipleDisposeBehavior} on a repeat dispose.
|
|
65
68
|
*
|
|
66
|
-
*
|
|
67
|
-
* can also be called manually. The behavior on a second and later dispose is controlled by
|
|
68
|
-
* {@link AsyncCallbackDisposableConstructorParams.multipleDisposeBehavior}.
|
|
69
|
-
*
|
|
70
|
-
* @returns A {@link Promise} that resolves once the callback completes.
|
|
69
|
+
* @returns A {@link Promise} that resolves once teardown completes.
|
|
71
70
|
*/
|
|
72
71
|
async [Symbol.asyncDispose]() {
|
|
73
|
-
if (this.
|
|
74
|
-
|
|
75
|
-
case 1 /* Ignore */:
|
|
76
|
-
return;
|
|
77
|
-
case 0 /* Invoke */:
|
|
78
|
-
break;
|
|
79
|
-
case 2 /* Throw */:
|
|
80
|
-
throw new Error("This AsyncCallbackDisposable has already been disposed.");
|
|
81
|
-
default:
|
|
82
|
-
assertNever(this.multipleDisposeBehavior);
|
|
83
|
-
}
|
|
72
|
+
if (!shouldPerformDispose(this._isDisposed, this.multipleDisposeBehavior)) {
|
|
73
|
+
return;
|
|
84
74
|
}
|
|
85
|
-
this.
|
|
86
|
-
await this.
|
|
75
|
+
this._isDisposed = true;
|
|
76
|
+
await this.performDisposeAsync();
|
|
87
77
|
}
|
|
88
78
|
}
|
|
89
|
-
class
|
|
79
|
+
class AsyncCallbackDisposable extends AsyncDisposableBase {
|
|
90
80
|
callback;
|
|
91
|
-
isDisposed = false;
|
|
92
|
-
multipleDisposeBehavior;
|
|
93
81
|
/**
|
|
94
|
-
* Creates a new instance of {@link
|
|
82
|
+
* Creates a new instance of {@link AsyncCallbackDisposable}.
|
|
95
83
|
*
|
|
96
84
|
* @param params - The parameters.
|
|
97
85
|
*/
|
|
98
86
|
constructor(params) {
|
|
87
|
+
super();
|
|
99
88
|
this.callback = params.callback;
|
|
100
|
-
this.multipleDisposeBehavior = params.multipleDisposeBehavior ??
|
|
89
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Runs the dispose callback.
|
|
93
|
+
*
|
|
94
|
+
* @returns A {@link Promise} that resolves once the callback completes.
|
|
95
|
+
*/
|
|
96
|
+
async performDisposeAsync() {
|
|
97
|
+
await this.callback();
|
|
101
98
|
}
|
|
99
|
+
}
|
|
100
|
+
class DisposableBase {
|
|
102
101
|
/**
|
|
103
|
-
*
|
|
104
|
-
*
|
|
102
|
+
* How the disposable behaves when disposed more than once.
|
|
103
|
+
*
|
|
104
|
+
* @default {@link MultipleDisposeBehavior.Ignore}
|
|
105
|
+
*/
|
|
106
|
+
multipleDisposeBehavior = 1 /* Ignore */;
|
|
107
|
+
/**
|
|
108
|
+
* Whether this disposable has been disposed (its teardown has run at least once).
|
|
109
|
+
*
|
|
110
|
+
* @returns `true` once disposal has started.
|
|
111
|
+
*/
|
|
112
|
+
get isDisposed() {
|
|
113
|
+
return this._isDisposed;
|
|
114
|
+
}
|
|
115
|
+
_isDisposed = false;
|
|
116
|
+
/**
|
|
117
|
+
* Disposes the object. Convenience alias that delegates to `this[Symbol.dispose]()`.
|
|
105
118
|
*/
|
|
106
119
|
dispose() {
|
|
107
120
|
this[Symbol.dispose]();
|
|
108
121
|
}
|
|
109
122
|
/**
|
|
110
|
-
* Disposes the object by
|
|
111
|
-
*
|
|
112
|
-
* This method is called automatically when the object is used in a `using` declaration. It can also
|
|
113
|
-
* be called manually. The behavior on a second and later dispose is controlled by
|
|
114
|
-
* {@link CallbackDisposableConstructorParams.multipleDisposeBehavior}.
|
|
123
|
+
* Disposes the object by running {@link DisposableBase.performDispose}, honoring the configured
|
|
124
|
+
* {@link MultipleDisposeBehavior} on a repeat dispose.
|
|
115
125
|
*/
|
|
116
126
|
[Symbol.dispose]() {
|
|
117
|
-
if (this.
|
|
118
|
-
|
|
119
|
-
case 1 /* Ignore */:
|
|
120
|
-
return;
|
|
121
|
-
case 0 /* Invoke */:
|
|
122
|
-
break;
|
|
123
|
-
case 2 /* Throw */:
|
|
124
|
-
throw new Error("This CallbackDisposable has already been disposed.");
|
|
125
|
-
default:
|
|
126
|
-
assertNever(this.multipleDisposeBehavior);
|
|
127
|
-
}
|
|
127
|
+
if (!shouldPerformDispose(this._isDisposed, this.multipleDisposeBehavior)) {
|
|
128
|
+
return;
|
|
128
129
|
}
|
|
129
|
-
this.
|
|
130
|
+
this._isDisposed = true;
|
|
131
|
+
this.performDispose();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
class CallbackDisposable extends DisposableBase {
|
|
135
|
+
callback;
|
|
136
|
+
/**
|
|
137
|
+
* Creates a new instance of {@link CallbackDisposable}.
|
|
138
|
+
*
|
|
139
|
+
* @param params - The parameters.
|
|
140
|
+
*/
|
|
141
|
+
constructor(params) {
|
|
142
|
+
super();
|
|
143
|
+
this.callback = params.callback;
|
|
144
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Runs the dispose callback.
|
|
148
|
+
*/
|
|
149
|
+
performDispose() {
|
|
130
150
|
this.callback();
|
|
131
151
|
}
|
|
132
152
|
}
|
|
133
|
-
class CombineAsyncDisposable {
|
|
153
|
+
class CombineAsyncDisposable extends AsyncDisposableBase {
|
|
134
154
|
children;
|
|
135
155
|
disposeOrder;
|
|
136
156
|
errorBehavior;
|
|
137
|
-
isDisposed = false;
|
|
138
|
-
multipleDisposeBehavior;
|
|
139
157
|
/**
|
|
140
158
|
* Creates a new instance of {@link CombineAsyncDisposable}.
|
|
141
159
|
*
|
|
142
160
|
* @param params - The parameters.
|
|
143
161
|
*/
|
|
144
162
|
constructor(params) {
|
|
163
|
+
super();
|
|
145
164
|
this.children = [...params.asyncDisposables];
|
|
146
165
|
this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
|
|
147
166
|
this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
|
|
148
|
-
this.multipleDisposeBehavior = params.multipleDisposeBehavior ??
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Disposes all combined children. Convenience alias that delegates to
|
|
152
|
-
* `this[Symbol.asyncDispose]()`.
|
|
153
|
-
*
|
|
154
|
-
* @returns A {@link Promise} that resolves once all children have been disposed.
|
|
155
|
-
*/
|
|
156
|
-
asyncDispose() {
|
|
157
|
-
return this[Symbol.asyncDispose]();
|
|
167
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
158
168
|
}
|
|
159
169
|
/**
|
|
160
170
|
* Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
|
|
161
171
|
* {@link DisposeErrorBehavior} when a child throws.
|
|
162
172
|
*
|
|
163
|
-
* This method is called automatically when the object is used in an `await using` declaration. It can
|
|
164
|
-
* also be called manually. The behavior on a second and later dispose is controlled by
|
|
165
|
-
* {@link CombineAsyncDisposableConstructorParams.multipleDisposeBehavior}.
|
|
166
|
-
*
|
|
167
173
|
* @returns A {@link Promise} that resolves once all children have been disposed.
|
|
168
174
|
*/
|
|
169
|
-
async
|
|
170
|
-
if (this.isDisposed) {
|
|
171
|
-
switch (this.multipleDisposeBehavior) {
|
|
172
|
-
case 1 /* Ignore */:
|
|
173
|
-
return;
|
|
174
|
-
case 0 /* Invoke */:
|
|
175
|
-
break;
|
|
176
|
-
case 2 /* Throw */:
|
|
177
|
-
throw new Error("This CombineAsyncDisposable has already been disposed.");
|
|
178
|
-
default:
|
|
179
|
-
assertNever(this.multipleDisposeBehavior);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
this.isDisposed = true;
|
|
175
|
+
async performDisposeAsync() {
|
|
183
176
|
const errors = [];
|
|
184
177
|
for (const child of this.getOrderedChildren()) {
|
|
185
178
|
try {
|
|
@@ -206,51 +199,27 @@ class CombineAsyncDisposable {
|
|
|
206
199
|
}
|
|
207
200
|
}
|
|
208
201
|
}
|
|
209
|
-
class CombineDisposable {
|
|
202
|
+
class CombineDisposable extends DisposableBase {
|
|
210
203
|
children;
|
|
211
204
|
disposeOrder;
|
|
212
205
|
errorBehavior;
|
|
213
|
-
isDisposed = false;
|
|
214
|
-
multipleDisposeBehavior;
|
|
215
206
|
/**
|
|
216
207
|
* Creates a new instance of {@link CombineDisposable}.
|
|
217
208
|
*
|
|
218
209
|
* @param params - The parameters.
|
|
219
210
|
*/
|
|
220
211
|
constructor(params) {
|
|
212
|
+
super();
|
|
221
213
|
this.children = [...params.disposables];
|
|
222
214
|
this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
|
|
223
215
|
this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
|
|
224
|
-
this.multipleDisposeBehavior = params.multipleDisposeBehavior ??
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Disposes all combined children. Convenience alias that delegates to `this[Symbol.dispose]()`.
|
|
228
|
-
*/
|
|
229
|
-
dispose() {
|
|
230
|
-
this[Symbol.dispose]();
|
|
216
|
+
this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 1 /* Ignore */;
|
|
231
217
|
}
|
|
232
218
|
/**
|
|
233
219
|
* Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
|
|
234
220
|
* {@link DisposeErrorBehavior} when a child throws.
|
|
235
|
-
*
|
|
236
|
-
* This method is called automatically when the object is used in a `using` declaration. It can also
|
|
237
|
-
* be called manually. The behavior on a second and later dispose is controlled by
|
|
238
|
-
* {@link CombineDisposableConstructorParams.multipleDisposeBehavior}.
|
|
239
221
|
*/
|
|
240
|
-
|
|
241
|
-
if (this.isDisposed) {
|
|
242
|
-
switch (this.multipleDisposeBehavior) {
|
|
243
|
-
case 1 /* Ignore */:
|
|
244
|
-
return;
|
|
245
|
-
case 0 /* Invoke */:
|
|
246
|
-
break;
|
|
247
|
-
case 2 /* Throw */:
|
|
248
|
-
throw new Error("This CombineDisposable has already been disposed.");
|
|
249
|
-
default:
|
|
250
|
-
assertNever(this.multipleDisposeBehavior);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
this.isDisposed = true;
|
|
222
|
+
performDispose() {
|
|
254
223
|
const errors = [];
|
|
255
224
|
for (const child of this.getOrderedChildren()) {
|
|
256
225
|
try {
|
|
@@ -317,11 +286,28 @@ function toDisposableEx(disposable) {
|
|
|
317
286
|
disposable[Symbol.dispose]();
|
|
318
287
|
}
|
|
319
288
|
}
|
|
289
|
+
function shouldPerformDispose(isDisposed, multipleDisposeBehavior) {
|
|
290
|
+
if (!isDisposed) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
switch (multipleDisposeBehavior) {
|
|
294
|
+
case 1 /* Ignore */:
|
|
295
|
+
return false;
|
|
296
|
+
case 0 /* Invoke */:
|
|
297
|
+
return true;
|
|
298
|
+
case 2 /* Throw */:
|
|
299
|
+
throw new Error("This disposable has already been disposed.");
|
|
300
|
+
default:
|
|
301
|
+
assertNever(multipleDisposeBehavior);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
320
304
|
export {
|
|
321
305
|
AsyncCallbackDisposable,
|
|
306
|
+
AsyncDisposableBase,
|
|
322
307
|
CallbackDisposable,
|
|
323
308
|
CombineAsyncDisposable,
|
|
324
309
|
CombineDisposable,
|
|
310
|
+
DisposableBase,
|
|
325
311
|
DisposeErrorBehavior,
|
|
326
312
|
DisposeOrder,
|
|
327
313
|
MultipleDisposeBehavior,
|
|
@@ -332,4 +318,4 @@ export {
|
|
|
332
318
|
toAsyncDisposableEx,
|
|
333
319
|
toDisposableEx
|
|
334
320
|
};
|
|
335
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgZXJyb3Igc2VtYW50aWNzIG9mIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gd2hlblxuICogb25lIG9mIGl0cyBjaGlsZHJlbiB0aHJvd3Mgd2hpbGUgYmVpbmcgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBlbnVtIERpc3Bvc2VFcnJvckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgZXZlcnkgY2hpbGQgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3csIGNvbGxlY3RpbmcgdGhlIHRocm93biBlcnJvcnMgYW5kIHJlLXRocm93aW5nIHRoZW1cbiAgICogYXMgYSBzaW5nbGUge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfSBvbmNlIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICBBZ2dyZWdhdGUsXG5cbiAgLyoqXG4gICAqIFJlLXRocm93IHRoZSBmaXJzdCBlcnJvciBhIGNoaWxkIHRocm93cyBpbW1lZGlhdGVseSwgbGVhdmluZyB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHVuZGlzcG9zZWQuXG4gICAqL1xuICBGYWlsRmFzdFxufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIG9yZGVyIGluIHdoaWNoIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gZGlzcG9zZXNcbiAqIGl0cyBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGVudW0gRGlzcG9zZU9yZGVyIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIGxhc3QtcmVnaXN0ZXJlZCBjaGlsZCBmaXJzdCAobGFzdC1pbiwgZmlyc3Qtb3V0KSwgbGlrZSBuZXN0ZWQgYHVzaW5nYCBkZWNsYXJhdGlvbnNcbiAgICogdW53aW5kaW5nIGluIHJldmVyc2UuXG4gICAqL1xuICBMaWZvLFxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIHRoZSBmaXJzdC1yZWdpc3RlcmVkIGNoaWxkIGZpcnN0IChmaXJzdC1pbiwgZmlyc3Qtb3V0KS5cbiAgICovXG4gIEZpZm9cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGhvdyBhIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9IG9yIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0gYmVoYXZlcyB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAqL1xuZXhwb3J0IGVudW0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Ige1xuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiBldmVyeSBkaXNwb3NlLlxuICAgKi9cbiAgSW52b2tlLFxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBmaXJzdCBkaXNwb3NlIG9ubHk7IHN1YnNlcXVlbnQgZGlzcG9zZXMgYXJlIG5vLW9wcy5cbiAgICovXG4gIElnbm9yZSxcblxuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgZmlyc3QgZGlzcG9zZSBvbmx5OyBzdWJzZXF1ZW50IGRpc3Bvc2VzIHRocm93LlxuICAgKi9cbiAgVGhyb3dcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRpc3Bvc2FibGUgYmVoYXZlcyB3aGVuIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlfVxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I/OiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlfSB0aGF0IGFkZGl0aW9uYWxseSBleHBvc2VzIGEgY29udmVuaWVuY2Uge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZX1cbiAqIG1ldGhvZCwgc28gYSBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmFzeW5jRGlzcG9zZSgpYCBpbnN0ZWFkIG9mIHRoZSBjbHVua2llclxuICogYGhhbmRsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0Rpc3Bvc2FibGVFeCBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGlzIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgdHlwZSBBc3luY0Rpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IERpc3Bvc2VDYWxsYmFjaztcblxuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFzeW5jIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBhc3luY0Rpc3Bvc2FibGVzOiBJdGVyYWJsZTxBc3luY0Rpc3Bvc2FibGU+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNoaWxkcmVuIGFyZSBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VPcmRlci5MaWZvfVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcG9zZU9yZGVyPzogRGlzcG9zZU9yZGVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBvbmUgb2YgaXRzIGNoaWxkcmVuIHRocm93cyB3aGlsZSBiZWluZyBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yLkFnZ3JlZ2F0ZX1cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I/OiBEaXNwb3NlRXJyb3JCZWhhdmlvcjtcblxuICAvKipcbiAgICogSG93IHRoZSBjb21iaW5lciBiZWhhdmVzIHdoZW4gaXQgaXMgZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ29tYmluZURpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNwb3NhYmxlczogSXRlcmFibGU8RGlzcG9zYWJsZT47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4gYXJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZU9yZGVyLkxpZm99XG4gICAqL1xuICByZWFkb25seSBkaXNwb3NlT3JkZXI/OiBEaXNwb3NlT3JkZXI7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgY29tYmluZXIgYmVoYXZlcyB3aGVuIG9uZSBvZiBpdHMgY2hpbGRyZW4gdGhyb3dzIHdoaWxlIGJlaW5nIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlfVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JCZWhhdmlvcj86IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBpdCBpcyBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBhZGRpdGlvbmFsbHkgZXhwb3NlcyBhIGNvbnZlbmllbmNlIHtAbGluayBEaXNwb3NhYmxlRXguZGlzcG9zZX0gbWV0aG9kLCBzbyBhXG4gKiBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmRpc3Bvc2UoKWAgaW5zdGVhZCBvZiB0aGUgY2x1bmtpZXIgYGhhbmRsZVtTeW1ib2wuZGlzcG9zZV0oKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zYWJsZUV4IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIGFzeW5jIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQgdmlhIGBhd2FpdCB1c2luZ2AgKG9yIGEgbWFudWFsXG4gKiBgYXdhaXQgZGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogQXN5bmNEaXNwb3NlQ2FsbGJhY2s7XG4gIHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5jYWxsYmFjayA9IHBhcmFtcy5jYWxsYmFjaztcbiAgICB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gcGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID8/IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suIENvbnZlbmllbmNlIGFsaWFzIHRoYXQgZGVsZWdhdGVzIHRvXG4gICAqIGB0aGlzW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGluIGFuIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb24uIEl0XG4gICAqIGNhbiBhbHNvIGJlIGNhbGxlZCBtYW51YWxseS4gVGhlIGJlaGF2aW9yIG9uIGEgc2Vjb25kIGFuZCBsYXRlciBkaXNwb3NlIGlzIGNvbnRyb2xsZWQgYnlcbiAgICoge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlIGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLmNhbGxiYWNrKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0Rpc3Bvc2FibGUgaW1wbGVtZW50cyBEaXNwb3NhYmxlRXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiBEaXNwb3NlQ2FsbGJhY2s7XG4gIHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gcGFyYW1zLmNhbGxiYWNrO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QgYnkgZXhlY3V0aW5nIHRoZSBjYWxsYmFjay4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG9cbiAgICogYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGluIGEgYHVzaW5nYCBkZWNsYXJhdGlvbi4gSXQgY2FuIGFsc29cbiAgICogYmUgY2FsbGVkIG1hbnVhbGx5LiBUaGUgYmVoYXZpb3Igb24gYSBzZWNvbmQgYW5kIGxhdGVyIGRpc3Bvc2UgaXMgY29udHJvbGxlZCBieVxuICAgKiB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKi9cbiAgcHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIENhbGxiYWNrRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5jYWxsYmFjaygpO1xuICB9XG59XG5cbi8qKlxuICogQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGFzeW5jIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0XG4gKiBpcyBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVBc3luY0Rpc3Bvc2FibGUgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGVFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IHJlYWRvbmx5IEFzeW5jRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVBc3luY0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLnBhcmFtcy5hc3luY0Rpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbi4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG9cbiAgICogYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jRGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpc1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbiBpbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgRGlzcG9zZU9yZGVyfSwgYXBwbHlpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yfSB3aGVuIGEgY2hpbGQgdGhyb3dzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhbiBgYXdhaXQgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdCBjYW5cbiAgICogYWxzbyBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIENvbWJpbmVBc3luY0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhc3NlcnROZXZlcih0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZ2V0T3JkZXJlZENoaWxkcmVuKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNoaWxkW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5lcnJvckJlaGF2aW9yID09PSBEaXNwb3NlRXJyb3JCZWhhdmlvci5GYWlsRmFzdCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgQXN5bmNEaXNwb3NhYmxlW10ge1xuICAgIHN3aXRjaCAodGhpcy5kaXNwb3NlT3JkZXIpIHtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkZpZm86XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICAgICAgY2FzZSBEaXNwb3NlT3JkZXIuTGlmbzpcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXS5yZXZlcnNlKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcih0aGlzLmRpc3Bvc2VPcmRlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVEaXNwb3NhYmxlIGltcGxlbWVudHMgRGlzcG9zYWJsZUV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbjogcmVhZG9ubHkgRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tYmluZURpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4ucGFyYW1zLmRpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbi4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBhbGwgY29tYmluZWQgY2hpbGRyZW4gaW4gdGhlIGNvbmZpZ3VyZWQge0BsaW5rIERpc3Bvc2VPcmRlcn0sIGFwcGx5aW5nIHRoZSBjb25maWd1cmVkXG4gICAqIHtAbGluayBEaXNwb3NlRXJyb3JCZWhhdmlvcn0gd2hlbiBhIGNoaWxkIHRocm93cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgb2JqZWN0IGlzIHVzZWQgaW4gYSBgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdCBjYW4gYWxzb1xuICAgKiBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBDb21iaW5lRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBDb21iaW5lRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cbiAgICBjb25zdCBlcnJvcnM6IHVua25vd25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5nZXRPcmRlcmVkQ2hpbGRyZW4oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5lcnJvckJlaGF2aW9yID09PSBEaXNwb3NlRXJyb3JCZWhhdmlvci5GYWlsRmFzdCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgRGlzcG9zYWJsZVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZGlzcG9zZU9yZGVyKSB7XG4gICAgICBjYXNlIERpc3Bvc2VPcmRlci5GaWZvOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkxpZm86XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0ucmV2ZXJzZSgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5kaXNwb3NlT3JkZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGFzeW5jRGlzcG9zYWJsZSA9IG9iaiBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWFzeW5jRGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXN5bmNEaXNwb3NhYmxlRXgob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgY29uc3QgYXN5bmNEaXNwb3NhYmxlRXggPSBvYmogYXMgUGFydGlhbDxBc3luY0Rpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0FzeW5jRGlzcG9zYWJsZShvYmopICYmIHR5cGVvZiBhc3luY0Rpc3Bvc2FibGVFeC5hc3luY0Rpc3Bvc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBEaXNwb3NhYmxlfSBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIERpc3Bvc2FibGUge1xuICBjb25zdCBkaXNwb3NhYmxlID0gb2JqIGFzIFBhcnRpYWw8RGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWRpc3Bvc2FibGVbU3ltYm9sLmRpc3Bvc2VdO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNwb3NhYmxlRXgob2JqOiB1bmtub3duKTogb2JqIGlzIERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGRpc3Bvc2FibGVFeCA9IG9iaiBhcyBQYXJ0aWFsPERpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0Rpc3Bvc2FibGUob2JqKSAmJiB0eXBlb2YgZGlzcG9zYWJsZUV4LmRpc3Bvc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZX0gaW50byBhbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGJ5IGFkZGluZyBhIGNvbnZlbmllbmNlXG4gKiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXguYXN5bmNEaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5hc3luY0Rpc3Bvc2VgLlxuICpcbiAqIElmIHRoZSBvYmplY3QgYWxyZWFkeSBpbXBsZW1lbnRzIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNEaXNwb3NhYmxlIC0gdGhlIGFzeW5jIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGFzeW5jIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FzeW5jRGlzcG9zYWJsZUV4KGFzeW5jRGlzcG9zYWJsZTogQXN5bmNEaXNwb3NhYmxlKTogQXN5bmNEaXNwb3NhYmxlRXgge1xuICBpZiAoaXNBc3luY0Rpc3Bvc2FibGVFeChhc3luY0Rpc3Bvc2FibGUpKSB7XG4gICAgcmV0dXJuIGFzeW5jRGlzcG9zYWJsZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmNEaXNwb3NlLFxuICAgIFtTeW1ib2wuYXN5bmNEaXNwb3NlXTogYXN5bmNEaXNwb3NlXG4gIH07XG5cbiAgZnVuY3Rpb24gYXN5bmNEaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXN5bmNEaXNwb3NhYmxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkpO1xuICB9XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIERpc3Bvc2FibGV9IGludG8gYSB7QGxpbmsgRGlzcG9zYWJsZUV4fSBieSBhZGRpbmcgYSBjb252ZW5pZW5jZVxuICoge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5kaXNwb3NlYC5cbiAqXG4gKiBJZiB0aGUgb2JqZWN0IGFscmVhZHkgaW1wbGVtZW50cyB7QGxpbmsgRGlzcG9zYWJsZUV4fSwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBkaXNwb3NhYmxlIC0gdGhlIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGVFeChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZUV4IHtcbiAgaWYgKGlzRGlzcG9zYWJsZUV4KGRpc3Bvc2FibGUpKSB7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRpc3Bvc2UsXG4gICAgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLG1CQUFtQjtBQU1yQixJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUtMLEVBQUFBLDRDQUFBO0FBS0EsRUFBQUEsNENBQUE7QUFWVSxTQUFBQTtBQUFBLEdBQUE7QUFpQkwsSUFBSyxlQUFMLGtCQUFLQyxrQkFBTDtBQUtMLEVBQUFBLDRCQUFBO0FBS0EsRUFBQUEsNEJBQUE7QUFWVSxTQUFBQTtBQUFBLEdBQUE7QUFpQkwsSUFBSywwQkFBTCxrQkFBS0MsNkJBQUw7QUFJTCxFQUFBQSxrREFBQTtBQUtBLEVBQUFBLGtEQUFBO0FBS0EsRUFBQUEsa0RBQUE7QUFkVSxTQUFBQTtBQUFBLEdBQUE7QUF3SkwsTUFBTSx3QkFBcUQ7QUFBQSxFQUMvQztBQUFBLEVBQ1QsYUFBYTtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQWtEO0FBQ25FLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssMEJBQTBCLE9BQU8sMkJBQTJCO0FBQUEsRUFDbkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGVBQThCO0FBQ25DLFdBQU8sS0FBSyxPQUFPLFlBQVksRUFBRTtBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtB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
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgZXJyb3Igc2VtYW50aWNzIG9mIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gd2hlblxuICogb25lIG9mIGl0cyBjaGlsZHJlbiB0aHJvd3Mgd2hpbGUgYmVpbmcgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBlbnVtIERpc3Bvc2VFcnJvckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgZXZlcnkgY2hpbGQgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3csIGNvbGxlY3RpbmcgdGhlIHRocm93biBlcnJvcnMgYW5kIHJlLXRocm93aW5nIHRoZW1cbiAgICogYXMgYSBzaW5nbGUge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfSBvbmNlIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICBBZ2dyZWdhdGUsXG5cbiAgLyoqXG4gICAqIFJlLXRocm93IHRoZSBmaXJzdCBlcnJvciBhIGNoaWxkIHRocm93cyBpbW1lZGlhdGVseSwgbGVhdmluZyB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHVuZGlzcG9zZWQuXG4gICAqL1xuICBGYWlsRmFzdFxufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIG9yZGVyIGluIHdoaWNoIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gZGlzcG9zZXNcbiAqIGl0cyBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGVudW0gRGlzcG9zZU9yZGVyIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIGxhc3QtcmVnaXN0ZXJlZCBjaGlsZCBmaXJzdCAobGFzdC1pbiwgZmlyc3Qtb3V0KSwgbGlrZSBuZXN0ZWQgYHVzaW5nYCBkZWNsYXJhdGlvbnNcbiAgICogdW53aW5kaW5nIGluIHJldmVyc2UuXG4gICAqL1xuICBMaWZvLFxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIHRoZSBmaXJzdC1yZWdpc3RlcmVkIGNoaWxkIGZpcnN0IChmaXJzdC1pbiwgZmlyc3Qtb3V0KS5cbiAgICovXG4gIEZpZm9cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGhvdyBhIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9IG9yIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0gYmVoYXZlcyB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAqL1xuZXhwb3J0IGVudW0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Ige1xuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiBldmVyeSBkaXNwb3NlLlxuICAgKi9cbiAgSW52b2tlLFxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBmaXJzdCBkaXNwb3NlIG9ubHk7IHN1YnNlcXVlbnQgZGlzcG9zZXMgYXJlIG5vLW9wcy5cbiAgICovXG4gIElnbm9yZSxcblxuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgZmlyc3QgZGlzcG9zZSBvbmx5OyBzdWJzZXF1ZW50IGRpc3Bvc2VzIHRocm93LlxuICAgKi9cbiAgVGhyb3dcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRpc3Bvc2FibGUgYmVoYXZlcyB3aGVuIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlfVxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I/OiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlfSB0aGF0IGFkZGl0aW9uYWxseSBleHBvc2VzIGEgY29udmVuaWVuY2Uge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZX1cbiAqIG1ldGhvZCwgc28gYSBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmFzeW5jRGlzcG9zZSgpYCBpbnN0ZWFkIG9mIHRoZSBjbHVua2llclxuICogYGhhbmRsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0Rpc3Bvc2FibGVFeCBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGlzIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgdHlwZSBBc3luY0Rpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IERpc3Bvc2VDYWxsYmFjaztcblxuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFzeW5jIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBhc3luY0Rpc3Bvc2FibGVzOiBJdGVyYWJsZTxBc3luY0Rpc3Bvc2FibGU+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNoaWxkcmVuIGFyZSBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VPcmRlci5MaWZvfVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcG9zZU9yZGVyPzogRGlzcG9zZU9yZGVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBvbmUgb2YgaXRzIGNoaWxkcmVuIHRocm93cyB3aGlsZSBiZWluZyBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yLkFnZ3JlZ2F0ZX1cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I/OiBEaXNwb3NlRXJyb3JCZWhhdmlvcjtcblxuICAvKipcbiAgICogSG93IHRoZSBjb21iaW5lciBiZWhhdmVzIHdoZW4gaXQgaXMgZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmV9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ29tYmluZURpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNwb3NhYmxlczogSXRlcmFibGU8RGlzcG9zYWJsZT47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4gYXJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZU9yZGVyLkxpZm99XG4gICAqL1xuICByZWFkb25seSBkaXNwb3NlT3JkZXI/OiBEaXNwb3NlT3JkZXI7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgY29tYmluZXIgYmVoYXZlcyB3aGVuIG9uZSBvZiBpdHMgY2hpbGRyZW4gdGhyb3dzIHdoaWxlIGJlaW5nIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlfVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JCZWhhdmlvcj86IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBpdCBpcyBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBhZGRpdGlvbmFsbHkgZXhwb3NlcyBhIGNvbnZlbmllbmNlIHtAbGluayBEaXNwb3NhYmxlRXguZGlzcG9zZX0gbWV0aG9kLCBzbyBhXG4gKiBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmRpc3Bvc2UoKWAgaW5zdGVhZCBvZiB0aGUgY2x1bmtpZXIgYGhhbmRsZVtTeW1ib2wuZGlzcG9zZV0oKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zYWJsZUV4IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgZm9yIGFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH06IGl0IGNhcnJpZXMgdGhlIHJlLWRpc3Bvc2UgZ3VhcmQgKHZpYVxuICoge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfSkgYW5kIHRoZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXguYXN5bmNEaXNwb3NlfSBhbGlhczsgYSBzdWJjbGFzcyBvbmx5XG4gKiBpbXBsZW1lbnRzIHtAbGluayBBc3luY0Rpc3Bvc2FibGVCYXNlLnBlcmZvcm1EaXNwb3NlQXN5bmN9LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXN5bmNEaXNwb3NhYmxlQmFzZSBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgLyoqXG4gICAqIEhvdyB0aGUgZGlzcG9zYWJsZSBiZWhhdmVzIHdoZW4gZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmV9XG4gICAqL1xuICBwcm90ZWN0ZWQgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGlzcG9zYWJsZSBoYXMgYmVlbiBkaXNwb3NlZCAoaXRzIHRlYXJkb3duIGhhcyBydW4gYXQgbGVhc3Qgb25jZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBvbmNlIGRpc3Bvc2FsIGhhcyBzdGFydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBpc0Rpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBDb252ZW5pZW5jZSBhbGlhcyB0aGF0IGRlbGVnYXRlcyB0byBgdGhpc1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRlYXJkb3duIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IHJ1bm5pbmcge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUJhc2UucGVyZm9ybURpc3Bvc2VBc3luY30sIGhvbm9yaW5nIHRoZSBjb25maWd1cmVkXG4gICAqIHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcn0gb24gYSByZXBlYXQgZGlzcG9zZS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRlYXJkb3duIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzaG91bGRQZXJmb3JtRGlzcG9zZSh0aGlzLl9pc0Rpc3Bvc2VkLCB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMucGVyZm9ybURpc3Bvc2VBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgdGVhcmRvd24uIENhbGxlZCBhdCBtb3N0IG9uY2UgdW5sZXNzIHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9IGlzIHNldC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzYWJsZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRlYXJkb3duIGNvbXBsZXRlcy5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IFByb21pc2FibGU8dm9pZD47XG59XG5cbi8qKlxuICogQW4gYXN5bmMgZGlzcG9zYWJsZSB0aGF0IGV4ZWN1dGVzIGEgY2FsbGJhY2sgd2hlbiBkaXNwb3NlZCB2aWEgYGF3YWl0IHVzaW5nYCAob3IgYSBtYW51YWxcbiAqIGBhd2FpdCBkaXNwb3NhYmxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlQmFzZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgdGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA9IHBhcmFtcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA/PyBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmU7XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgZGlzcG9zZSBjYWxsYmFjay5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjYWxsYmFjayBjb21wbGV0ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGVyZm9ybURpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNhbGxiYWNrKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGZvciBhIHtAbGluayBEaXNwb3NhYmxlRXh9OiBpdCBjYXJyaWVzIHRoZSByZS1kaXNwb3NlIGd1YXJkICh2aWEge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfSlcbiAqIGFuZCB0aGUge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBhbGlhczsgYSBzdWJjbGFzcyBvbmx5IGltcGxlbWVudHMge0BsaW5rIERpc3Bvc2FibGVCYXNlLnBlcmZvcm1EaXNwb3NlfS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpc3Bvc2FibGVCYXNlIGltcGxlbWVudHMgRGlzcG9zYWJsZUV4IHtcbiAgLyoqXG4gICAqIEhvdyB0aGUgZGlzcG9zYWJsZSBiZWhhdmVzIHdoZW4gZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmV9XG4gICAqL1xuICBwcm90ZWN0ZWQgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGlzcG9zYWJsZSBoYXMgYmVlbiBkaXNwb3NlZCAoaXRzIHRlYXJkb3duIGhhcyBydW4gYXQgbGVhc3Qgb25jZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBvbmNlIGRpc3Bvc2FsIGhhcyBzdGFydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBpc0Rpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3Bvc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBDb252ZW5pZW5jZSBhbGlhcyB0aGF0IGRlbGVnYXRlcyB0byBgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKWAuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzW1N5bWJvbC5kaXNwb3NlXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QgYnkgcnVubmluZyB7QGxpbmsgRGlzcG9zYWJsZUJhc2UucGVyZm9ybURpc3Bvc2V9LCBob25vcmluZyB0aGUgY29uZmlndXJlZFxuICAgKiB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9IG9uIGEgcmVwZWF0IGRpc3Bvc2UuXG4gICAqL1xuICBwdWJsaWMgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZFBlcmZvcm1EaXNwb3NlKHRoaXMuX2lzRGlzcG9zZWQsIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5wZXJmb3JtRGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgdGVhcmRvd24uIENhbGxlZCBhdCBtb3N0IG9uY2UgdW5sZXNzIHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9IGlzIHNldC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwZXJmb3JtRGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgZGlzcG9zYWJsZSB0aGF0IGV4ZWN1dGVzIGEgY2FsbGJhY2sgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrRGlzcG9zYWJsZSBleHRlbmRzIERpc3Bvc2FibGVCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jYWxsYmFjayA9IHBhcmFtcy5jYWxsYmFjaztcbiAgICB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gcGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID8/IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBkaXNwb3NlIGNhbGxiYWNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBlcmZvcm1EaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gdGhhdCBjb21iaW5lcyBtdWx0aXBsZSBhc3luYyBkaXNwb3NhYmxlcyBhbmQgZGlzcG9zZXMgYWxsIG9mIHRoZW0gd2hlbiBpdFxuICogaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lQXN5bmNEaXNwb3NhYmxlIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlQmFzZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IHJlYWRvbmx5IEFzeW5jRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tYmluZUFzeW5jRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLnBhcmFtcy5hc3luY0Rpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbiBpbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgRGlzcG9zZU9yZGVyfSwgYXBwbHlpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yfSB3aGVuIGEgY2hpbGQgdGhyb3dzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXNwb3NlZC5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmdldE9yZGVyZWRDaGlsZHJlbigpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGlsZFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JCZWhhdmlvciA9PT0gRGlzcG9zZUVycm9yQmVoYXZpb3IuRmFpbEZhc3QpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JkZXJlZENoaWxkcmVuKCk6IHJlYWRvbmx5IEFzeW5jRGlzcG9zYWJsZVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZGlzcG9zZU9yZGVyKSB7XG4gICAgICBjYXNlIERpc3Bvc2VPcmRlci5GaWZvOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkxpZm86XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0ucmV2ZXJzZSgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5kaXNwb3NlT3JkZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEge0BsaW5rIERpc3Bvc2FibGVFeH0gdGhhdCBjb21iaW5lcyBtdWx0aXBsZSBkaXNwb3NhYmxlcyBhbmQgZGlzcG9zZXMgYWxsIG9mIHRoZW0gd2hlbiBpdCBpc1xuICogZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21iaW5lRGlzcG9zYWJsZSBleHRlbmRzIERpc3Bvc2FibGVCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbjogcmVhZG9ubHkgRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDb21iaW5lRGlzcG9zYWJsZX0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IENvbWJpbmVEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4ucGFyYW1zLmRpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbiBpbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgRGlzcG9zZU9yZGVyfSwgYXBwbHlpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yfSB3aGVuIGEgY2hpbGQgdGhyb3dzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBlcmZvcm1EaXNwb3NlKCk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmdldE9yZGVyZWRDaGlsZHJlbigpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjaGlsZFtTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yQmVoYXZpb3IgPT09IERpc3Bvc2VFcnJvckJlaGF2aW9yLkZhaWxGYXN0KSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE9yZGVyZWRDaGlsZHJlbigpOiByZWFkb25seSBEaXNwb3NhYmxlW10ge1xuICAgIHN3aXRjaCAodGhpcy5kaXNwb3NlT3JkZXIpIHtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkZpZm86XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICAgICAgY2FzZSBEaXNwb3NlT3JkZXIuTGlmbzpcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXS5yZXZlcnNlKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcih0aGlzLmRpc3Bvc2VPcmRlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZX0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmogLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZX0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZX0gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FzeW5jRGlzcG9zYWJsZShvYmo6IHVua25vd24pOiBvYmogaXMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgY29uc3QgYXN5bmNEaXNwb3NhYmxlID0gb2JqIGFzIFBhcnRpYWw8QXN5bmNEaXNwb3NhYmxlPjtcbiAgcmV0dXJuICEhYXN5bmNEaXNwb3NhYmxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmogLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGVFeChvYmo6IHVua25vd24pOiBvYmogaXMgQXN5bmNEaXNwb3NhYmxlRXgge1xuICBjb25zdCBhc3luY0Rpc3Bvc2FibGVFeCA9IG9iaiBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZUV4PjtcbiAgcmV0dXJuIGlzQXN5bmNEaXNwb3NhYmxlKG9iaikgJiYgdHlwZW9mIGFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmogLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlfSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzcG9zYWJsZShvYmo6IHVua25vd24pOiBvYmogaXMgRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBvYmogYXMgUGFydGlhbDxEaXNwb3NhYmxlPjtcbiAgcmV0dXJuICEhZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGVFeH0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmogLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIERpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3Bvc2FibGVFeChvYmo6IHVua25vd24pOiBvYmogaXMgRGlzcG9zYWJsZUV4IHtcbiAgY29uc3QgZGlzcG9zYWJsZUV4ID0gb2JqIGFzIFBhcnRpYWw8RGlzcG9zYWJsZUV4PjtcbiAgcmV0dXJuIGlzRGlzcG9zYWJsZShvYmopICYmIHR5cGVvZiBkaXNwb3NhYmxlRXguZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBBZGFwdHMgYSBwbGFpbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlfSBpbnRvIGFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gYnkgYWRkaW5nIGEgY29udmVuaWVuY2VcbiAqIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeC5hc3luY0Rpc3Bvc2V9IG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byBgU3ltYm9sLmFzeW5jRGlzcG9zZWAuXG4gKlxuICogSWYgdGhlIG9iamVjdCBhbHJlYWR5IGltcGxlbWVudHMge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBhc3luY0Rpc3Bvc2FibGUgLSB0aGUgYXN5bmMgZGlzcG9zYWJsZSB0byBhZGFwdFxuICogQHJldHVybnMgQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB3cmFwcGluZyB0aGUgYXN5bmMgZGlzcG9zYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXN5bmNEaXNwb3NhYmxlRXgoYXN5bmNEaXNwb3NhYmxlOiBBc3luY0Rpc3Bvc2FibGUpOiBBc3luY0Rpc3Bvc2FibGVFeCB7XG4gIGlmIChpc0FzeW5jRGlzcG9zYWJsZUV4KGFzeW5jRGlzcG9zYWJsZSkpIHtcbiAgICByZXR1cm4gYXN5bmNEaXNwb3NhYmxlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luY0Rpc3Bvc2UsXG4gICAgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOiBhc3luY0Rpc3Bvc2VcbiAgfTtcblxuICBmdW5jdGlvbiBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhc3luY0Rpc3Bvc2FibGVbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGFwdHMgYSBwbGFpbiB7QGxpbmsgRGlzcG9zYWJsZX0gaW50byBhIHtAbGluayBEaXNwb3NhYmxlRXh9IGJ5IGFkZGluZyBhIGNvbnZlbmllbmNlXG4gKiB7QGxpbmsgRGlzcG9zYWJsZUV4LmRpc3Bvc2V9IG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byBgU3ltYm9sLmRpc3Bvc2VgLlxuICpcbiAqIElmIHRoZSBvYmplY3QgYWxyZWFkeSBpbXBsZW1lbnRzIHtAbGluayBEaXNwb3NhYmxlRXh9LCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIGRpc3Bvc2FibGUgLSB0aGUgZGlzcG9zYWJsZSB0byBhZGFwdFxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB3cmFwcGluZyB0aGUgZGlzcG9zYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGlzcG9zYWJsZUV4KGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlRXgge1xuICBpZiAoaXNEaXNwb3NhYmxlRXgoZGlzcG9zYWJsZSkpIHtcbiAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGlzcG9zZSxcbiAgICBbU3ltYm9sLmRpc3Bvc2VdOiBkaXNwb3NlXG4gIH07XG5cbiAgZnVuY3Rpb24gZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBkaXNwb3NhYmxlW1N5bWJvbC5kaXNwb3NlXSgpO1xuICB9XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgZGlzcG9zYWJsZSdzIHRlYXJkb3duIHNob3VsZCBydW4gb24gdGhlIGN1cnJlbnQgZGlzcG9zZSBjYWxsLCBhcHBseWluZyB0aGVcbiAqIHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcn0gcmUtZGlzcG9zZSBwb2xpY3kuIFNpbmdsZSBzb3VyY2Ugb2YgdGhlIGd1YXJkIHNoYXJlZCBieVxuICoge0BsaW5rIERpc3Bvc2FibGVCYXNlfSBhbmQge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUJhc2V9LlxuICpcbiAqIEBwYXJhbSBpc0Rpc3Bvc2VkIC0gV2hldGhlciB0aGUgZGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9uY2UuXG4gKiBAcGFyYW0gbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgLSBUaGUgcmUtZGlzcG9zZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB0ZWFyZG93biBzaG91bGQgcnVuLCBgZmFsc2VgIHdoZW4gaXQgc2hvdWxkIGJlIHNraXBwZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFBlcmZvcm1EaXNwb3NlKGlzRGlzcG9zZWQ6IGJvb2xlYW4sIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcik6IGJvb2xlYW4ge1xuICBpZiAoIWlzRGlzcG9zZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN3aXRjaCAobXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpIHtcbiAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZTpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcik7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsU0FBUyxtQkFBbUI7QUFNckIsSUFBSyx1QkFBTCxrQkFBS0EsMEJBQUw7QUFLTCxFQUFBQSw0Q0FBQTtBQUtBLEVBQUFBLDRDQUFBO0FBVlUsU0FBQUE7QUFBQSxHQUFBO0FBaUJMLElBQUssZUFBTCxrQkFBS0Msa0JBQUw7QUFLTCxFQUFBQSw0QkFBQTtBQUtBLEVBQUFBLDRCQUFBO0FBVlUsU0FBQUE7QUFBQSxHQUFBO0FBaUJMLElBQUssMEJBQUwsa0JBQUtDLDZCQUFMO0FBSUwsRUFBQUEsa0RBQUE7QUFLQSxFQUFBQSxrREFBQTtBQUtBLEVBQUFBLGtEQUFBO0FBZFUsU0FBQUE7QUFBQSxHQUFBO0FBeUpMLE1BQWUsb0JBQWlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTNELDBCQUFtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU83RCxJQUFjLGFBQXNCO0FBQ2xDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVRLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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
|
|
@@ -21,7 +21,7 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
-
const LIBRARY_VERSION = "86.
|
|
24
|
+
const LIBRARY_VERSION = "86.2.0";
|
|
25
25
|
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n align-items: center;\n background-color: transparent;\n box-shadow: none;\n color: var(--text-muted);\n cursor: pointer;\n display: inline-flex;\n height: var(--size-4-5);\n justify-content: center;\n padding: 0;\n position: absolute;\n right: 0;\n top: 0;\n width: var(--size-4-5);\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button:hover {\n color: var(--text-normal);\n}\n.obsidian-dev-utils.plugin-notice-requires-confirmation.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-confirmation.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAQN;EACE;;AAEA;EACE;;;AC5CF;EACE;;;ACDF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%20%20%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20%20%20height:%20var(--size-4-5);%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%200;%5Cn%20%20%20%20%20%20top:%200;%5Cn%20%20%20%20%20%20width:%20var(--size-4-5);%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-confirmation.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
26
26
|
export {
|
|
27
27
|
LIBRARY_STYLES,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Component that registers {@link CommandHandler}s with Obsidian and ties their removal to its lifecycle.
|
|
6
6
|
*/
|
|
7
|
+
import type { DisposableEx } from '../../disposable.mjs';
|
|
7
8
|
import type { ActiveFileProvider } from '../active-file-provider.mjs';
|
|
8
9
|
import type { CommandRegistrar } from '../command-registrar.mjs';
|
|
9
10
|
import type { MenuEventRegistrar } from '../menu-event-registrar.mjs';
|
|
@@ -19,8 +20,9 @@ interface CommandHandlerComponentConstructorParams {
|
|
|
19
20
|
* Registers {@link CommandHandler}s with Obsidian and manages their lifecycle.
|
|
20
21
|
*
|
|
21
22
|
* Call {@link registerCommandHandlers} to register a batch of handlers on demand (as many times as
|
|
22
|
-
* needed while the component is alive); dispose the returned {@link
|
|
23
|
-
* those handlers
|
|
23
|
+
* needed while the component is alive); dispose the returned {@link DisposableEx} to unregister exactly
|
|
24
|
+
* those handlers — including any menu events they registered — or let the component unload to remove every
|
|
25
|
+
* command still registered through it.
|
|
24
26
|
*/
|
|
25
27
|
export declare class CommandHandlerComponent extends ComponentEx {
|
|
26
28
|
/**
|
|
@@ -46,14 +48,15 @@ export declare class CommandHandlerComponent extends ComponentEx {
|
|
|
46
48
|
*/
|
|
47
49
|
constructor(params: CommandHandlerComponentConstructorParams);
|
|
48
50
|
/**
|
|
49
|
-
* Registers the given command handlers with Obsidian and provides each its runtime registration
|
|
50
|
-
* context. Each handler's command is added immediately; the returned {@link
|
|
51
|
-
* commands registered by this call
|
|
52
|
-
*
|
|
51
|
+
* Registers the given command handlers with Obsidian and provides each its own runtime registration
|
|
52
|
+
* context. Each handler's command is added immediately; the returned {@link DisposableEx} removes the
|
|
53
|
+
* commands registered by this call — and any menu events those handlers registered via their context's
|
|
54
|
+
* {@link MenuEventRegistrar} — when disposed. Any command still registered when the component unloads is
|
|
55
|
+
* removed automatically.
|
|
53
56
|
*
|
|
54
57
|
* @param commandHandlers - The command handlers to register.
|
|
55
|
-
* @returns A {@link
|
|
58
|
+
* @returns A {@link DisposableEx} that unregisters the handlers (commands + menu events) passed to this call.
|
|
56
59
|
*/
|
|
57
|
-
registerCommandHandlers(commandHandlers: CommandHandler[]):
|
|
60
|
+
registerCommandHandlers(commandHandlers: CommandHandler[]): DisposableEx;
|
|
58
61
|
}
|
|
59
62
|
export {};
|