@rusticarcade/palette 0.2.0 → 0.3.1

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.
@@ -0,0 +1,347 @@
1
+ // @bun
2
+ // src/test-util/global-env.ts
3
+ import { GlobalRegistrator } from "@happy-dom/global-registrator";
4
+ async function prepareGlobalTestDOM() {
5
+ await cleanupGlobalTestDOM();
6
+ GlobalRegistrator.register();
7
+ }
8
+ async function cleanupGlobalTestDOM() {
9
+ if (typeof document !== "undefined") {
10
+ while (document.firstChild) {
11
+ document.removeChild(document.firstChild);
12
+ }
13
+ }
14
+ await Bun.sleep(1);
15
+ if (GlobalRegistrator.isRegistered) {
16
+ GlobalRegistrator.unregister();
17
+ }
18
+ }
19
+ // src/errors.ts
20
+ function getDevError(code) {
21
+ const DEV_ERROR_INFO = {
22
+ [0 /* INVARIANT */]: `
23
+ INVARIANT
24
+ A condition has occurred which should never happen, such as a code path that
25
+ shouldn't be reachable when using correct types, or a disallowed state.
26
+ `,
27
+ [1 /* INVALID_ENV */]: `
28
+ INVALID_ENV
29
+ Failed to find a custom elements registry in this environment. Is a window
30
+ global available with a customElements property?
31
+ `,
32
+ [100 /* DUPE_TAGNAME */]: `
33
+ DUPE_TAGNAME
34
+ Failed to register a custom element with the tagname %s because another
35
+ custom element is already defined with that name.
36
+ `,
37
+ [101 /* INVALID_TAGNAME */]: `
38
+ INVALID_TAGNAME
39
+ Failed to determine a valid HTML Tag to use when registering a component as a
40
+ custom element. Specify a static readonly tagName property on your component
41
+ class or provide a tagName argument to Component.register.
42
+
43
+ Alternatively, you can directly register your element as you would any other
44
+ HTML custom element: customElements.define("my-tag", MyComponentClass);
45
+ `,
46
+ [300 /* MISSING_ELEMENT */]: `
47
+ MISSING_ELEMENT
48
+ An element was expected to exist but was not found when the DOM was queried.
49
+ `,
50
+ [301 /* MISSING_STATE */]: `
51
+ MISSING_STATE
52
+ A Component's reactive state was accessed, but no initialState is defined for
53
+ the Component's class. Initial state must be defined as an object or function.
54
+ `,
55
+ [302 /* INVALID_CONTENT */]: `
56
+ INVALID_CONTENT
57
+ Tried to set a value as content in a template, but the value was not a supported
58
+ type. Values must be a string, HTMLElement.
59
+
60
+ Instead, got %s: %s.
61
+ `,
62
+ [200 /* TEMPLATE_INVALID */]: `
63
+ TEMPLATE_INVALID
64
+ The value %s cannot be interpolated via the Template html string helper.
65
+ Values may only be HTMLTemplateElements (template content is adopted) or
66
+ strings (shorthand for a ::swap directive on an element)
67
+ `,
68
+ [201 /* TEMPLATE_INVALID_NOTATION */]: `
69
+ TEMPLATE_INVALID_NOTATION
70
+ A template value notation failed to parse. Notations must begin with one of
71
+ @, $, *, or #, followed by a dot-separated path of accessor names. Optionally,
72
+ notations may have modifiers around them, such as the NOT() modifier.
73
+
74
+ The notation that failed to parse was "%s"
75
+ `,
76
+ [202 /* TEMPLATE_INVALID_COMPONENT */]: `
77
+ TEMPLATE_INVALID_COMPONENT
78
+ Failed to interpolate a Component in an html template string due to the
79
+ Component having an invalid tagName property.
80
+
81
+ Component "%s" has an invalid tagName property "%s"
82
+ `,
83
+ [205 /* TEMPLATE_MISSING_LIST_PARENT */]: `
84
+ TEMPLATE_MISSING_LIST_PARENT
85
+ A template failed to prepare an ::each directive because no valid parent node
86
+ was found for the list to render into.
87
+ `,
88
+ [203 /* TEMPLATE_INVALID_LIST */]: `
89
+ TEMPLATE_INVALID_LIST
90
+ A template failed to render because an ::each directive fetched a value which
91
+ was not an array of actionable data.
92
+ `,
93
+ [204 /* TEMPLATE_INVALID_NODE_REF */]: `
94
+ TEMPLATE_INVALID_NODE_REF
95
+ A template failed to prepare a node from a compiled source. Typically, this
96
+ means something is broken within the compiled template rather than an error with
97
+ the template content itself.
98
+ `,
99
+ [206 /* TEMPLATE_MISSING_LIST_KEY */]: `
100
+ TEMPLATE_MISSING_LIST_KEY
101
+ A template failed to compile because an ::each directive was found on an element
102
+ without a corresponding ::key directive. ::each directives must have a ::key
103
+ directive specified on the same element, whose notation evaluates to a unique
104
+ value for each item in the list.
105
+
106
+ Example: <li ::each="$items" ::key="#id"> ... </li>
107
+ `,
108
+ [207 /* TEMPLATE_DUPLICATE_LIST_KEY */]: `
109
+ TEMPLATE_DUPLICATE_LIST_KEY
110
+ A list failed to render because item key %s appeared multiple times when
111
+ resolving list item keys. Each ::key directive must reference a notation whose
112
+ value is unique for each list item.
113
+ `,
114
+ [303 /* INVALID_STATE_KEY */]: `
115
+ INVALID_STATE_KEY
116
+ Tried to access a state property which does not exist
117
+
118
+ Key path: %s
119
+ `,
120
+ [304 /* INVALID_STATE_UPDATE */]: `
121
+ INVALID_STATE_UPDATE
122
+ A Component's setState() was called with a value which could not be patched in
123
+ to the existing component state.
124
+
125
+ setState() takes a partial object describing state keys to update.
126
+
127
+ Instead, received: %s
128
+ `,
129
+ [305 /* STATE_LOCKED */]: `
130
+ STATE_LOCKED
131
+ A State received a request to update or lock while already locked.
132
+ States may be locked using the .lock() method and unlocked using the .unlock()
133
+ method. States lock during async mutations done through the .mutateAsync()
134
+ method if "true" is passed as the second parameter.
135
+
136
+ You can check the lock status of a State instance with .isLocked
137
+ `,
138
+ [306 /* MAX_SEQUENTIAL_RENDERS */]: `
139
+ MAX_SEQUENTIAL_RENDERS
140
+ A component has errored after re-rendering more than %s times in the same frame.
141
+
142
+ This typically happens because state or live attributes are being modified
143
+ during a render lifecycle method such as beforeUpdate() or afterUpdate(). If
144
+ state changes unconditionally during a render, the render will infinitely loop.
145
+ Updating render source data during a render cycle is supported, but infinite
146
+ update loops may occur if unchecked.
147
+ `
148
+ };
149
+ return DEV_ERROR_INFO[code];
150
+ }
151
+
152
+ class PaletteError extends Error {
153
+ name = "PaletteError";
154
+ code;
155
+ constructor(code, ...values) {
156
+ let message = `Code: ${code}`;
157
+ if (true) {
158
+ message += getDevError(code);
159
+ for (const val of values) {
160
+ message = message.replace(`%s`, String(val));
161
+ }
162
+ }
163
+ super(message);
164
+ this.code = code;
165
+ }
166
+ }
167
+
168
+ // src/util/attributes.ts
169
+ function serializeAttribute(value) {
170
+ if (typeof value === "string" || typeof value === "number") {
171
+ return `${value}`;
172
+ }
173
+ if (value === true) {
174
+ return "";
175
+ }
176
+ if (value === null || value === false || value === undefined) {
177
+ return null;
178
+ }
179
+ return value.toString();
180
+ }
181
+ function createAttributeMap(source) {
182
+ const map = new Map;
183
+ if (source instanceof HTMLElement) {
184
+ for (const name of source.getAttributeNames()) {
185
+ map.set(name, serializeAttribute(source.getAttribute(name)));
186
+ }
187
+ return map;
188
+ }
189
+ if (source instanceof Map) {
190
+ for (const [key, val] of source) {
191
+ map.set(key, serializeAttribute(val));
192
+ }
193
+ return map;
194
+ }
195
+ if (typeof source === "object" && source !== null) {
196
+ for (const [key, val] of Object.entries(source)) {
197
+ map.set(key, serializeAttribute(val));
198
+ }
199
+ return map;
200
+ }
201
+ throw new PaletteError(0 /* INVARIANT */);
202
+ }
203
+ function applyAttributeMap(target, attrs) {
204
+ const currentNames = new Set(target.getAttributeNames());
205
+ const incomingNames = new Set(attrs.keys());
206
+ const attributesToRemove = currentNames.difference(incomingNames);
207
+ for (const attr of attributesToRemove) {
208
+ target.removeAttribute(attr);
209
+ }
210
+ for (const [name, val] of attrs) {
211
+ if (val === null) {
212
+ target.removeAttribute(name);
213
+ } else {
214
+ target.setAttribute(name, val);
215
+ }
216
+ }
217
+ }
218
+ // src/util/lru-cache.ts
219
+ class LRUCache {
220
+ _maxSize;
221
+ _data;
222
+ _metrics = { hits: 0, misses: 0 };
223
+ constructor(maxSize = 500) {
224
+ if (maxSize <= 0) {
225
+ throw new Error("LRU Cache capacity must be >= 1");
226
+ }
227
+ if (true) {
228
+ this._metrics = { hits: 0, misses: 0 };
229
+ }
230
+ this._maxSize = maxSize;
231
+ this._data = new Map;
232
+ }
233
+ _trim = () => {
234
+ while (this._data.size > this._maxSize) {
235
+ const firstKey = this._data.keys().next().value;
236
+ if (firstKey === undefined) {
237
+ throw new Error("Absurd");
238
+ }
239
+ this._data.delete(firstKey);
240
+ }
241
+ };
242
+ get metrics() {
243
+ if (true) {
244
+ const { hits = 0, misses = 0 } = this._metrics ?? {};
245
+ const lookups = hits + misses;
246
+ const hitRate = lookups === 0 ? 0 : hits / lookups;
247
+ return {
248
+ lookups,
249
+ hits,
250
+ misses,
251
+ capacity: this._maxSize,
252
+ entries: this._data.size,
253
+ hitRate
254
+ };
255
+ }
256
+ return {
257
+ lookups: 0,
258
+ hits: 0,
259
+ misses: 0,
260
+ capacity: 0,
261
+ entries: 0,
262
+ hitRate: 0
263
+ };
264
+ }
265
+ setCapacity = (maxSize) => {
266
+ if (maxSize <= 0 && true) {
267
+ console.warn("[Palette LRU Cache] Cache size is <= 0. Cache is disabled.");
268
+ }
269
+ this._maxSize = maxSize;
270
+ this._trim();
271
+ };
272
+ get(key) {
273
+ const value = this._data.get(key);
274
+ if (value === undefined) {
275
+ if (true) {
276
+ this._metrics.misses += 1;
277
+ }
278
+ return;
279
+ }
280
+ this._data.delete(key);
281
+ this._data.set(key, value);
282
+ if (true) {
283
+ this._metrics.hits += 1;
284
+ }
285
+ return value;
286
+ }
287
+ set(key, value) {
288
+ if (this._data.has(key)) {
289
+ this._data.delete(key);
290
+ }
291
+ this._data.set(key, value);
292
+ if (this._data.size > this._maxSize) {
293
+ this._trim();
294
+ }
295
+ }
296
+ clear() {
297
+ this._data.clear();
298
+ }
299
+ get size() {
300
+ return this._data.size;
301
+ }
302
+ }
303
+ var lru_cache_default = LRUCache;
304
+
305
+ // src/util/fragments.ts
306
+ var fragmentCache = new lru_cache_default;
307
+ // src/test-util/tags.ts
308
+ var randomTagName = () => {
309
+ const id = crypto.randomUUID().replaceAll("-", "").slice(0, 10);
310
+ return `test-element-${id}`;
311
+ };
312
+
313
+ // src/test-util/render.ts
314
+ async function renderTestComponent(component, attributes2) {
315
+ if (typeof window === "undefined" || typeof window.customElements === "undefined") {
316
+ throw new Error("Failed to render test component: " + "window.customElements is not available in this environment.");
317
+ }
318
+ const useTagname = component.tagName === "" ? randomTagName() : component.tagName;
319
+ component.tagName = useTagname;
320
+ if (!customElements.get(useTagname)) {
321
+ customElements.define(useTagname, component);
322
+ }
323
+ const $component = document.createElement(component.tagName);
324
+ const attributeMap = createAttributeMap(attributes2 ?? {});
325
+ applyAttributeMap($component, attributeMap);
326
+ document.body.append($component);
327
+ await Bun.sleep(1);
328
+ return $component;
329
+ }
330
+ async function rerenderTestComponent(element) {
331
+ return new Promise((resolve) => {
332
+ element.requestRender(async () => {
333
+ await Bun.sleep(1);
334
+ resolve();
335
+ });
336
+ });
337
+ }
338
+ export {
339
+ rerenderTestComponent,
340
+ renderTestComponent,
341
+ randomTagName,
342
+ prepareGlobalTestDOM,
343
+ cleanupGlobalTestDOM
344
+ };
345
+
346
+ //# debugId=925A43921950535764756E2164756E21
347
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3QtdXRpbC9nbG9iYWwtZW52LnRzIiwgInNyYy9lcnJvcnMudHMiLCAic3JjL3V0aWwvYXR0cmlidXRlcy50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy90ZXN0LXV0aWwvdGFncy50cyIsICJzcmMvdGVzdC11dGlsL3JlbmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBHbG9iYWxSZWdpc3RyYXRvciB9IGZyb20gXCJAaGFwcHktZG9tL2dsb2JhbC1yZWdpc3RyYXRvclwiO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGdsb2JhbCB0ZXN0IERPTSBlbnZpcm9ubWVudCAodXNpbmcgSGFwcHlET00pXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlR2xvYmFsVGVzdERPTSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEdsb2JhbFRlc3RET00oKTtcbiAgR2xvYmFsUmVnaXN0cmF0b3IucmVnaXN0ZXIoKTtcbn1cblxuLyoqXG4gKiBDbGVhbnVwIHRoZSBnbG9iYWwgdGVzdCBET00gZW52aXJvbm1lbnQgKHVzaW5nIEhhcHB5RE9NKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEdsb2JhbFRlc3RET00oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aGlsZSAoZG9jdW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgQnVuLnNsZWVwKDEpO1xuXG4gIGlmIChHbG9iYWxSZWdpc3RyYXRvci5pc1JlZ2lzdGVyZWQpIHtcbiAgICBHbG9iYWxSZWdpc3RyYXRvci51bnJlZ2lzdGVyKCk7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG4vKipcbiAqIFBvc3NpYmxlIGVycm9yIHR5cGVzIGZvciB7QGxpbmsgUGFsZXR0ZUVycm9yfVxuICpcbiAqIENvZGVzIGFyZSBjYXRlZ29yaXplZCBpbnRvIGdyb3VwcyBieSB0aGUgMTAwJ3M6XG4gKlxuICogLSAwIC0gOTk6IEludmFyaWFudHNcbiAqIC0gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgLyBFbnZpcm9ubWVudCBFcnJvcnNcbiAqIC0gMjAwIC0gMjk5OiBUZW1wbGF0aW5nIEVycm9yc1xuICogLSAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIDAgLSA5OTogSW52YXJpYW50c1xuICBJTlZBUklBTlQgPSAwLFxuICBJTlZBTElEX0VOViA9IDEsXG5cbiAgLy8gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgRXJyb3JzXG4gIERVUEVfVEFHTkFNRSA9IDEwMCxcbiAgSU5WQUxJRF9UQUdOQU1FID0gMTAxLFxuXG4gIC8vIDIwMCAtIDI5OTogVGVtcGxhdGUgRXJyb3JzXG4gIFRFTVBMQVRFX0lOVkFMSUQgPSAyMDAsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04gPSAyMDEsXG4gIFRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UID0gMjAyLFxuICBURU1QTEFURV9JTlZBTElEX0xJU1QgPSAyMDMsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUYgPSAyMDQsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlQgPSAyMDUsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkgPSAyMDYsXG4gIFRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSA9IDIwNyxcblxuICAvLyAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gIE1JU1NJTkdfRUxFTUVOVCA9IDMwMCxcbiAgTUlTU0lOR19TVEFURSA9IDMwMSxcbiAgSU5WQUxJRF9DT05URU5UID0gMzAyLFxuICBJTlZBTElEX1NUQVRFX0tFWSA9IDMwMyxcbiAgSU5WQUxJRF9TVEFURV9VUERBVEUgPSAzMDQsXG4gIFNUQVRFX0xPQ0tFRCA9IDMwNSxcbiAgTUFYX1NFUVVFTlRJQUxfUkVOREVSUyA9IDMwNixcbn1cblxuZnVuY3Rpb24gZ2V0RGV2RXJyb3IoY29kZTogRXJyb3JDb2RlKSB7XG4gIGNvbnN0IERFVl9FUlJPUl9JTkZPOiBSZWNvcmQ8RXJyb3JDb2RlLCBzdHJpbmc+ID0ge1xuICAgIFtFcnJvckNvZGUuSU5WQVJJQU5UXTogYFxuSU5WQVJJQU5UXG5BIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiwgc3VjaCBhcyBhIGNvZGUgcGF0aCB0aGF0XG5zaG91bGRuJ3QgYmUgcmVhY2hhYmxlIHdoZW4gdXNpbmcgY29ycmVjdCB0eXBlcywgb3IgYSBkaXNhbGxvd2VkIHN0YXRlLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9FTlZdOiBgXG5JTlZBTElEX0VOVlxuRmFpbGVkIHRvIGZpbmQgYSBjdXN0b20gZWxlbWVudHMgcmVnaXN0cnkgaW4gdGhpcyBlbnZpcm9ubWVudC4gSXMgYSB3aW5kb3dcbmdsb2JhbCBhdmFpbGFibGUgd2l0aCBhIGN1c3RvbUVsZW1lbnRzIHByb3BlcnR5P1xuYCxcblxuICAgIFtFcnJvckNvZGUuRFVQRV9UQUdOQU1FXTogYFxuRFVQRV9UQUdOQU1FXG5GYWlsZWQgdG8gcmVnaXN0ZXIgYSBjdXN0b20gZWxlbWVudCB3aXRoIHRoZSB0YWduYW1lICVzIGJlY2F1c2UgYW5vdGhlclxuY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhhdCBuYW1lLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9UQUdOQU1FXTogYFxuSU5WQUxJRF9UQUdOQU1FXG5GYWlsZWQgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSFRNTCBUYWcgdG8gdXNlIHdoZW4gcmVnaXN0ZXJpbmcgYSBjb21wb25lbnQgYXMgYVxuY3VzdG9tIGVsZW1lbnQuIFNwZWNpZnkgYSBzdGF0aWMgcmVhZG9ubHkgdGFnTmFtZSBwcm9wZXJ0eSBvbiB5b3VyIGNvbXBvbmVudFxuY2xhc3Mgb3IgcHJvdmlkZSBhIHRhZ05hbWUgYXJndW1lbnQgdG8gQ29tcG9uZW50LnJlZ2lzdGVyLlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRpcmVjdGx5IHJlZ2lzdGVyIHlvdXIgZWxlbWVudCBhcyB5b3Ugd291bGQgYW55IG90aGVyXG5IVE1MIGN1c3RvbSBlbGVtZW50OiBjdXN0b21FbGVtZW50cy5kZWZpbmUoXCJteS10YWdcIiwgTXlDb21wb25lbnRDbGFzcyk7XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlRdOiBgXG5NSVNTSU5HX0VMRU1FTlRcbkFuIGVsZW1lbnQgd2FzIGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCB3YXMgbm90IGZvdW5kIHdoZW4gdGhlIERPTSB3YXMgcXVlcmllZC5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEVdOiBgXG5NSVNTSU5HX1NUQVRFXG5BIENvbXBvbmVudCdzIHJlYWN0aXZlIHN0YXRlIHdhcyBhY2Nlc3NlZCwgYnV0IG5vIGluaXRpYWxTdGF0ZSBpcyBkZWZpbmVkIGZvclxudGhlIENvbXBvbmVudCdzIGNsYXNzLiBJbml0aWFsIHN0YXRlIG11c3QgYmUgZGVmaW5lZCBhcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0NPTlRFTlRdOiBgXG5JTlZBTElEX0NPTlRFTlRcblRyaWVkIHRvIHNldCBhIHZhbHVlIGFzIGNvbnRlbnQgaW4gYSB0ZW1wbGF0ZSwgYnV0IHRoZSB2YWx1ZSB3YXMgbm90IGEgc3VwcG9ydGVkXG50eXBlLiBWYWx1ZXMgbXVzdCBiZSBhIHN0cmluZywgSFRNTEVsZW1lbnQuXG5cbkluc3RlYWQsIGdvdCAlczogJXMuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEXTogYFxuVEVNUExBVEVfSU5WQUxJRFxuVGhlIHZhbHVlICVzIGNhbm5vdCBiZSBpbnRlcnBvbGF0ZWQgdmlhIHRoZSBUZW1wbGF0ZSBodG1sIHN0cmluZyBoZWxwZXIuXG5WYWx1ZXMgbWF5IG9ubHkgYmUgSFRNTFRlbXBsYXRlRWxlbWVudHMgKHRlbXBsYXRlIGNvbnRlbnQgaXMgYWRvcHRlZCkgb3JcbnN0cmluZ3MgKHNob3J0aGFuZCBmb3IgYSA6OnN3YXAgZGlyZWN0aXZlIG9uIGFuIGVsZW1lbnQpXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTlxuQSB0ZW1wbGF0ZSB2YWx1ZSBub3RhdGlvbiBmYWlsZWQgdG8gcGFyc2UuIE5vdGF0aW9ucyBtdXN0IGJlZ2luIHdpdGggb25lIG9mXG5ALCAkLCAqLCBvciAjLCBmb2xsb3dlZCBieSBhIGRvdC1zZXBhcmF0ZWQgcGF0aCBvZiBhY2Nlc3NvciBuYW1lcy4gT3B0aW9uYWxseSxcbm5vdGF0aW9ucyBtYXkgaGF2ZSBtb2RpZmllcnMgYXJvdW5kIHRoZW0sIHN1Y2ggYXMgdGhlIE5PVCgpIG1vZGlmaWVyLlxuXG5UaGUgbm90YXRpb24gdGhhdCBmYWlsZWQgdG8gcGFyc2Ugd2FzIFwiJXNcIlxuYCxcbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UXTogYFxuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRcbkZhaWxlZCB0byBpbnRlcnBvbGF0ZSBhIENvbXBvbmVudCBpbiBhbiBodG1sIHRlbXBsYXRlIHN0cmluZyBkdWUgdG8gdGhlXG5Db21wb25lbnQgaGF2aW5nIGFuIGludmFsaWQgdGFnTmFtZSBwcm9wZXJ0eS5cblxuQ29tcG9uZW50IFwiJXNcIiBoYXMgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5IFwiJXNcIlxuICAgIGAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRdOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfUEFSRU5UXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBwcmVwYXJlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgYmVjYXVzZSBubyB2YWxpZCBwYXJlbnQgbm9kZVxud2FzIGZvdW5kIGZvciB0aGUgbGlzdCB0byByZW5kZXIgaW50by5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTElTVF06IGBcblRFTVBMQVRFX0lOVkFMSURfTElTVFxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcmVuZGVyIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSBmZXRjaGVkIGEgdmFsdWUgd2hpY2hcbndhcyBub3QgYW4gYXJyYXkgb2YgYWN0aW9uYWJsZSBkYXRhLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRl06IGBcblRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUZcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYSBub2RlIGZyb20gYSBjb21waWxlZCBzb3VyY2UuIFR5cGljYWxseSwgdGhpc1xubWVhbnMgc29tZXRoaW5nIGlzIGJyb2tlbiB3aXRoaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHJhdGhlciB0aGFuIGFuIGVycm9yIHdpdGhcbnRoZSB0ZW1wbGF0ZSBjb250ZW50IGl0c2VsZi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVldOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSB3YXMgZm91bmQgb24gYW4gZWxlbWVudFxud2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgOjprZXkgZGlyZWN0aXZlLiA6OmVhY2ggZGlyZWN0aXZlcyBtdXN0IGhhdmUgYSA6OmtleVxuZGlyZWN0aXZlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBlbGVtZW50LCB3aG9zZSBub3RhdGlvbiBldmFsdWF0ZXMgdG8gYSB1bmlxdWVcbnZhbHVlIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbkV4YW1wbGU6IDxsaSA6OmVhY2g9XCIkaXRlbXNcIiA6OmtleT1cIiNpZFwiPiAuLi4gPC9saT5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWV06IGBcblRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWVxuQSBsaXN0IGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBpdGVtIGtleSAlcyBhcHBlYXJlZCBtdWx0aXBsZSB0aW1lcyB3aGVuXG5yZXNvbHZpbmcgbGlzdCBpdGVtIGtleXMuIEVhY2ggOjprZXkgZGlyZWN0aXZlIG11c3QgcmVmZXJlbmNlIGEgbm90YXRpb24gd2hvc2VcbnZhbHVlIGlzIHVuaXF1ZSBmb3IgZWFjaCBsaXN0IGl0ZW0uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWV06IGBcbklOVkFMSURfU1RBVEVfS0VZXG5UcmllZCB0byBhY2Nlc3MgYSBzdGF0ZSBwcm9wZXJ0eSB3aGljaCBkb2VzIG5vdCBleGlzdFxuXG5LZXkgcGF0aDogJXNcbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFXTogYFxuSU5WQUxJRF9TVEFURV9VUERBVEVcbkEgQ29tcG9uZW50J3Mgc2V0U3RhdGUoKSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB3aGljaCBjb3VsZCBub3QgYmUgcGF0Y2hlZCBpblxudG8gdGhlIGV4aXN0aW5nIGNvbXBvbmVudCBzdGF0ZS5cblxuc2V0U3RhdGUoKSB0YWtlcyBhIHBhcnRpYWwgb2JqZWN0IGRlc2NyaWJpbmcgc3RhdGUga2V5cyB0byB1cGRhdGUuXG5cbkluc3RlYWQsIHJlY2VpdmVkOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuU1RBVEVfTE9DS0VEXTogYFxuU1RBVEVfTE9DS0VEXG5BIFN0YXRlIHJlY2VpdmVkIGEgcmVxdWVzdCB0byB1cGRhdGUgb3IgbG9jayB3aGlsZSBhbHJlYWR5IGxvY2tlZC5cblN0YXRlcyBtYXkgYmUgbG9ja2VkIHVzaW5nIHRoZSAubG9jaygpIG1ldGhvZCBhbmQgdW5sb2NrZWQgdXNpbmcgdGhlIC51bmxvY2soKVxubWV0aG9kLiBTdGF0ZXMgbG9jayBkdXJpbmcgYXN5bmMgbXV0YXRpb25zIGRvbmUgdGhyb3VnaCB0aGUgLm11dGF0ZUFzeW5jKClcbm1ldGhvZCBpZiBcInRydWVcIiBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG5cbllvdSBjYW4gY2hlY2sgdGhlIGxvY2sgc3RhdHVzIG9mIGEgU3RhdGUgaW5zdGFuY2Ugd2l0aCAuaXNMb2NrZWRcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlNdOiBgXG5NQVhfU0VRVUVOVElBTF9SRU5ERVJTXG5BIGNvbXBvbmVudCBoYXMgZXJyb3JlZCBhZnRlciByZS1yZW5kZXJpbmcgbW9yZSB0aGFuICVzIHRpbWVzIGluIHRoZSBzYW1lIGZyYW1lLlxuXG5UaGlzIHR5cGljYWxseSBoYXBwZW5zIGJlY2F1c2Ugc3RhdGUgb3IgbGl2ZSBhdHRyaWJ1dGVzIGFyZSBiZWluZyBtb2RpZmllZFxuZHVyaW5nIGEgcmVuZGVyIGxpZmVjeWNsZSBtZXRob2Qgc3VjaCBhcyBiZWZvcmVVcGRhdGUoKSBvciBhZnRlclVwZGF0ZSgpLiBJZlxuc3RhdGUgY2hhbmdlcyB1bmNvbmRpdGlvbmFsbHkgZHVyaW5nIGEgcmVuZGVyLCB0aGUgcmVuZGVyIHdpbGwgaW5maW5pdGVseSBsb29wLlxuVXBkYXRpbmcgcmVuZGVyIHNvdXJjZSBkYXRhIGR1cmluZyBhIHJlbmRlciBjeWNsZSBpcyBzdXBwb3J0ZWQsIGJ1dCBpbmZpbml0ZVxudXBkYXRlIGxvb3BzIG1heSBvY2N1ciBpZiB1bmNoZWNrZWQuXG5gLFxuICB9O1xuXG4gIHJldHVybiBERVZfRVJST1JfSU5GT1tjb2RlXTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvcmlnaW5hdGluZyBmcm9tIHdpdGhpbiBhIFBhbGV0dGUgc3Vic3lzdGVtLlxuICpcbiAqIEluIHRoZSBgZGV2ZWxvcG1lbnRgIGVudmlyb25tZW50LCB0aGUgZXJyb3Igd2lsbCBzdXJmYWNlIHdpdGggZXh0ZW5kZWQgaW5mb1xuICogYWJvdXQgdGhlIGVycm9yIGFuZCBhbnkgZGV0YWlscyB3aGljaCBtYXkgYmUgcmVsZXZhbnQgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAqXG4gKiBJbiB0aGUgYHByb2R1Y3Rpb25gIGVudmlyb25tZW50LCBhIG1pbmltYWwgZXJyb3Igb25seSBzdXJmYWNpbmcgdGhlIG51bWVyaWNcbiAqIGVycm9yIGNvZGUgaXMgdGhyb3duIGluc3RlYWQuXG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhbGV0dGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9IFwiUGFsZXR0ZUVycm9yXCI7XG4gIGNvZGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBudW1iZXIsIC4uLnZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWVzc2FnZSA9IGBDb2RlOiAke2NvZGV9YDtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgbWVzc2FnZSArPSBnZXREZXZFcnJvcihjb2RlKTtcblxuICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoYCVzYCwgU3RyaW5nKHZhbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbi8qKiBBbiBhdHRyaWJ1dGUgdmFsdWUgYXMgcmVhZCBmcm9tIGEgRE9NIGVsZW1lbnQgKi9cbnR5cGUgQXR0cmlidXRlVmFsdWUgPSBzdHJpbmcgfCBudWxsO1xuXG4vKiogQSBNYXAgb2Ygc3RyaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB7QGxpbmsgQXR0cmlidXRlVmFsdWV9ICovXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93bik6IEF0dHJpYnV0ZVZhbHVlIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcChcbiAgc291cmNlOiBvYmplY3QgfCBNYXA8c3RyaW5nLCB1bmtub3duPiB8IEhUTUxFbGVtZW50LFxuKTogQXR0cmlidXRlTWFwIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBtYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZShzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHNvdXJjZSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlTWFwKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogQXR0cmlidXRlTWFwLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnROYW1lcyA9IG5ldyBTZXQodGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpO1xuICBjb25zdCBpbmNvbWluZ05hbWVzID0gbmV3IFNldChhdHRycy5rZXlzKCkpO1xuICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBjdXJyZW50TmFtZXMuZGlmZmVyZW5jZShpbmNvbWluZ05hbWVzKTtcblxuICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cmlidXRlc1RvUmVtb3ZlKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbF0gb2YgYXR0cnMpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXQgbWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3Mge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBzOiAwLFxuICAgICAgaGl0czogMCxcbiAgICAgIG1pc3NlczogMCxcbiAgICAgIGNhcGFjaXR5OiAwLFxuICAgICAgZW50cmllczogMCxcbiAgICAgIGhpdFJhdGU6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmFuZG9tIHRhZyBuYW1lIGZvciB1c2UgaW4gYSB0ZXN0IGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHJhbmRvbVRhZ05hbWUgPSAoKSA9PiB7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKS5yZXBsYWNlQWxsKFwiLVwiLCBcIlwiKS5zbGljZSgwLCAxMCk7XG4gIHJldHVybiBgdGVzdC1lbGVtZW50LSR7aWR9YDtcbn07XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50IH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IGFwcGx5QXR0cmlidXRlTWFwLCBjcmVhdGVBdHRyaWJ1dGVNYXAgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IHJhbmRvbVRhZ05hbWUgfSBmcm9tIFwiLi90YWdzXCI7XG5cbi8qKlxuICogUmVuZGVyIGEgUGFsZXR0ZSBDb21wb25lbnQgY2xhc3MgYXMgYSB0ZXN0IGVsZW1lbnRcbiAqXG4gKiBJZiB0aGUgY2xhc3MgaXMgbm90IHlldCByZWdpc3RlcmVkLCBpdCBpcyBhdXRvLXJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogdGVzdChcImNvbXBvbmVudCBkb2VzIHNvbWV0aGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gKiAgIGxldCBzb21ldGhpbmdNb2NrID0gbW9jaygpO1xuICpcbiAqICAgY2xhc3MgTXlUZXN0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAqICAgICBzY3JpcHQoKSB7XG4gKiAgICAgICBzb21ldGhpbmdNb2NrKCk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBhd2FpdCByZW5kZXJUZXN0Q29tcG9uZW50KE15VGVzdENvbXBvbmVudCk7XG4gKiAgIGV4cGVjdChzb21ldGhpbmdNb2NrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCBjbGFzcyB0byByZWdpc3RlciBhbmQgY3JlYXRlXG4gKiBAcGFyYW0gYXR0cmlidXRlcyBBIHJlY29yZCBvZiBhdHRyaWJ1dGVzIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZWQgQ29tcG9uZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJUZXN0Q29tcG9uZW50PEUgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KFxuICBjb21wb25lbnQ6IEUsXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8SW5zdGFuY2VUeXBlPEU+PiB7XG4gIC8vIEVycm9yIGVhcmx5IGlmIG1pc2NvbmZpZ3VyZWRcbiAgaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICB0eXBlb2Ygd2luZG93LmN1c3RvbUVsZW1lbnRzID09PSBcInVuZGVmaW5lZFwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiRmFpbGVkIHRvIHJlbmRlciB0ZXN0IGNvbXBvbmVudDogXCIgK1xuICAgICAgICBcIndpbmRvdy5jdXN0b21FbGVtZW50cyBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVzZVRhZ25hbWUgPVxuICAgIGNvbXBvbmVudC50YWdOYW1lID09PSBcIlwiID8gcmFuZG9tVGFnTmFtZSgpIDogY29tcG9uZW50LnRhZ05hbWU7XG5cbiAgLy8gUmVhc3NpZ24gdGhlIHRhZ25hbWUgYmFjayB0byB0aGUgY29tcG9uZW50IHRvIGVuc3VyZSBpdCBpcyBzZXQgYmVmb3JlIHJlZ2lzdHJhdGlvblxuICBjb21wb25lbnQudGFnTmFtZSA9IHVzZVRhZ25hbWU7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBpZiBuZWVkIGJlXG4gIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KHVzZVRhZ25hbWUpKSB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICAgICAgdXNlVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyB1bmtub3duIGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcixcbiAgICApO1xuICB9XG5cbiAgLy8gQ29uc3RydWN0IGEgdGVzdCBpbnN0YW5jZVxuICBjb25zdCAkY29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjb21wb25lbnQudGFnTmFtZSk7XG5cbiAgLy8gQXBwbHkgYXR0cmlidXRlcyBiZWZvcmUgcmVuZGVyaW5nXG4gIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IGNyZWF0ZUF0dHJpYnV0ZU1hcChhdHRyaWJ1dGVzID8/IHt9KTtcbiAgYXBwbHlBdHRyaWJ1dGVNYXAoJGNvbXBvbmVudCwgYXR0cmlidXRlTWFwKTtcblxuICAvLyBSZW5kZXIgYW5kIGF3YWl0IHRvIGFsbG93IG1pY3JvdGFza3MgdG8gc2V0dGxlXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKCRjb21wb25lbnQpO1xuICBhd2FpdCBCdW4uc2xlZXAoMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBpbnN0YW5jZVxuICByZXR1cm4gJGNvbXBvbmVudCBhcyBJbnN0YW5jZVR5cGU8RT47XG59XG5cbi8qKlxuICogRm9yY2UgYSByZW5kZXIgb24gdGhlIHRhcmdldCBlbGVtZW50XG4gKlxuICogUmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBjb21wbGV0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcmVuZGVyVGVzdENvbXBvbmVudChlbGVtZW50OiBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgZWxlbWVudC5yZXF1ZXN0UmVuZGVyKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IEJ1bi5zbGVlcCgxKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztB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
package/package.json CHANGED
@@ -1,13 +1,38 @@
1
1
  {
2
2
  "name": "@rusticarcade/palette",
3
+ "version": "0.3.1",
3
4
  "description": "Native web development, but make it joyful",
4
- "version": "0.2.0",
5
- "type": "module",
5
+ "keywords": [
6
+ "palette",
7
+ "component",
8
+ "web components",
9
+ "template",
10
+ "state",
11
+ "ui",
12
+ "framework"
13
+ ],
14
+ "homepage": "https://palette.camp",
15
+ "bugs": {
16
+ "url": "https://git.astral.camp/rusticarcade/palette/issues",
17
+ "email": "palette@endeavorance.camp"
18
+ },
19
+ "license": "MPL-2.0",
20
+ "author": {
21
+ "name": "endeavorance",
22
+ "url": "https://endeavorance.camp",
23
+ "email": "hello@endeavorance.camp"
24
+ },
25
+ "funding": [
26
+ {
27
+ "type": "patreon",
28
+ "url": "https://patreon.com/endeavorance"
29
+ }
30
+ ],
6
31
  "files": [
7
32
  "dist/prod",
8
- "dist/dev"
33
+ "dist/dev",
34
+ "dist/test"
9
35
  ],
10
- "types": "./dist/prod/index.d.ts",
11
36
  "exports": {
12
37
  ".": {
13
38
  "import": {
@@ -17,14 +42,16 @@
17
42
  "default": "./dist/prod/index.js"
18
43
  }
19
44
  },
45
+ "./test": {
46
+ "import": {
47
+ "types": "./dist/test/index.d.ts",
48
+ "default": "./dist/test/index.js"
49
+ }
50
+ },
20
51
  "./package.json": "./package.json"
21
52
  },
22
- "license": "MPL-2.0",
23
- "author": {
24
- "name": "endeavorance",
25
- "url": "https://endeavorance.camp",
26
- "email": "hello@endeavorance.camp"
27
- },
53
+ "type": "module",
54
+ "types": "./dist/prod/index.d.ts",
28
55
  "repository": {
29
56
  "type": "git",
30
57
  "url": "https://git.astral.camp/rusticarcade/palette"