cubing 0.26.4 → 0.26.5

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.
Files changed (71) hide show
  1. package/dist/esm/alg/index.js +1 -1
  2. package/dist/esm/bluetooth/index.js +11 -7
  3. package/dist/esm/bluetooth/index.js.map +2 -2
  4. package/dist/esm/{chunk-NGC5FA64.js → chunk-7K6HJKEG.js} +4 -4
  5. package/dist/esm/{chunk-NGC5FA64.js.map → chunk-7K6HJKEG.js.map} +0 -0
  6. package/dist/esm/{chunk-ZNQAOJ4A.js → chunk-FCB447RN.js} +1 -2
  7. package/dist/esm/{chunk-ZNQAOJ4A.js.map → chunk-FCB447RN.js.map} +2 -2
  8. package/dist/esm/{chunk-2KNZ3W2X.js → chunk-GNKVWDWW.js} +7 -627
  9. package/dist/esm/chunk-GNKVWDWW.js.map +7 -0
  10. package/dist/esm/{chunk-IW4IMXS5.js → chunk-GOBAXDTU.js} +27 -316
  11. package/dist/esm/chunk-GOBAXDTU.js.map +7 -0
  12. package/dist/esm/{chunk-XENF236F.js → chunk-ITRA3DUQ.js} +2 -2
  13. package/dist/esm/{chunk-XENF236F.js.map → chunk-ITRA3DUQ.js.map} +0 -0
  14. package/dist/esm/{chunk-LETRSCIC.js → chunk-K62P6E3H.js} +4 -4
  15. package/dist/esm/{chunk-LETRSCIC.js.map → chunk-K62P6E3H.js.map} +0 -0
  16. package/dist/esm/{chunk-YRXW6WCD.js → chunk-LJBHUHEP.js} +2 -57
  17. package/dist/esm/{chunk-YRXW6WCD.js.map → chunk-LJBHUHEP.js.map} +3 -3
  18. package/dist/esm/{chunk-TKUB3UH6.js → chunk-NHCGS73I.js} +2 -2
  19. package/dist/esm/{chunk-TKUB3UH6.js.map → chunk-NHCGS73I.js.map} +0 -0
  20. package/dist/esm/{chunk-2Z7I5AC3.js → chunk-TB6NTLZY.js} +2 -2
  21. package/dist/esm/{chunk-2Z7I5AC3.js.map → chunk-TB6NTLZY.js.map} +0 -0
  22. package/dist/esm/chunk-VCOUFQGJ.js +240 -0
  23. package/dist/esm/chunk-VCOUFQGJ.js.map +7 -0
  24. package/dist/esm/chunk-VFDAQ42O.js +684 -0
  25. package/dist/esm/chunk-VFDAQ42O.js.map +7 -0
  26. package/dist/esm/kpuzzle/index.js +4 -6
  27. package/dist/esm/notation/index.js +2 -2
  28. package/dist/esm/protocol/index.js +4 -4
  29. package/dist/esm/puzzle-geometry/index.js +2 -2
  30. package/dist/esm/puzzles/index.js +4 -12
  31. package/dist/esm/scramble/index.js +2 -2
  32. package/dist/esm/search/index.js +6 -5
  33. package/dist/esm/{search-dynamic-sgs-side-events-DWRW3XUN.js → search-dynamic-sgs-side-events-KK62JAWA.js} +7 -6
  34. package/dist/esm/{search-dynamic-sgs-side-events-DWRW3XUN.js.map → search-dynamic-sgs-side-events-KK62JAWA.js.map} +1 -1
  35. package/dist/esm/{search-dynamic-sgs-unofficial-GM6G44QE.js → search-dynamic-sgs-unofficial-VLNIEUW3.js} +6 -5
  36. package/dist/esm/{search-dynamic-sgs-unofficial-GM6G44QE.js.map → search-dynamic-sgs-unofficial-VLNIEUW3.js.map} +1 -1
  37. package/dist/esm/{search-dynamic-solve-4x4x4-GH5TQ72U.js → search-dynamic-solve-4x4x4-S5JPXMNU.js} +6 -5
  38. package/dist/esm/{search-dynamic-solve-4x4x4-GH5TQ72U.js.map → search-dynamic-solve-4x4x4-S5JPXMNU.js.map} +1 -1
  39. package/dist/esm/{search-dynamic-solve-kilominx-7Y4UNPAG.js → search-dynamic-solve-kilominx-UEFJENHO.js} +2 -2
  40. package/dist/esm/{search-dynamic-solve-kilominx-7Y4UNPAG.js.map → search-dynamic-solve-kilominx-UEFJENHO.js.map} +0 -0
  41. package/dist/esm/{search-worker-inside-generated-string-F45TUE2M.js → search-worker-inside-generated-string-AVMDARJP.js} +26 -26
  42. package/dist/esm/search-worker-inside-generated-string-AVMDARJP.js.map +7 -0
  43. package/dist/esm/{search-worker-js-entry-HKWTUNTT.js → search-worker-js-entry-KJRZ3CJQ.js} +12 -11
  44. package/dist/esm/{search-worker-js-entry-HKWTUNTT.js.map → search-worker-js-entry-KJRZ3CJQ.js.map} +1 -1
  45. package/dist/esm/{search-worker-ts-entry-BQGURH6Z.js → search-worker-ts-entry-AFMPRPSV.js} +2 -2
  46. package/dist/esm/{search-worker-ts-entry-BQGURH6Z.js.map → search-worker-ts-entry-AFMPRPSV.js.map} +0 -0
  47. package/dist/esm/stream/index.js +1 -1
  48. package/dist/esm/twisty/index.js +46 -25
  49. package/dist/esm/twisty/index.js.map +3 -3
  50. package/dist/esm/{twisty-dynamic-3d-D5A3LR3B.js → twisty-dynamic-3d-AVZOMIIW.js} +9 -7
  51. package/dist/esm/twisty-dynamic-3d-AVZOMIIW.js.map +7 -0
  52. package/dist/types/{KPuzzleDefinition-a1b2c545.d.ts → KState-84892e94.d.ts} +72 -2
  53. package/dist/types/{PuzzleLoader-77346930.d.ts → TwizzleLink-24ea1412.d.ts} +39 -143
  54. package/dist/types/alg/index.d.ts +1 -1
  55. package/dist/types/bluetooth/index.d.ts +3 -4
  56. package/dist/types/{bluetooth-puzzle-0d818529.d.ts → bluetooth-puzzle-0f2e5f07.d.ts} +1 -1
  57. package/dist/types/kpuzzle/index.d.ts +1 -7
  58. package/dist/types/{outside-9857fc7e.d.ts → outside-d0ced6cc.d.ts} +1 -1
  59. package/dist/types/protocol/index.d.ts +2 -5
  60. package/dist/types/puzzle-geometry/index.d.ts +2 -2
  61. package/dist/types/puzzles/index.d.ts +5 -15
  62. package/dist/types/scramble/index.d.ts +2 -3
  63. package/dist/types/search/index.d.ts +2 -3
  64. package/dist/types/stream/index.d.ts +2 -3
  65. package/dist/types/twisty/index.d.ts +4 -5
  66. package/package.json +1 -1
  67. package/dist/esm/chunk-2KNZ3W2X.js.map +0 -7
  68. package/dist/esm/chunk-IW4IMXS5.js.map +0 -7
  69. package/dist/esm/search-worker-inside-generated-string-F45TUE2M.js.map +0 -7
  70. package/dist/esm/twisty-dynamic-3d-D5A3LR3B.js.map +0 -7
  71. package/dist/types/KState-0ba4140d.d.ts +0 -70
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-YBDBUTYE.js";
4
4
  import {
5
5
  puzzles
6
- } from "./chunk-IW4IMXS5.js";
6
+ } from "./chunk-GOBAXDTU.js";
7
7
  import {
8
8
  KState
9
- } from "./chunk-2KNZ3W2X.js";
9
+ } from "./chunk-GNKVWDWW.js";
10
10
  import {
11
11
  randomChoiceFactory
12
12
  } from "./chunk-NYAPGKCW.js";
@@ -14,7 +14,7 @@ import {
14
14
  Alg,
15
15
  AlgBuilder,
16
16
  Move
17
- } from "./chunk-ZNQAOJ4A.js";
17
+ } from "./chunk-FCB447RN.js";
18
18
 
19
19
  // src/cubing/search/inside/inside-worker.ts
20
20
  var isInsideWorker = false;
@@ -504,4 +504,4 @@ export {
504
504
  random333OrientedScramble,
505
505
  random333FewestMovesScramble
506
506
  };
507
- //# sourceMappingURL=chunk-LETRSCIC.js.map
507
+ //# sourceMappingURL=chunk-K62P6E3H.js.map
@@ -300,59 +300,6 @@ var FreshListenerManager = class {
300
300
  };
301
301
  _disconnectionFunctions = new WeakMap();
302
302
 
303
- // src/cubing/twisty/model/props/puzzle/display/StickeringProp.ts
304
- var experimentalStickerings = {
305
- "full": true,
306
- "centers-only": true,
307
- "PLL": true,
308
- "CLS": true,
309
- "OLL": true,
310
- "COLL": true,
311
- "OCLL": true,
312
- "CLL": true,
313
- "ELL": true,
314
- "ELS": true,
315
- "LL": true,
316
- "F2L": true,
317
- "ZBLL": true,
318
- "ZBLS": true,
319
- "WVLS": true,
320
- "VLS": true,
321
- "LS": true,
322
- "EO": true,
323
- "EOline": true,
324
- "EOcross": true,
325
- "CMLL": true,
326
- "L10P": true,
327
- "L6E": true,
328
- "L6EO": true,
329
- "Daisy": true,
330
- "Cross": true,
331
- "2x2x2": true,
332
- "2x2x3": true,
333
- "Void Cube": true,
334
- "invisible": true,
335
- "picture": true,
336
- "experimental-centers-U": true,
337
- "experimental-centers-U-D": true,
338
- "experimental-centers-U-L-D": true,
339
- "experimental-centers-U-L-B-D": true,
340
- "experimental-centers": true,
341
- "experimental-fto-fc": true,
342
- "experimental-fto-f2t": true,
343
- "experimental-fto-sc": true,
344
- "experimental-fto-l2c": true,
345
- "experimental-fto-lbt": true,
346
- "experimental-fto-l3t": true,
347
- "experimental-global-custom-1": true,
348
- "experimental-global-custom-2": true
349
- };
350
- var StickeringProp = class extends SimpleTwistyPropSource {
351
- getDefaultValue() {
352
- return "full";
353
- }
354
- };
355
-
356
303
  // src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts
357
304
  var hintFaceletStyles = {
358
305
  floating: true,
@@ -371,7 +318,7 @@ var DEGREES_PER_RADIAN = 360 / TAU;
371
318
  // src/cubing/twisty/heavy-code-imports/3d.ts
372
319
  var cachedConstructorProxy = null;
373
320
  async function proxy3D() {
374
- return cachedConstructorProxy ?? (cachedConstructorProxy = import("./twisty-dynamic-3d-D5A3LR3B.js"));
321
+ return cachedConstructorProxy ?? (cachedConstructorProxy = import("./twisty-dynamic-3d-AVZOMIIW.js"));
375
322
  }
376
323
  var THREEJS = from(async () => (await proxy3D()).T3I);
377
324
 
@@ -384,11 +331,9 @@ export {
384
331
  FreshListenerManager,
385
332
  hintFaceletStyles,
386
333
  HintFaceletProp,
387
- experimentalStickerings,
388
- StickeringProp,
389
334
  TAU,
390
335
  DEGREES_PER_RADIAN,
391
336
  proxy3D,
392
337
  THREEJS
393
338
  };
394
- //# sourceMappingURL=chunk-YRXW6WCD.js.map
339
+ //# sourceMappingURL=chunk-LJBHUHEP.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/cubing/twisty/model/PromiseFreshener.ts", "../../src/cubing/twisty/model/props/TwistyProp.ts", "../../src/cubing/twisty/model/props/puzzle/display/StickeringProp.ts", "../../src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts", "../../src/cubing/twisty/views/3D/TAU.ts", "../../src/cubing/twisty/heavy-code-imports/3d.ts"],
4
- "sourcesContent": ["// TODO: Pick a much better name.\nexport class PromiseFreshener<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n // TODO: reject instead? Drop?\n async queue(\n p: Promise<T>,\n ): Promise<{ fresh: false } | { fresh: true; result: T }> {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n return {\n fresh: true,\n result: result,\n };\n } else {\n return { fresh: false };\n }\n }\n}\n\n// This will silenty drop a queued Promise (i.e. not resolve it) if a\n// newer queued one already resolved first. This is useful for classes that want\n// to know the \"latest\" state of something without jumping back to an older\n// value by accident.\n// TODO: Remove this because it's too easy to misuse?\nexport class StaleDropper<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n queue(p: Promise<T>): Promise<T> {\n // This is a very rare case where we *do* want to drop a Promise sometimes.\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n resolve(result);\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n", "import { from } from \"../../../vendor/p-lazy/p-lazy\";\nimport { StaleDropper } from \"../PromiseFreshener\";\nimport type { UserVisibleErrorTracker } from \"../UserVisibleErrorTracker\";\n\n/*eslint @typescript-eslint/ban-types:off */\ntype InputRecord = {};\n\nexport type InputProps<T extends InputRecord> = {\n [s in keyof T]: TwistyPropParent<T[s]>;\n};\n\ntype InputPromises<T extends InputRecord> = {\n [s in keyof T]: Promise<T[s]>;\n};\n\ninterface SourceEventDetail<OutputType> {\n sourceProp: TwistyPropSource<OutputType, any>;\n value: Promise<OutputType>; // TODO: remove?\n generation: number;\n}\n\ntype SourceEvent<T> = CustomEvent<SourceEventDetail<T>>;\n\ntype PromiseOrValue<T> = T | Promise<T>;\n\n// Values of T must be immutable.\nlet globalSourceGeneration = 0; // This is incremented before being used, so 1 will be the first active value.\nexport abstract class TwistyPropParent<T> {\n public abstract get(): Promise<T>;\n\n // Don't overwrite this. Overwrite `canReuseValue` instead.\n canReuse(v1: T, v2: T): boolean {\n return v1 === v2 || this.canReuseValue(v1, v2);\n }\n\n // Overwrite with a cheap semantic comparison when possible.\n // Note that this is not called if `v1 === v2` (in which case the value is automatically reused).\n canReuseValue(_v1: T, _v2: T): boolean {\n return false;\n }\n\n debugGetChildren(): Array<TwistyPropDerived<any, any>> {\n return Array.from(this.#children.values());\n }\n\n // Propagation\n\n #children: Set<TwistyPropDerived<any, any>> = new Set();\n protected addChild(child: TwistyPropDerived<any, any>): void {\n this.#children.add(child);\n }\n\n protected removeChild(child: TwistyPropDerived<any, any>): void {\n this.#children.delete(child);\n }\n\n protected lastSourceGeneration: number = 0;\n // Synchronously marks all descendants as stale. This doesn't actually\n // literally mark as stale, but it updates the last source generation, which\n // is used to tell if a cahced result is stale.\n protected markStale(sourceEvent: SourceEvent<any>): void {\n if (sourceEvent.detail.generation !== globalSourceGeneration) {\n // The full stale propagation is synchronous, so there should not be a new one yet.\n throw new Error(\"A TwistyProp was marked stale too late!\");\n }\n if (this.lastSourceGeneration === sourceEvent.detail.generation) {\n // Already propagated.\n return;\n }\n this.lastSourceGeneration = sourceEvent.detail.generation;\n for (const child of this.#children) {\n child.markStale(sourceEvent);\n }\n // We schedule sending out events *after* the (synchronous) propagation has happened, in\n // case one of the listeners updates a source again.\n this.#scheduleRawDispatch();\n }\n\n #rawListeners: Set<() => void> = new Set();\n /** @deprecated */\n addRawListener(listener: () => void, options?: { initial: boolean }): void {\n this.#rawListeners.add(listener);\n if (options?.initial) {\n listener(); // TODO: wrap in a try?\n }\n }\n\n /** @deprecated */\n removeRawListener(listener: () => void): void {\n this.#rawListeners.delete(listener);\n }\n\n /** @deprecated */\n #scheduleRawDispatch(): void {\n if (!this.#rawDispatchPending) {\n this.#rawDispatchPending = true;\n setTimeout(() => this.#dispatchRawListeners(), 0);\n }\n }\n\n #rawDispatchPending: boolean = false;\n #dispatchRawListeners(): void {\n if (!this.#rawDispatchPending) {\n throw new Error(\"Invalid dispatch state!\");\n }\n for (const listener of this.#rawListeners) {\n listener(); // TODO: wrap in a try?\n }\n this.#rawDispatchPending = false;\n }\n\n #freshListeners: Map<(value: T) => void, () => void> = new Map();\n // TODO: Pick a better name.\n addFreshListener(listener: (value: T) => void): void {\n const staleDropper: StaleDropper<T> = new StaleDropper<T>();\n let lastResult: T | null = null;\n const callback = async () => {\n const result = await staleDropper.queue(this.get());\n if (lastResult !== null && this.canReuse(lastResult, result)) {\n return;\n }\n lastResult = result;\n listener(result);\n };\n this.#freshListeners.set(listener, callback);\n this.addRawListener(callback, { initial: true });\n }\n\n removeFreshListener(listener: (value: T) => void): void {\n this.removeRawListener(this.#freshListeners.get(listener)!); // TODO: throw a custom error?\n this.#freshListeners.delete(listener);\n }\n}\n\nexport abstract class TwistyPropSource<\n OutputType,\n InputType = OutputType,\n> extends TwistyPropParent<OutputType> {\n #value: Promise<OutputType>;\n\n public abstract getDefaultValue(): PromiseOrValue<OutputType>;\n\n constructor(initialValue?: PromiseOrValue<InputType>) {\n super();\n this.#value = from(() => this.getDefaultValue());\n if (initialValue) {\n this.#value = this.deriveFromPromiseOrValue(initialValue, this.#value);\n }\n }\n\n set(input: PromiseOrValue<InputType>): void {\n this.#value = this.deriveFromPromiseOrValue(input, this.#value);\n\n const sourceEventDetail: SourceEventDetail<OutputType> = {\n sourceProp: this,\n value: this.#value,\n generation: ++globalSourceGeneration,\n };\n this.markStale(\n new CustomEvent<SourceEventDetail<OutputType>>(\"stale\", {\n detail: sourceEventDetail,\n }),\n );\n }\n\n async get(): Promise<OutputType> {\n return this.#value;\n }\n\n async deriveFromPromiseOrValue(\n input: PromiseOrValue<InputType>,\n oldValuePromise: Promise<OutputType>,\n ): Promise<OutputType> {\n return this.derive(await input, oldValuePromise);\n }\n\n // TODO: add an indirect layer to cache the derivation?\n protected abstract derive(\n input: InputType,\n oldValuePromise: Promise<OutputType>,\n ): PromiseOrValue<OutputType>;\n}\n\nexport abstract class SimpleTwistyPropSource<\n SimpleType,\n> extends TwistyPropSource<SimpleType> {\n derive(input: SimpleType): PromiseOrValue<SimpleType> {\n return input;\n }\n}\n\n// TODO: Can we support `null` as a valid output value without loosening type\n// safety?\nexport const NO_VALUE = Symbol(\"no value\");\nexport type NoValueType = typeof NO_VALUE;\n\nexport abstract class TwistyPropDerived<\n InputTypes extends InputRecord,\n OutputType,\n> extends TwistyPropParent<OutputType> {\n // cachedInputs:\n #parents: InputProps<InputTypes>;\n\n constructor(\n parents: InputProps<InputTypes>,\n protected userVisibleErrorTracker?: UserVisibleErrorTracker,\n ) {\n super();\n this.#parents = parents;\n for (const parent of Object.values(parents)) {\n (\n parent as TwistyPropDerived<InputProps<InputTypes>, OutputType>\n ).addChild(this);\n }\n }\n\n #cachedLastSuccessfulCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n #cachedLatestGenerationCalculation: {\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n public async get(): Promise<OutputType> {\n const generation = this.lastSourceGeneration;\n\n if (this.#cachedLatestGenerationCalculation?.generation === generation) {\n return this.#cachedLatestGenerationCalculation.output;\n }\n\n const latestGenerationCalculation = {\n generation,\n output: this.#cacheDerive(\n this.#getParents(),\n generation,\n this.#cachedLastSuccessfulCalculation,\n ),\n };\n this.#cachedLatestGenerationCalculation = latestGenerationCalculation;\n\n this.userVisibleErrorTracker?.reset();\n return latestGenerationCalculation.output;\n }\n\n async #getParents(): Promise<InputTypes> {\n const inputValuePromises: InputPromises<InputRecord> = {} as any; // TODO\n for (const [key, parent] of Object.entries(this.#parents)) {\n (inputValuePromises as Record<string, Promise<unknown>>)[key] = (\n parent as TwistyPropParent<unknown>\n ).get();\n }\n\n const inputs: InputTypes = {} as any; // TODO\n for (const key in this.#parents) {\n inputs[key] = (await (\n inputValuePromises as Record<string, Promise<unknown>>\n )[key]) as any;\n }\n return inputs;\n }\n\n async #cacheDerive(\n inputsPromise: PromiseOrValue<InputTypes>,\n generation: number,\n cachedLatestGenerationCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null,\n ): Promise<OutputType> {\n const inputs = await inputsPromise;\n\n const cache = (output: OutputType): OutputType => {\n this.#cachedLastSuccessfulCalculation = {\n inputs,\n output: Promise.resolve(output),\n generation,\n };\n return output;\n };\n\n if (!cachedLatestGenerationCalculation) {\n return cache(await this.derive(inputs));\n }\n\n const cachedInputs = cachedLatestGenerationCalculation.inputs;\n for (const key in this.#parents) {\n const parent = this.#parents[key];\n if (!parent.canReuse(inputs[key], cachedInputs[key])) {\n return cache(await this.derive(inputs));\n }\n }\n\n return cachedLatestGenerationCalculation.output;\n }\n\n protected abstract derive(input: InputTypes): PromiseOrValue<OutputType>;\n}\n\nexport class FreshListenerManager {\n #disconnectionFunctions: (() => void)[] = [];\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n let disconnected = false;\n const wrappedListener = (value: T) => {\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n listener(value);\n };\n\n prop.addFreshListener(wrappedListener);\n\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(wrappedListener);\n disconnected = true;\n });\n }\n\n addMultiListener<U, V>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>],\n listener: (values: [U, V]) => void,\n ) {\n let disconnected = false;\n\n // We're going to get one initial call per prop. We'll ignore all but one.\n let initialIgnoresLeft = props.length - 1;\n const wrappedListener = async (_: any) => {\n if (initialIgnoresLeft > 0) {\n initialIgnoresLeft--;\n return;\n }\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n // We rely on `TwistyProp` caching to give us the full set of latest\n // values efficiently.\n const promises = (props as TwistyPropParent<any>[]).map((prop) =>\n prop.get(),\n );\n const values = await Promise.all(promises);\n listener(values as any); // TODO: fix up types\n };\n\n for (const prop of props) {\n prop.addFreshListener(wrappedListener);\n }\n\n this.#disconnectionFunctions.push(() => {\n for (const prop of props) {\n prop.removeFreshListener(wrappedListener);\n }\n disconnected = true;\n });\n }\n\n disconnect(): void {\n for (const disconnectionFunction of this.#disconnectionFunctions) {\n disconnectionFunction();\n }\n }\n}\n", "import { SimpleTwistyPropSource } from \"../../TwistyProp\";\n\n// TODO: turn these maps into lists?\n// TODO: alg.cubing.net parity\nexport const experimentalStickerings = {\n \"full\": true, // default\n \"centers-only\": true, // TODO\n \"PLL\": true,\n \"CLS\": true,\n \"OLL\": true,\n \"COLL\": true,\n \"OCLL\": true,\n \"CLL\": true,\n \"ELL\": true,\n \"ELS\": true,\n \"LL\": true,\n \"F2L\": true,\n \"ZBLL\": true,\n \"ZBLS\": true,\n \"WVLS\": true,\n \"VLS\": true,\n \"LS\": true,\n \"EO\": true,\n \"EOline\": true,\n \"EOcross\": true,\n \"CMLL\": true,\n \"L10P\": true,\n \"L6E\": true,\n \"L6EO\": true,\n \"Daisy\": true,\n \"Cross\": true,\n \"2x2x2\": true,\n \"2x2x3\": true,\n \"Void Cube\": true,\n \"invisible\": true,\n \"picture\": true,\n \"experimental-centers-U\": true,\n \"experimental-centers-U-D\": true,\n \"experimental-centers-U-L-D\": true,\n \"experimental-centers-U-L-B-D\": true,\n \"experimental-centers\": true,\n \"experimental-fto-fc\": true,\n \"experimental-fto-f2t\": true,\n \"experimental-fto-sc\": true,\n \"experimental-fto-l2c\": true,\n \"experimental-fto-lbt\": true,\n \"experimental-fto-l3t\": true,\n \"experimental-global-custom-1\": true,\n \"experimental-global-custom-2\": true,\n};\nexport type ExperimentalStickering = keyof typeof experimentalStickerings;\n\nexport class StickeringProp extends SimpleTwistyPropSource<ExperimentalStickering> {\n getDefaultValue(): ExperimentalStickering {\n return \"full\"; // TODO: auto\n }\n}\n", "import { SimpleTwistyPropSource } from \"../../TwistyProp\";\n\n// TODO: turn these maps into lists?\nexport const hintFaceletStyles = {\n floating: true, // default\n none: true,\n};\nexport type HintFaceletStyle = keyof typeof hintFaceletStyles;\nexport type HintFaceletStyleWithAuto = HintFaceletStyle | \"auto\";\n\nexport class HintFaceletProp extends SimpleTwistyPropSource<HintFaceletStyleWithAuto> {\n getDefaultValue(): HintFaceletStyleWithAuto {\n return \"auto\";\n }\n}\n", "export const TAU = Math.PI * 2;\nexport const DEGREES_PER_RADIAN = 360 / TAU;\n", "import { from } from \"../../vendor/p-lazy/p-lazy\";\n\n// TODO can we remove the cached proxy?\n\n// In theory we can, but we've run into situations where imports are not properly cached.\nlet cachedConstructorProxy: Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> | null = null;\n\nexport async function proxy3D(): Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> {\n return (cachedConstructorProxy ??= import(\n \"./dynamic-entries/twisty-dynamic-3d\"\n ));\n}\n\nexport const THREEJS: Promise<typeof import(\"three\")> = from(\n async () => (await proxy3D()).T3I,\n);\n"],
5
- "mappings": "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",
3
+ "sources": ["../../src/cubing/twisty/model/PromiseFreshener.ts", "../../src/cubing/twisty/model/props/TwistyProp.ts", "../../src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts", "../../src/cubing/twisty/views/3D/TAU.ts", "../../src/cubing/twisty/heavy-code-imports/3d.ts"],
4
+ "sourcesContent": ["// TODO: Pick a much better name.\nexport class PromiseFreshener<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n // TODO: reject instead? Drop?\n async queue(\n p: Promise<T>,\n ): Promise<{ fresh: false } | { fresh: true; result: T }> {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n return {\n fresh: true,\n result: result,\n };\n } else {\n return { fresh: false };\n }\n }\n}\n\n// This will silenty drop a queued Promise (i.e. not resolve it) if a\n// newer queued one already resolved first. This is useful for classes that want\n// to know the \"latest\" state of something without jumping back to an older\n// value by accident.\n// TODO: Remove this because it's too easy to misuse?\nexport class StaleDropper<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n queue(p: Promise<T>): Promise<T> {\n // This is a very rare case where we *do* want to drop a Promise sometimes.\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n resolve(result);\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n", "import { from } from \"../../../vendor/p-lazy/p-lazy\";\nimport { StaleDropper } from \"../PromiseFreshener\";\nimport type { UserVisibleErrorTracker } from \"../UserVisibleErrorTracker\";\n\n/*eslint @typescript-eslint/ban-types:off */\ntype InputRecord = {};\n\nexport type InputProps<T extends InputRecord> = {\n [s in keyof T]: TwistyPropParent<T[s]>;\n};\n\ntype InputPromises<T extends InputRecord> = {\n [s in keyof T]: Promise<T[s]>;\n};\n\ninterface SourceEventDetail<OutputType> {\n sourceProp: TwistyPropSource<OutputType, any>;\n value: Promise<OutputType>; // TODO: remove?\n generation: number;\n}\n\ntype SourceEvent<T> = CustomEvent<SourceEventDetail<T>>;\n\ntype PromiseOrValue<T> = T | Promise<T>;\n\n// Values of T must be immutable.\nlet globalSourceGeneration = 0; // This is incremented before being used, so 1 will be the first active value.\nexport abstract class TwistyPropParent<T> {\n public abstract get(): Promise<T>;\n\n // Don't overwrite this. Overwrite `canReuseValue` instead.\n canReuse(v1: T, v2: T): boolean {\n return v1 === v2 || this.canReuseValue(v1, v2);\n }\n\n // Overwrite with a cheap semantic comparison when possible.\n // Note that this is not called if `v1 === v2` (in which case the value is automatically reused).\n canReuseValue(_v1: T, _v2: T): boolean {\n return false;\n }\n\n debugGetChildren(): Array<TwistyPropDerived<any, any>> {\n return Array.from(this.#children.values());\n }\n\n // Propagation\n\n #children: Set<TwistyPropDerived<any, any>> = new Set();\n protected addChild(child: TwistyPropDerived<any, any>): void {\n this.#children.add(child);\n }\n\n protected removeChild(child: TwistyPropDerived<any, any>): void {\n this.#children.delete(child);\n }\n\n protected lastSourceGeneration: number = 0;\n // Synchronously marks all descendants as stale. This doesn't actually\n // literally mark as stale, but it updates the last source generation, which\n // is used to tell if a cahced result is stale.\n protected markStale(sourceEvent: SourceEvent<any>): void {\n if (sourceEvent.detail.generation !== globalSourceGeneration) {\n // The full stale propagation is synchronous, so there should not be a new one yet.\n throw new Error(\"A TwistyProp was marked stale too late!\");\n }\n if (this.lastSourceGeneration === sourceEvent.detail.generation) {\n // Already propagated.\n return;\n }\n this.lastSourceGeneration = sourceEvent.detail.generation;\n for (const child of this.#children) {\n child.markStale(sourceEvent);\n }\n // We schedule sending out events *after* the (synchronous) propagation has happened, in\n // case one of the listeners updates a source again.\n this.#scheduleRawDispatch();\n }\n\n #rawListeners: Set<() => void> = new Set();\n /** @deprecated */\n addRawListener(listener: () => void, options?: { initial: boolean }): void {\n this.#rawListeners.add(listener);\n if (options?.initial) {\n listener(); // TODO: wrap in a try?\n }\n }\n\n /** @deprecated */\n removeRawListener(listener: () => void): void {\n this.#rawListeners.delete(listener);\n }\n\n /** @deprecated */\n #scheduleRawDispatch(): void {\n if (!this.#rawDispatchPending) {\n this.#rawDispatchPending = true;\n setTimeout(() => this.#dispatchRawListeners(), 0);\n }\n }\n\n #rawDispatchPending: boolean = false;\n #dispatchRawListeners(): void {\n if (!this.#rawDispatchPending) {\n throw new Error(\"Invalid dispatch state!\");\n }\n for (const listener of this.#rawListeners) {\n listener(); // TODO: wrap in a try?\n }\n this.#rawDispatchPending = false;\n }\n\n #freshListeners: Map<(value: T) => void, () => void> = new Map();\n // TODO: Pick a better name.\n addFreshListener(listener: (value: T) => void): void {\n const staleDropper: StaleDropper<T> = new StaleDropper<T>();\n let lastResult: T | null = null;\n const callback = async () => {\n const result = await staleDropper.queue(this.get());\n if (lastResult !== null && this.canReuse(lastResult, result)) {\n return;\n }\n lastResult = result;\n listener(result);\n };\n this.#freshListeners.set(listener, callback);\n this.addRawListener(callback, { initial: true });\n }\n\n removeFreshListener(listener: (value: T) => void): void {\n this.removeRawListener(this.#freshListeners.get(listener)!); // TODO: throw a custom error?\n this.#freshListeners.delete(listener);\n }\n}\n\nexport abstract class TwistyPropSource<\n OutputType,\n InputType = OutputType,\n> extends TwistyPropParent<OutputType> {\n #value: Promise<OutputType>;\n\n public abstract getDefaultValue(): PromiseOrValue<OutputType>;\n\n constructor(initialValue?: PromiseOrValue<InputType>) {\n super();\n this.#value = from(() => this.getDefaultValue());\n if (initialValue) {\n this.#value = this.deriveFromPromiseOrValue(initialValue, this.#value);\n }\n }\n\n set(input: PromiseOrValue<InputType>): void {\n this.#value = this.deriveFromPromiseOrValue(input, this.#value);\n\n const sourceEventDetail: SourceEventDetail<OutputType> = {\n sourceProp: this,\n value: this.#value,\n generation: ++globalSourceGeneration,\n };\n this.markStale(\n new CustomEvent<SourceEventDetail<OutputType>>(\"stale\", {\n detail: sourceEventDetail,\n }),\n );\n }\n\n async get(): Promise<OutputType> {\n return this.#value;\n }\n\n async deriveFromPromiseOrValue(\n input: PromiseOrValue<InputType>,\n oldValuePromise: Promise<OutputType>,\n ): Promise<OutputType> {\n return this.derive(await input, oldValuePromise);\n }\n\n // TODO: add an indirect layer to cache the derivation?\n protected abstract derive(\n input: InputType,\n oldValuePromise: Promise<OutputType>,\n ): PromiseOrValue<OutputType>;\n}\n\nexport abstract class SimpleTwistyPropSource<\n SimpleType,\n> extends TwistyPropSource<SimpleType> {\n derive(input: SimpleType): PromiseOrValue<SimpleType> {\n return input;\n }\n}\n\n// TODO: Can we support `null` as a valid output value without loosening type\n// safety?\nexport const NO_VALUE = Symbol(\"no value\");\nexport type NoValueType = typeof NO_VALUE;\n\nexport abstract class TwistyPropDerived<\n InputTypes extends InputRecord,\n OutputType,\n> extends TwistyPropParent<OutputType> {\n // cachedInputs:\n #parents: InputProps<InputTypes>;\n\n constructor(\n parents: InputProps<InputTypes>,\n protected userVisibleErrorTracker?: UserVisibleErrorTracker,\n ) {\n super();\n this.#parents = parents;\n for (const parent of Object.values(parents)) {\n (\n parent as TwistyPropDerived<InputProps<InputTypes>, OutputType>\n ).addChild(this);\n }\n }\n\n #cachedLastSuccessfulCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n #cachedLatestGenerationCalculation: {\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n public async get(): Promise<OutputType> {\n const generation = this.lastSourceGeneration;\n\n if (this.#cachedLatestGenerationCalculation?.generation === generation) {\n return this.#cachedLatestGenerationCalculation.output;\n }\n\n const latestGenerationCalculation = {\n generation,\n output: this.#cacheDerive(\n this.#getParents(),\n generation,\n this.#cachedLastSuccessfulCalculation,\n ),\n };\n this.#cachedLatestGenerationCalculation = latestGenerationCalculation;\n\n this.userVisibleErrorTracker?.reset();\n return latestGenerationCalculation.output;\n }\n\n async #getParents(): Promise<InputTypes> {\n const inputValuePromises: InputPromises<InputRecord> = {} as any; // TODO\n for (const [key, parent] of Object.entries(this.#parents)) {\n (inputValuePromises as Record<string, Promise<unknown>>)[key] = (\n parent as TwistyPropParent<unknown>\n ).get();\n }\n\n const inputs: InputTypes = {} as any; // TODO\n for (const key in this.#parents) {\n inputs[key] = (await (\n inputValuePromises as Record<string, Promise<unknown>>\n )[key]) as any;\n }\n return inputs;\n }\n\n async #cacheDerive(\n inputsPromise: PromiseOrValue<InputTypes>,\n generation: number,\n cachedLatestGenerationCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null,\n ): Promise<OutputType> {\n const inputs = await inputsPromise;\n\n const cache = (output: OutputType): OutputType => {\n this.#cachedLastSuccessfulCalculation = {\n inputs,\n output: Promise.resolve(output),\n generation,\n };\n return output;\n };\n\n if (!cachedLatestGenerationCalculation) {\n return cache(await this.derive(inputs));\n }\n\n const cachedInputs = cachedLatestGenerationCalculation.inputs;\n for (const key in this.#parents) {\n const parent = this.#parents[key];\n if (!parent.canReuse(inputs[key], cachedInputs[key])) {\n return cache(await this.derive(inputs));\n }\n }\n\n return cachedLatestGenerationCalculation.output;\n }\n\n protected abstract derive(input: InputTypes): PromiseOrValue<OutputType>;\n}\n\nexport class FreshListenerManager {\n #disconnectionFunctions: (() => void)[] = [];\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n let disconnected = false;\n const wrappedListener = (value: T) => {\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n listener(value);\n };\n\n prop.addFreshListener(wrappedListener);\n\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(wrappedListener);\n disconnected = true;\n });\n }\n\n addMultiListener<U, V>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>],\n listener: (values: [U, V]) => void,\n ) {\n let disconnected = false;\n\n // We're going to get one initial call per prop. We'll ignore all but one.\n let initialIgnoresLeft = props.length - 1;\n const wrappedListener = async (_: any) => {\n if (initialIgnoresLeft > 0) {\n initialIgnoresLeft--;\n return;\n }\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n // We rely on `TwistyProp` caching to give us the full set of latest\n // values efficiently.\n const promises = (props as TwistyPropParent<any>[]).map((prop) =>\n prop.get(),\n );\n const values = await Promise.all(promises);\n listener(values as any); // TODO: fix up types\n };\n\n for (const prop of props) {\n prop.addFreshListener(wrappedListener);\n }\n\n this.#disconnectionFunctions.push(() => {\n for (const prop of props) {\n prop.removeFreshListener(wrappedListener);\n }\n disconnected = true;\n });\n }\n\n disconnect(): void {\n for (const disconnectionFunction of this.#disconnectionFunctions) {\n disconnectionFunction();\n }\n }\n}\n", "import { SimpleTwistyPropSource } from \"../../TwistyProp\";\n\n// TODO: turn these maps into lists?\nexport const hintFaceletStyles = {\n floating: true, // default\n none: true,\n};\nexport type HintFaceletStyle = keyof typeof hintFaceletStyles;\nexport type HintFaceletStyleWithAuto = HintFaceletStyle | \"auto\";\n\nexport class HintFaceletProp extends SimpleTwistyPropSource<HintFaceletStyleWithAuto> {\n getDefaultValue(): HintFaceletStyleWithAuto {\n return \"auto\";\n }\n}\n", "export const TAU = Math.PI * 2;\nexport const DEGREES_PER_RADIAN = 360 / TAU;\n", "import { from } from \"../../vendor/p-lazy/p-lazy\";\n\n// TODO can we remove the cached proxy?\n\n// In theory we can, but we've run into situations where imports are not properly cached.\nlet cachedConstructorProxy: Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> | null = null;\n\nexport async function proxy3D(): Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> {\n return (cachedConstructorProxy ??= import(\n \"./dynamic-entries/twisty-dynamic-3d\"\n ));\n}\n\nexport const THREEJS: Promise<typeof import(\"three\")> = from(\n async () => (await proxy3D()).T3I,\n);\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TraversalUp
3
- } from "./chunk-ZNQAOJ4A.js";
3
+ } from "./chunk-FCB447RN.js";
4
4
 
5
5
  // src/cubing/notation/CountMoves.ts
6
6
  var CountMoves = class extends TraversalUp {
@@ -101,4 +101,4 @@ export {
101
101
  countQuantumMoves,
102
102
  countAnimatedLeaves
103
103
  };
104
- //# sourceMappingURL=chunk-TKUB3UH6.js.map
104
+ //# sourceMappingURL=chunk-NHCGS73I.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Move,
3
3
  QuantumMove
4
- } from "./chunk-ZNQAOJ4A.js";
4
+ } from "./chunk-FCB447RN.js";
5
5
 
6
6
  // src/cubing/puzzle-geometry/FaceNameSwizzler.ts
7
7
  var FaceNameSwizzler = class {
@@ -4383,4 +4383,4 @@ export {
4383
4383
  PuzzleGeometry,
4384
4384
  PGNotation
4385
4385
  };
4386
- //# sourceMappingURL=chunk-2Z7I5AC3.js.map
4386
+ //# sourceMappingURL=chunk-TB6NTLZY.js.map
@@ -0,0 +1,240 @@
1
+ import {
2
+ experimental3x3x3KPuzzle,
3
+ normalize3x3x3Orientation,
4
+ puzzleOrientation3x3x3Cache,
5
+ puzzleOrientation3x3x3Idx
6
+ } from "./chunk-VFDAQ42O.js";
7
+ import {
8
+ KState
9
+ } from "./chunk-GNKVWDWW.js";
10
+
11
+ // src/cubing/protocol/binary/orbit-indexing.ts
12
+ function identityPermutation(numElems) {
13
+ const arr = new Array(numElems);
14
+ for (let i = 0; i < numElems; i++) {
15
+ arr[i] = i;
16
+ }
17
+ return arr;
18
+ }
19
+ function orientationsToMask(radix, orientations) {
20
+ let val = 0;
21
+ for (const orientation of orientations) {
22
+ val *= radix;
23
+ val += orientation;
24
+ }
25
+ return val;
26
+ }
27
+ function maskToOrientations(radix, numElems, mask) {
28
+ const arr = [];
29
+ while (mask > 0) {
30
+ arr.push(mask % radix);
31
+ mask = Math.floor(mask / radix);
32
+ }
33
+ return new Array(numElems - arr.length).fill(0).concat(arr.reverse());
34
+ }
35
+ function permutationToLex(permutation) {
36
+ const n = permutation.length;
37
+ let lexicographicIdx = 0;
38
+ for (let i = 0; i < n - 1; i++) {
39
+ lexicographicIdx = lexicographicIdx * (n - i);
40
+ for (let j = i + 1; j < n; j++) {
41
+ if (permutation[i] > permutation[j]) {
42
+ lexicographicIdx += 1;
43
+ }
44
+ }
45
+ }
46
+ return lexicographicIdx;
47
+ }
48
+ function lexToPermutation(numPieces, lexicographicIdx) {
49
+ const permutation = new Array(numPieces);
50
+ permutation[numPieces - 1] = 0;
51
+ for (let i = numPieces - 2; i >= 0; i--) {
52
+ permutation[i] = lexicographicIdx % (numPieces - i);
53
+ lexicographicIdx = Math.floor(lexicographicIdx / (numPieces - i));
54
+ for (let j = i + 1; j < numPieces; j++) {
55
+ if (permutation[j] >= permutation[i]) {
56
+ permutation[j] = permutation[j] + 1;
57
+ }
58
+ }
59
+ }
60
+ return permutation;
61
+ }
62
+
63
+ // src/cubing/protocol/binary/binary3x3x3.ts
64
+ function reorientPuzzle(state, idxU, idxL) {
65
+ return state.applyTransformation(puzzleOrientation3x3x3Cache()[idxU][idxL].invert());
66
+ }
67
+ var BIT_LENGTHS = [29, 12, 16, 13, 3, 2, 1, 12];
68
+ function arraySum(arr) {
69
+ let total = 0;
70
+ for (const entry of arr) {
71
+ total += entry;
72
+ }
73
+ return total;
74
+ }
75
+ function splitBinary(bitLengths, buffy) {
76
+ const u8buffy = new Uint8Array(buffy);
77
+ let at = 0;
78
+ let bits = 0;
79
+ let accum = 0;
80
+ const values = [];
81
+ for (const bitLength of bitLengths) {
82
+ while (bits < bitLength) {
83
+ accum = accum << 8 | u8buffy[at++];
84
+ bits += 8;
85
+ }
86
+ values.push(accum >> bits - bitLength & (1 << bitLength) - 1);
87
+ bits -= bitLength;
88
+ }
89
+ return values;
90
+ }
91
+ function concatBinary(bitLengths, values) {
92
+ const buffy = new Uint8Array(Math.ceil(arraySum(bitLengths) / 8));
93
+ let at = 0;
94
+ let bits = 0;
95
+ let accum = 0;
96
+ for (let i = 0; i < bitLengths.length; i++) {
97
+ accum = accum << bitLengths[i] | values[i];
98
+ bits += bitLengths[i];
99
+ while (bits >= 8) {
100
+ buffy[at++] = accum >> bits - 8;
101
+ bits -= 8;
102
+ }
103
+ }
104
+ if (bits > 0) {
105
+ buffy[at++] = accum << 8 - bits;
106
+ }
107
+ return buffy;
108
+ }
109
+ function supportsPuzzleOrientation(components) {
110
+ return components.poIdxU !== 7;
111
+ }
112
+ function reid3x3x3ToBinaryComponents(state) {
113
+ const normedState = normalize3x3x3Orientation(state);
114
+ const epLex = permutationToLex(normedState.stateData["EDGES"].pieces);
115
+ const eoMask = orientationsToMask(2, normedState.stateData["EDGES"].orientation);
116
+ const cpLex = permutationToLex(normedState.stateData["CORNERS"].pieces);
117
+ const coMask = orientationsToMask(3, normedState.stateData["CORNERS"].orientation);
118
+ const [poIdxU, poIdxL] = puzzleOrientation3x3x3Idx(state);
119
+ const moSupport = 1;
120
+ const moMask = orientationsToMask(4, normedState.stateData["CENTERS"].orientation);
121
+ return {
122
+ epLex,
123
+ eoMask,
124
+ cpLex,
125
+ coMask,
126
+ poIdxU,
127
+ poIdxL,
128
+ moSupport,
129
+ moMask
130
+ };
131
+ }
132
+ function binaryComponentsToTwizzleBinary(components) {
133
+ const { epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask } = components;
134
+ return concatBinary(BIT_LENGTHS, [
135
+ epLex,
136
+ eoMask,
137
+ cpLex,
138
+ coMask,
139
+ poIdxU,
140
+ poIdxL,
141
+ moSupport,
142
+ moMask
143
+ ]);
144
+ }
145
+ function reid3x3x3ToTwizzleBinary(state) {
146
+ const components = reid3x3x3ToBinaryComponents(state);
147
+ return binaryComponentsToTwizzleBinary(components);
148
+ }
149
+ function twizzleBinaryToBinaryComponents(buffer) {
150
+ const [epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask] = splitBinary(BIT_LENGTHS, buffer);
151
+ return {
152
+ epLex,
153
+ eoMask,
154
+ cpLex,
155
+ coMask,
156
+ poIdxU,
157
+ poIdxL,
158
+ moSupport,
159
+ moMask
160
+ };
161
+ }
162
+ function binaryComponentsToReid3x3x3(components) {
163
+ if (components.moSupport !== 1) {
164
+ throw new Error("Must support center orientation.");
165
+ }
166
+ const normedState = new KState(experimental3x3x3KPuzzle, {
167
+ EDGES: {
168
+ pieces: lexToPermutation(12, components.epLex),
169
+ orientation: maskToOrientations(2, 12, components.eoMask)
170
+ },
171
+ CORNERS: {
172
+ pieces: lexToPermutation(8, components.cpLex),
173
+ orientation: maskToOrientations(3, 8, components.coMask)
174
+ },
175
+ CENTERS: {
176
+ pieces: identityPermutation(6),
177
+ orientation: maskToOrientations(4, 6, components.moMask)
178
+ }
179
+ });
180
+ if (!supportsPuzzleOrientation(components)) {
181
+ return normedState;
182
+ }
183
+ return reorientPuzzle(normedState, components.poIdxU, components.poIdxL);
184
+ }
185
+ function validateComponents(components) {
186
+ const errors = [];
187
+ if (components.epLex < 0 || components.epLex >= 479001600) {
188
+ errors.push(`epLex (${components.epLex}) out of range`);
189
+ }
190
+ if (components.cpLex < 0 || components.cpLex >= 40320) {
191
+ errors.push(`cpLex (${components.cpLex}) out of range`);
192
+ }
193
+ if (components.coMask < 0 || components.coMask >= 6561) {
194
+ errors.push(`coMask (${components.coMask}) out of range`);
195
+ }
196
+ if (components.poIdxU < 0 || components.poIdxU >= 6) {
197
+ if (supportsPuzzleOrientation(components)) {
198
+ errors.push(`poIdxU (${components.poIdxU}) out of range`);
199
+ }
200
+ }
201
+ if (components.eoMask < 0 || components.eoMask >= 4096) {
202
+ errors.push(`eoMask (${components.eoMask}) out of range`);
203
+ }
204
+ if (components.moMask < 0 || components.moMask >= 4096) {
205
+ errors.push(`moMask (${components.moMask}) out of range`);
206
+ }
207
+ if (components.poIdxL < 0 || components.poIdxL >= 4) {
208
+ errors.push(`poIdxL (${components.poIdxL}) out of range`);
209
+ }
210
+ if (components.moSupport < 0 || components.moSupport >= 2) {
211
+ errors.push(`moSupport (${components.moSupport}) out of range`);
212
+ }
213
+ return errors;
214
+ }
215
+ function twizzleBinaryToReid3x3x3(buffy) {
216
+ const components = twizzleBinaryToBinaryComponents(buffy);
217
+ const errors = validateComponents(components);
218
+ if (errors.length !== 0) {
219
+ throw new Error(`Invalid binary state components: ${errors.join(", ")}`);
220
+ }
221
+ return binaryComponentsToReid3x3x3(components);
222
+ }
223
+
224
+ // src/cubing/protocol/binary/hex.ts
225
+ function bufferToSpacedHex(buffer) {
226
+ return Array.prototype.map.call(new Uint8Array(buffer), (x) => ("00" + x.toString(16)).slice(-2)).join(" ");
227
+ }
228
+ function spacedHexToBuffer(hex) {
229
+ return new Uint8Array(hex.split(" ").map((c) => parseInt(c, 16)));
230
+ }
231
+
232
+ export {
233
+ reid3x3x3ToTwizzleBinary,
234
+ twizzleBinaryToBinaryComponents,
235
+ binaryComponentsToReid3x3x3,
236
+ twizzleBinaryToReid3x3x3,
237
+ bufferToSpacedHex,
238
+ spacedHexToBuffer
239
+ };
240
+ //# sourceMappingURL=chunk-VCOUFQGJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cubing/protocol/binary/orbit-indexing.ts", "../../src/cubing/protocol/binary/binary3x3x3.ts", "../../src/cubing/protocol/binary/hex.ts"],
4
+ "sourcesContent": ["export function identityPermutation(numElems: number): number[] {\n const arr = new Array<number>(numElems);\n for (let i = 0; i < numElems; i++) {\n arr[i] = i;\n }\n return arr;\n}\n\n// Inclusive start, exclusive end (similar to `Array.prototype.slice`)\nexport function orientationsToMask(\n radix: number,\n orientations: number[],\n): number {\n let val = 0;\n for (const orientation of orientations) {\n val *= radix;\n val += orientation;\n }\n return val;\n}\n\n// Inclusive start, exclusive end (similar to `Array.prototype.slice`)\nexport function maskToOrientations(\n radix: number,\n numElems: number,\n mask: number,\n): number[] {\n const arr = [];\n while (mask > 0) {\n arr.push(mask % radix);\n mask = Math.floor(mask / radix);\n }\n return new Array<number>(numElems - arr.length).fill(0).concat(arr.reverse());\n}\n\n// From https://www.jaapsch.net/puzzles/compindx.htm#perm\nexport function permutationToLex(permutation: number[]): number {\n const n = permutation.length;\n let lexicographicIdx = 0;\n for (let i = 0; i < n - 1; i++) {\n lexicographicIdx = lexicographicIdx * (n - i);\n for (let j = i + 1; j < n; j++) {\n if (permutation[i] > permutation[j]) {\n lexicographicIdx += 1;\n }\n }\n }\n return lexicographicIdx;\n}\n\n// From https://www.jaapsch.net/puzzles/compindx.htm#perm\nexport function lexToPermutation(\n numPieces: number,\n lexicographicIdx: number,\n): number[] {\n const permutation: number[] = new Array(numPieces);\n permutation[numPieces - 1] = 0;\n for (let i = numPieces - 2; i >= 0; i--) {\n permutation[i] = lexicographicIdx % (numPieces - i);\n lexicographicIdx = Math.floor(lexicographicIdx / (numPieces - i));\n for (let j = i + 1; j < numPieces; j++) {\n if (permutation[j] >= permutation[i]) {\n permutation[j] = permutation[j] + 1;\n }\n }\n }\n return permutation;\n}\n", "import { KState } from \"../../kpuzzle\";\nimport {\n experimental3x3x3KPuzzle,\n experimentalNormalize3x3x3Orientation,\n experimentalPuzzleOrientation3x3x3Cache,\n experimentalPuzzleOrientation3x3x3Idx,\n} from \"../../puzzles/cubing-private\";\nimport {\n identityPermutation,\n lexToPermutation,\n maskToOrientations,\n orientationsToMask,\n permutationToLex,\n} from \"./orbit-indexing\";\n\n// TODO: combine with `orientPuzzle`?\nexport function reorientPuzzle(\n state: KState,\n idxU: number,\n idxL: number,\n): KState {\n return state.applyTransformation(\n experimentalPuzzleOrientation3x3x3Cache()[idxU][idxL].invert(),\n );\n}\n\ntype Binary3x3x3State = ArrayBuffer;\n\n// Bit lengths of the encoded components, in order.\nconst BIT_LENGTHS = [29, 12, 16, 13, 3, 2, 1, 12];\n\n// These fields are sorted by the order in which they appear in the binary format.\nexport interface Binary3x3x3Components {\n epLex: number; // 29 bits, edge permutation\n eoMask: number; // 12 bits, edge orientation\n cpLex: number; // 16 bits, corner permutation\n coMask: number; // 13 bits, corner orientation\n poIdxU: number; // 3 bits, puzzle orientation (U face)\n poIdxL: number; // 2 bits, puzzle orientation (L face)\n moSupport: number; // 1 bit, center orientation support\n moMask: number; // 12 bits, center orientation\n}\n\n// There are various clever ways to do this, but this is simple and efficient.\nfunction arraySum(arr: number[]): number {\n let total = 0;\n for (const entry of arr) {\n total += entry;\n }\n return total;\n}\n\n// Due to limitations in JS bit operations, this is unsafe if any of the bit lengths span across the contents of more than 4 bytes.\n// - Safe: [8, 32]\n// - Unsafe: [4, 32, 4]\n// - Unsafe: [40, 4]\nfunction splitBinary(bitLengths: number[], buffy: ArrayBuffer): number[] {\n const u8buffy = new Uint8Array(buffy);\n let at = 0;\n let bits = 0;\n let accum = 0;\n const values: number[] = [];\n for (const bitLength of bitLengths) {\n while (bits < bitLength) {\n accum = (accum << 8) | u8buffy[at++];\n bits += 8;\n }\n values.push((accum >> (bits - bitLength)) & ((1 << bitLength) - 1));\n bits -= bitLength;\n }\n return values;\n}\n\n// See above for safety notes.\nfunction concatBinary(bitLengths: number[], values: number[]): ArrayBuffer {\n const buffy = new Uint8Array(Math.ceil(arraySum(bitLengths) / 8));\n let at = 0;\n let bits = 0;\n let accum = 0;\n for (let i = 0; i < bitLengths.length; i++) {\n accum = (accum << bitLengths[i]) | values[i];\n bits += bitLengths[i];\n while (bits >= 8) {\n buffy[at++] = accum >> (bits - 8);\n bits -= 8;\n }\n }\n if (bits > 0) {\n buffy[at++] = accum << (8 - bits);\n }\n return buffy;\n}\n\n// 0x111 (for idxU) means \"not supported\"\nfunction supportsPuzzleOrientation(components: Binary3x3x3Components): boolean {\n return components.poIdxU !== 7;\n}\n\nexport function reid3x3x3ToBinaryComponents(\n state: KState,\n): Binary3x3x3Components {\n const normedState = experimentalNormalize3x3x3Orientation(state);\n\n const epLex = permutationToLex(normedState.stateData[\"EDGES\"].pieces);\n const eoMask = orientationsToMask(\n 2,\n normedState.stateData[\"EDGES\"].orientation,\n );\n const cpLex = permutationToLex(normedState.stateData[\"CORNERS\"].pieces);\n const coMask = orientationsToMask(\n 3,\n normedState.stateData[\"CORNERS\"].orientation,\n );\n const [poIdxU, poIdxL] = experimentalPuzzleOrientation3x3x3Idx(state);\n const moSupport = 1; // Required for now.\n const moMask = orientationsToMask(\n 4,\n normedState.stateData[\"CENTERS\"].orientation,\n );\n\n return {\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n };\n}\n\nexport function binaryComponentsToTwizzleBinary(\n components: Binary3x3x3Components,\n): Binary3x3x3State {\n const { epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask } =\n components;\n\n return concatBinary(BIT_LENGTHS, [\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n ]);\n}\n\nexport function reid3x3x3ToTwizzleBinary(state: KState): Binary3x3x3State {\n const components: Binary3x3x3Components = reid3x3x3ToBinaryComponents(state);\n return binaryComponentsToTwizzleBinary(components);\n}\n\nexport function twizzleBinaryToBinaryComponents(\n buffer: ArrayBuffer,\n): Binary3x3x3Components {\n const [epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask] =\n splitBinary(BIT_LENGTHS, buffer);\n\n return {\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n };\n}\n\nexport function binaryComponentsToReid3x3x3(\n components: Binary3x3x3Components,\n): KState {\n if (components.moSupport !== 1) {\n throw new Error(\"Must support center orientation.\");\n }\n\n const normedState = new KState(experimental3x3x3KPuzzle, {\n EDGES: {\n pieces: lexToPermutation(12, components.epLex),\n orientation: maskToOrientations(2, 12, components.eoMask),\n },\n CORNERS: {\n pieces: lexToPermutation(8, components.cpLex),\n orientation: maskToOrientations(3, 8, components.coMask),\n },\n CENTERS: {\n pieces: identityPermutation(6),\n orientation: maskToOrientations(4, 6, components.moMask),\n },\n });\n\n if (!supportsPuzzleOrientation(components)) {\n return normedState;\n }\n\n return reorientPuzzle(normedState, components.poIdxU, components.poIdxL);\n}\n\n// Returns a list of error string.\n// An empty list means validation success.\nfunction validateComponents(components: Binary3x3x3Components): string[] {\n const errors = [];\n if (components.epLex < 0 || components.epLex >= 479001600) {\n errors.push(`epLex (${components.epLex}) out of range`);\n }\n if (components.cpLex < 0 || components.cpLex >= 40320) {\n errors.push(`cpLex (${components.cpLex}) out of range`);\n }\n if (components.coMask < 0 || components.coMask >= 6561) {\n errors.push(`coMask (${components.coMask}) out of range`);\n }\n if (components.poIdxU < 0 || components.poIdxU >= 6) {\n // 0x111 (for idxU) means \"not supported\"\n if (supportsPuzzleOrientation(components)) {\n errors.push(`poIdxU (${components.poIdxU}) out of range`);\n }\n }\n // The following cannot be (f decoded from binary properl) out of rangey.\n if (components.eoMask < 0 || components.eoMask >= 4096) {\n errors.push(`eoMask (${components.eoMask}) out of range`);\n }\n if (components.moMask < 0 || components.moMask >= 4096) {\n errors.push(`moMask (${components.moMask}) out of range`);\n }\n if (components.poIdxL < 0 || components.poIdxL >= 4) {\n errors.push(`poIdxL (${components.poIdxL}) out of range`);\n }\n if (components.moSupport < 0 || components.moSupport >= 2) {\n errors.push(`moSupport (${components.moSupport}) out of range`);\n }\n return errors;\n}\n\nexport function twizzleBinaryToReid3x3x3(buffy: ArrayBuffer): KState {\n const components = twizzleBinaryToBinaryComponents(buffy);\n const errors = validateComponents(components);\n if (errors.length !== 0) {\n throw new Error(`Invalid binary state components: ${errors.join(\", \")}`);\n }\n return binaryComponentsToReid3x3x3(components);\n}\n", "export function bufferToSpacedHex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n (\"00\" + x.toString(16)).slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nexport function spacedHexToBuffer(hex: string): Uint8Array {\n return new Uint8Array(hex.split(\" \").map((c) => parseInt(c, 16)));\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAAO,6BAA6B,UAA4B;AAC9D,QAAM,MAAM,IAAI,MAAc;AAC9B,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,QAAI,KAAK;AAAA;AAEX,SAAO;AAAA;AAIF,4BACL,OACA,cACQ;AACR,MAAI,MAAM;AACV,aAAW,eAAe,cAAc;AACtC,WAAO;AACP,WAAO;AAAA;AAET,SAAO;AAAA;AAIF,4BACL,OACA,UACA,MACU;AACV,QAAM,MAAM;AACZ,SAAO,OAAO,GAAG;AACf,QAAI,KAAK,OAAO;AAChB,WAAO,KAAK,MAAM,OAAO;AAAA;AAE3B,SAAO,IAAI,MAAc,WAAW,IAAI,QAAQ,KAAK,GAAG,OAAO,IAAI;AAAA;AAI9D,0BAA0B,aAA+B;AAC9D,QAAM,IAAI,YAAY;AACtB,MAAI,mBAAmB;AACvB,WAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,uBAAmB,mBAAoB,KAAI;AAC3C,aAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,UAAI,YAAY,KAAK,YAAY,IAAI;AACnC,4BAAoB;AAAA;AAAA;AAAA;AAI1B,SAAO;AAAA;AAIF,0BACL,WACA,kBACU;AACV,QAAM,cAAwB,IAAI,MAAM;AACxC,cAAY,YAAY,KAAK;AAC7B,WAAS,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK;AACvC,gBAAY,KAAK,mBAAoB,aAAY;AACjD,uBAAmB,KAAK,MAAM,mBAAoB,aAAY;AAC9D,aAAS,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;AACtC,UAAI,YAAY,MAAM,YAAY,IAAI;AACpC,oBAAY,KAAK,YAAY,KAAK;AAAA;AAAA;AAAA;AAIxC,SAAO;AAAA;;;AClDF,wBACL,OACA,MACA,MACQ;AACR,SAAO,MAAM,oBACX,8BAA0C,MAAM,MAAM;AAAA;AAO1D,IAAM,cAAc,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG;AAe9C,kBAAkB,KAAuB;AACvC,MAAI,QAAQ;AACZ,aAAW,SAAS,KAAK;AACvB,aAAS;AAAA;AAEX,SAAO;AAAA;AAOT,qBAAqB,YAAsB,OAA8B;AACvE,QAAM,UAAU,IAAI,WAAW;AAC/B,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,QAAM,SAAmB;AACzB,aAAW,aAAa,YAAY;AAClC,WAAO,OAAO,WAAW;AACvB,cAAS,SAAS,IAAK,QAAQ;AAC/B,cAAQ;AAAA;AAEV,WAAO,KAAM,SAAU,OAAO,YAAgB,MAAK,aAAa;AAChE,YAAQ;AAAA;AAEV,SAAO;AAAA;AAIT,sBAAsB,YAAsB,QAA+B;AACzE,QAAM,QAAQ,IAAI,WAAW,KAAK,KAAK,SAAS,cAAc;AAC9D,MAAI,KAAK;AACT,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAS,SAAS,WAAW,KAAM,OAAO;AAC1C,YAAQ,WAAW;AACnB,WAAO,QAAQ,GAAG;AAChB,YAAM,QAAQ,SAAU,OAAO;AAC/B,cAAQ;AAAA;AAAA;AAGZ,MAAI,OAAO,GAAG;AACZ,UAAM,QAAQ,SAAU,IAAI;AAAA;AAE9B,SAAO;AAAA;AAIT,mCAAmC,YAA4C;AAC7E,SAAO,WAAW,WAAW;AAAA;AAGxB,qCACL,OACuB;AACvB,QAAM,cAAc,0BAAsC;AAE1D,QAAM,QAAQ,iBAAiB,YAAY,UAAU,SAAS;AAC9D,QAAM,SAAS,mBACb,GACA,YAAY,UAAU,SAAS;AAEjC,QAAM,QAAQ,iBAAiB,YAAY,UAAU,WAAW;AAChE,QAAM,SAAS,mBACb,GACA,YAAY,UAAU,WAAW;AAEnC,QAAM,CAAC,QAAQ,UAAU,0BAAsC;AAC/D,QAAM,YAAY;AAClB,QAAM,SAAS,mBACb,GACA,YAAY,UAAU,WAAW;AAGnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAIG,yCACL,YACkB;AAClB,QAAM,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,WAAW,WAC/D;AAEF,SAAO,aAAa,aAAa;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAIG,kCAAkC,OAAiC;AACxE,QAAM,aAAoC,4BAA4B;AACtE,SAAO,gCAAgC;AAAA;AAGlC,yCACL,QACuB;AACvB,QAAM,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,WAAW,UAC9D,YAAY,aAAa;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAIG,qCACL,YACQ;AACR,MAAI,WAAW,cAAc,GAAG;AAC9B,UAAM,IAAI,MAAM;AAAA;AAGlB,QAAM,cAAc,IAAI,OAAO,0BAA0B;AAAA,IACvD,OAAO;AAAA,MACL,QAAQ,iBAAiB,IAAI,WAAW;AAAA,MACxC,aAAa,mBAAmB,GAAG,IAAI,WAAW;AAAA;AAAA,IAEpD,SAAS;AAAA,MACP,QAAQ,iBAAiB,GAAG,WAAW;AAAA,MACvC,aAAa,mBAAmB,GAAG,GAAG,WAAW;AAAA;AAAA,IAEnD,SAAS;AAAA,MACP,QAAQ,oBAAoB;AAAA,MAC5B,aAAa,mBAAmB,GAAG,GAAG,WAAW;AAAA;AAAA;AAIrD,MAAI,CAAC,0BAA0B,aAAa;AAC1C,WAAO;AAAA;AAGT,SAAO,eAAe,aAAa,WAAW,QAAQ,WAAW;AAAA;AAKnE,4BAA4B,YAA6C;AACvE,QAAM,SAAS;AACf,MAAI,WAAW,QAAQ,KAAK,WAAW,SAAS,WAAW;AACzD,WAAO,KAAK,UAAU,WAAW;AAAA;AAEnC,MAAI,WAAW,QAAQ,KAAK,WAAW,SAAS,OAAO;AACrD,WAAO,KAAK,UAAU,WAAW;AAAA;AAEnC,MAAI,WAAW,SAAS,KAAK,WAAW,UAAU,MAAM;AACtD,WAAO,KAAK,WAAW,WAAW;AAAA;AAEpC,MAAI,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG;AAEnD,QAAI,0BAA0B,aAAa;AACzC,aAAO,KAAK,WAAW,WAAW;AAAA;AAAA;AAItC,MAAI,WAAW,SAAS,KAAK,WAAW,UAAU,MAAM;AACtD,WAAO,KAAK,WAAW,WAAW;AAAA;AAEpC,MAAI,WAAW,SAAS,KAAK,WAAW,UAAU,MAAM;AACtD,WAAO,KAAK,WAAW,WAAW;AAAA;AAEpC,MAAI,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG;AACnD,WAAO,KAAK,WAAW,WAAW;AAAA;AAEpC,MAAI,WAAW,YAAY,KAAK,WAAW,aAAa,GAAG;AACzD,WAAO,KAAK,cAAc,WAAW;AAAA;AAEvC,SAAO;AAAA;AAGF,kCAAkC,OAA4B;AACnE,QAAM,aAAa,gCAAgC;AACnD,QAAM,SAAS,mBAAmB;AAClC,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,oCAAoC,OAAO,KAAK;AAAA;AAElE,SAAO,4BAA4B;AAAA;;;ACnP9B,2BAA2B,QAA6B;AAE7D,SACE,MAAM,UAAU,IAAI,KAAK,IAAI,WAAW,SAAS,CAAC,MAC/C,QAAO,EAAE,SAAS,KAAK,MAAM,KAEhC,KAAK;AAAA;AAGF,2BAA2B,KAAyB;AACzD,SAAO,IAAI,WAAW,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,SAAS,GAAG;AAAA;",
6
+ "names": []
7
+ }