diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 3d137435..2ab78dea 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -152,6 +152,24 @@ jobs: channel: stable cache: true + # The example's web build is finished by Workbox, which generates its + # service worker; the repository root holds that one Node tool. + - uses: pnpm/action-setup@v6 + if: needs.scope.outputs.full == 'true' && matrix.shard == 'flutter' + with: + version: 11.20.0 + + - uses: actions/setup-node@v7 + if: needs.scope.outputs.full == 'true' && matrix.shard == 'flutter' + with: + node-version-file: server/.nvmrc + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - name: Install Workbox + if: needs.scope.outputs.full == 'true' && matrix.shard == 'flutter' + run: pnpm install --frozen-lockfile + - name: Check ${{ matrix.shard }} if: needs.scope.outputs.full == 'true' run: ./tool/check.sh ${{ matrix.shard }} diff --git a/dart/eigen_client/CHANGELOG.md b/dart/eigen_client/CHANGELOG.md index b706259a..8434b1d9 100644 --- a/dart/eigen_client/CHANGELOG.md +++ b/dart/eigen_client/CHANGELOG.md @@ -1,4 +1,9 @@ # Changelog +## [Unreleased] +### Changed +- A sync request is answered by a completed pass that began pulling after it was made, instead of joining a pass in flight: passes never overlap, a burst of triggers costs one pass, a request made mid-pull still gets its own, and a failed pass answers nothing. `SyncPass` takes a `SyncLock` so processes sharing a replica, such as browser tabs, share passes too, and `run` answers null when an earlier pass already covered the request. +- `AccountReplica.applySync` takes `pulledAt`, and `lastSyncedAt` is the moment the last completed pass began pulling, written only by the page that completes it. `AccountReplica.lastSyncedAt()` reads it. + ## [0.5.0] - 2026-09-16 ### Added - A replica of the server's read model on the device, in Drift. `AccountReplica` and `PublicReplica` answer every list, profile, rating, friend and replay as a live query; `SyncPass` fills them from one `GET /me/sync` and uploads the games this device decided; `replicatedSessions` opens a game from the replica and writes each session it applies back. @@ -38,6 +43,7 @@ by a later active snapshot. ## [0.1.0] - 2026-08-21 - Initial pure Dart client and domain package. +[Unreleased]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_client-v0.5.0...HEAD [0.5.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_client-v0.4.0...eigen_client-v0.5.0 [0.4.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_client-v0.3.0...eigen_client-v0.4.0 [0.3.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_client-v0.2.0...eigen_client-v0.3.0 diff --git a/dart/eigen_client/lib/src/replica/account_replica.dart b/dart/eigen_client/lib/src/replica/account_replica.dart index 32ead55a..d44f9329 100644 --- a/dart/eigen_client/lib/src/replica/account_replica.dart +++ b/dart/eigen_client/lib/src/replica/account_replica.dart @@ -6,7 +6,8 @@ import 'replica_database.dart'; /// Where an account's history stands on this device. typedef HistoryState = ({ - /// When a sync last completed, or null before the first one. + /// How current the replica is: when the last completed sync began pulling, + /// or null before the first one. DateTime? lastSyncedAt, /// Whether older history remains on the server that the device does not @@ -66,15 +67,8 @@ final class AccountReplica { (_db.select( _db.accounts, )..where((row) => row.id.equals(accountId))).watchSingleOrNull().map( - (row) => ( - lastSyncedAt: row?.lastSyncedAt == null - ? null - : DateTime.fromMillisecondsSinceEpoch( - row!.lastSyncedAt!, - isUtc: true, - ), - hasOlder: row?.historyFloor != null, - ), + (row) => + (lastSyncedAt: _syncedAt(row), hasOlder: row?.historyFloor != null), ); /// Every game the account holds a seat in that has not ended, the account's @@ -255,6 +249,10 @@ final class AccountReplica { /// known yet. Future historyFloor() async => (await _account())?.historyFloor; + /// How current the replica is: when the last completed sync began pulling, + /// or null when the account has never synced on this device. + Future lastSyncedAt() async => _syncedAt(await _account()); + // ── Writes ──────────────────────────────────────────────────────────────── /// Applies one sync response in one transaction. @@ -264,13 +262,18 @@ final class AccountReplica { /// game absent from it has ended or been left; but an ended game can arrive on /// a later page of the same pass, so [endedSeen] is given only with the last /// page, carrying every finished game the pass received, and only then are - /// absent games removed. + /// absent games removed. That last page is also what completes the pass, so + /// it alone records [pulledAt], the moment the pass sent its first request, + /// as how current the replica now is. Future applySync( AccountSync sync, { required bool first, required Set? endedSeen, - required DateTime now, + required DateTime pulledAt, }) => _db.transaction(() async { + final syncedAt = endedSeen == null + ? const Value.absent() + : Value(pulledAt.toUtc().millisecondsSinceEpoch); final profile = sync.account; await _db .into(_db.accounts) @@ -281,7 +284,7 @@ final class AccountReplica { createdAt: profile.createdAt, finishedCursor: Value(sync.finishedCursor), historyFloor: Value(sync.historyFloor), - lastSyncedAt: Value(now.toUtc().millisecondsSinceEpoch), + lastSyncedAt: syncedAt, ), onConflict: DoUpdate( (_) => AccountsCompanion( @@ -293,7 +296,7 @@ final class AccountReplica { historyFloor: first ? Value(sync.historyFloor) : const Value.absent(), - lastSyncedAt: Value(now.toUtc().millisecondsSinceEpoch), + lastSyncedAt: syncedAt, ), ), ); @@ -586,6 +589,11 @@ final class AccountReplica { // ── Internals ───────────────────────────────────────────────────────────── + static DateTime? _syncedAt(AccountRow? row) => switch (row?.lastSyncedAt) { + final millis? => DateTime.fromMillisecondsSinceEpoch(millis, isUtc: true), + null => null, + }; + Future _account() => (_db.select( _db.accounts, )..where((row) => row.id.equals(accountId))).getSingleOrNull(); diff --git a/dart/eigen_client/lib/src/replica/replica_database.g.dart b/dart/eigen_client/lib/src/replica/replica_database.g.dart index 6296009e..7e065033 100644 --- a/dart/eigen_client/lib/src/replica/replica_database.g.dart +++ b/dart/eigen_client/lib/src/replica/replica_database.g.dart @@ -125,7 +125,8 @@ class AccountRow extends DataClass implements Insertable { /// Where older history continues, or null when none remains to fetch. final String? historyFloor; - /// When a sync last completed, in epoch milliseconds. + /// How current the replica is, in epoch milliseconds: when the last completed + /// sync began pulling. final int? lastSyncedAt; const AccountRow({ required this.id, diff --git a/dart/eigen_client/lib/src/replica/sync_pass.dart b/dart/eigen_client/lib/src/replica/sync_pass.dart index 57b31d80..6c48ea21 100644 --- a/dart/eigen_client/lib/src/replica/sync_pass.dart +++ b/dart/eigen_client/lib/src/replica/sync_pass.dart @@ -25,6 +25,14 @@ final class SyncReport { bool get pulled => error == null; } +/// Keeps a pass's work from overlapping another pass over the same replica. +/// +/// Runs [body] once no other body given to it is running. A replica only one +/// process opens needs nothing more than [SyncPass]'s own default; a replica +/// several processes share, such as browser tabs over one database, passes a +/// lock they all hold in common. +typedef SyncLock = Future Function(Future Function() body); + /// Brings one account's replica up to date with the server (decision 0013). /// /// One pass, two steps, in this order: upload the games this device decides, @@ -32,10 +40,14 @@ final class SyncReport { /// just finished arrives in the same pull that follows, where the reverse order /// would leave it for the next trigger. /// -/// Nothing here decides *when* a pass runs; that is the caller's, and it is -/// always an event (app start, resume, reconnecting, pull-to-refresh, a push, a -/// local game finishing), never a timer. Single-flight: a trigger arriving -/// mid-pass joins the pass already running. +/// Nothing here decides *when* a pass is asked for; that is the caller's, and +/// it is always an event (app start, coming back to the app, reconnecting, +/// pull-to-refresh, a push, a local game finishing), never a timer. What this +/// decides is whether the request still needs a pass of its own (decision +/// 0014): passes never overlap, and a request is already answered once a pass +/// that began pulling after it was made has completed. So a burst of triggers, +/// from one process or from several sharing the replica, costs one pass rather +/// than one each. final class SyncPass { SyncPass({ required this._replica, @@ -43,27 +55,46 @@ final class SyncPass { required this._account, required this._games, required this._localGames, + SyncLock? lock, this._clock = DateTime.now, this._keptReplays = defaultKeptReplays, - }); + }) : _lock = lock ?? _serial(); final AccountReplica _replica; final PublicReplica _public; final AccountRepository _account; final GameRepository _games; final LocalGameSync _localGames; + final SyncLock _lock; final DateTime Function() _clock; final int _keptReplays; - Future? _inFlight; + /// Runs a pass for a reason arising now, unless one that began pulling since + /// then has completed by the time this one could start. + /// + /// Answers with the pass's report, or null when an earlier-started request's + /// pass already brought the replica past this moment. A request arriving + /// mid-pass waits for that pass rather than joining it, because a pull that + /// began before the request may have missed what prompted it. + Future run() async { + final requestedAt = _clock(); + SyncReport? report; + await _lock(() async { + final syncedAt = await _replica.lastSyncedAt(); + if (syncedAt != null && !syncedAt.isBefore(requestedAt)) return; + report = await _run(); + }); + return report; + } - /// Runs a pass, or joins the one already running. - Future run() { - final running = _inFlight; - if (running != null) return running; - final pass = _run(); - _inFlight = pass; - return pass.whenComplete(() => _inFlight = null); + /// A lock only this process holds: each body starts once the last has ended. + static SyncLock _serial() { + var tail = Future.value(); + return (body) { + final next = tail.then((_) => body()); + tail = next.then((_) {}, onError: (Object _) {}); + return next; + }; } Future _run() async { @@ -79,6 +110,9 @@ final class SyncPass { } Future _pull() async { + // What the replica reflects once this pull completes: the server as of the + // moment its first request went out, not when the last page landed. + final pulledAt = _clock(); var cursor = await _replica.finishedCursor(); var response = await _account.sync(finishedAfter: cursor); if (cursor != null && @@ -99,7 +133,7 @@ final class SyncPass { response, first: first, endedSeen: last ? ended : null, - now: _clock(), + pulledAt: pulledAt, ); if (last) return; response = await _account.sync(finishedAfter: response.finishedCursor); diff --git a/dart/eigen_client/lib/src/replica/tables.dart b/dart/eigen_client/lib/src/replica/tables.dart index b8966c50..c76ac438 100644 --- a/dart/eigen_client/lib/src/replica/tables.dart +++ b/dart/eigen_client/lib/src/replica/tables.dart @@ -28,7 +28,8 @@ class Accounts extends Table { /// Where older history continues, or null when none remains to fetch. TextColumn get historyFloor => text().nullable()(); - /// When a sync last completed, in epoch milliseconds. + /// How current the replica is, in epoch milliseconds: when the last completed + /// sync began pulling. IntColumn get lastSyncedAt => integer().nullable()(); @override diff --git a/dart/eigen_client/test/replica/account_replica_test.dart b/dart/eigen_client/test/replica/account_replica_test.dart index 67124649..88084bfb 100644 --- a/dart/eigen_client/test/replica/account_replica_test.dart +++ b/dart/eigen_client/test/replica/account_replica_test.dart @@ -34,7 +34,7 @@ void main() { ), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); final profile = (await replica.watchProfile().first)!; @@ -56,13 +56,13 @@ void main() { accountSync(friends: [friendJson(them)]), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); await replica.applySync( accountSync(), first: false, endedSeen: const {}, - now: _now, + pulledAt: _now, ); expect(await replica.watchFriends().first, isEmpty); }, @@ -83,7 +83,7 @@ void main() { ), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); final active = await replica.watchActiveGames().first; expect(active.map((game) => game.id), ['my-turn', 'waiting-on-them']); @@ -96,7 +96,7 @@ void main() { accountSync(active: [summaryJson(id: 'left', seq: 2)]), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); // A middle page: the game may yet arrive as ended on a later one. @@ -104,7 +104,7 @@ void main() { accountSync(hasMore: true), first: false, endedSeen: null, - now: _now, + pulledAt: _now, ); expect(await replica.watchActiveGames().first, hasLength(1)); @@ -112,17 +112,44 @@ void main() { accountSync(), first: false, endedSeen: const {}, - now: _now, + pulledAt: _now, ); expect(await replica.watchActiveGames().first, isEmpty); }); + test('is only as current as its last completed pass', () async { + final earlier = _now.subtract(const Duration(minutes: 5)); + await replica.applySync( + accountSync(), + first: true, + endedSeen: const {}, + pulledAt: earlier, + ); + + // A pass still paging has not completed, however recent its first page. + await replica.applySync( + accountSync(hasMore: true), + first: false, + endedSeen: null, + pulledAt: _now, + ); + expect(await replica.lastSyncedAt(), earlier); + + await replica.applySync( + accountSync(), + first: false, + endedSeen: const {}, + pulledAt: _now, + ); + expect(await replica.lastSyncedAt(), _now); + }); + test('an ended game moves from in play to history', () async { await replica.applySync( accountSync(active: [summaryJson(id: 'g', seq: 2)]), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); await replica.applySync( accountSync( @@ -151,7 +178,7 @@ void main() { ), first: false, endedSeen: const {'g'}, - now: _now, + pulledAt: _now, ); expect(await replica.watchActiveGames().first, isEmpty); final finished = await replica.watchFinishedGames(limit: 10).first; @@ -167,7 +194,7 @@ void main() { accountSync(floor: 'older', cursor: 3), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); expect((await replica.watchHistory().first).hasOlder, isTrue); @@ -175,7 +202,7 @@ void main() { accountSync(cursor: 4), first: false, endedSeen: const {}, - now: _now, + pulledAt: _now, ); expect(await replica.historyFloor(), 'older'); @@ -304,7 +331,7 @@ void main() { accountSync(active: [summaryJson(id: 'online', seq: 2)], cursor: 5), first: true, endedSeen: const {}, - now: _now, + pulledAt: _now, ); final engine = await LocalGameEngine.create( userId: me, diff --git a/dart/eigen_client/test/replica/sync_pass_test.dart b/dart/eigen_client/test/replica/sync_pass_test.dart index 451c35bf..e02bab97 100644 --- a/dart/eigen_client/test/replica/sync_pass_test.dart +++ b/dart/eigen_client/test/replica/sync_pass_test.dart @@ -91,12 +91,15 @@ class _SyncServer implements HttpClientAdapter { AccountReplica replica, ReplicaDatabase db, }) -_build() { +_build({ReplicaDatabase? database, SyncLock? lock}) { final server = _SyncServer(); final dio = Dio(BaseOptions(baseUrl: 'https://example.test')) ..httpClientAdapter = server; final client = EigenClient(http: dio, baseUrl: 'https://example.test'); - final db = memoryReplica(); + final db = database ?? memoryReplica(); + // Every reading is a second later than the last, as a real clock would be + // across the awaits between them. + var ticks = 0; final replica = AccountReplica(db, me); final storage = LocalGameStorage(db); return ( @@ -110,7 +113,8 @@ _build() { games: client.games, userId: me, ), - clock: () => DateTime.utc(2026, 9, 16), + lock: lock, + clock: () => DateTime.utc(2026, 9, 16).add(Duration(seconds: ticks++)), ), server: server, replica: replica, @@ -128,7 +132,7 @@ void main() { ..add(syncJson(active: [summaryJson(id: 'g', seq: 3)], cursor: 4)); final first = await t.pass.run(); - expect(first.pulled, isTrue); + expect(first!.pulled, isTrue); await t.pass.run(); expect(t.server.cursors, [null, 4]); @@ -188,7 +192,7 @@ void main() { accountSync(active: [summaryJson(id: 'stale', seq: 2)], cursor: 9), first: true, endedSeen: const {}, - now: DateTime.utc(2026), + pulledAt: DateTime.utc(2026), ); // Uploading the local game is not what this test is about. await LocalGameStorage(t.db) @@ -199,7 +203,7 @@ void main() { final report = await t.pass.run(); - expect(report.pulled, isTrue); + expect(report!.pulled, isTrue); expect(t.server.cursors, [9, null]); expect((await t.replica.watchActiveGames().first).map((game) => game.id), [ 'local-1', @@ -215,7 +219,7 @@ void main() { final report = await t.pass.run(); - expect(report.pulled, isFalse); + expect(report!.pulled, isFalse); expect(report.error, isA()); expect(await t.replica.watchActiveGames().first, hasLength(1)); }); @@ -246,18 +250,73 @@ void main() { expect(await t.replica.watchFinishedGames(limit: 10).first, hasLength(2)); }); - test('a pass started mid-flight joins the one running', () async { + test( + 'requests made before a pass begins pulling are answered by it', + () async { + final t = _build(); + t.server.syncs.add(syncJson()); + + final first = t.pass.run(); + final second = t.pass.run(); + + expect(await first, isNotNull); + expect(await second, isNull); + expect(t.server.cursors, [null]); + }, + ); + + test('a request made mid-pull waits, then pulls again', () async { + // The running pull may have been answered before whatever prompted the + // request, so joining it would drop the request. final t = _build(); final gate = Completer(); t.server ..hold = gate.future - ..syncs.add(syncJson()); + ..syncs.add(syncJson(cursor: 1)) + ..syncs.add(syncJson(cursor: 1)); final first = t.pass.run(); + await pumpEventQueue(); final second = t.pass.run(); gate.complete(); - expect(identical(await first, await second), isTrue); + expect(await first, isNotNull); + expect(await second, isNotNull); + expect(t.server.cursors, [null, 1]); + }); + + test('a failed pass answers no request', () async { + final t = _build(); + t.server.offline = true; + await t.pass.run(); + t.server + ..offline = false + ..syncs.add(syncJson()); + + expect((await t.pass.run())!.pulled, isTrue); expect(t.server.cursors, [null]); }); + + test('passes sharing a lock across processes answer each other', () async { + // Two browser tabs over one database, each with its own pass: the second + // finds the first already brought the replica past its request. + final db = memoryReplica(); + var tail = Future.value(); + Future shared(Future Function() body) { + final next = tail.then((_) => body()); + tail = next.then((_) {}, onError: (Object _) {}); + return next; + } + + final tab1 = _build(database: db, lock: shared); + final tab2 = _build(database: db, lock: shared); + tab1.server.syncs.add(syncJson()); + + final first = tab1.pass.run(); + final second = tab2.pass.run(); + + expect(await first, isNotNull); + expect(await second, isNull); + expect(tab2.server.cursors, isEmpty); + }); } diff --git a/docs/architecture/0014-web-application-shell.md b/docs/architecture/0014-web-application-shell.md new file mode 100644 index 00000000..4ddb0572 --- /dev/null +++ b/docs/architecture/0014-web-application-shell.md @@ -0,0 +1,211 @@ +# 0014: the web application shell + +- Status: accepted +- Date: 2026-09-17 +- Amends: 0012's statement that the web ships a service worker that precaches + the application shell; 0013's "The sync pass" (single-flight) and "Web" + sections. + +## Context + +An audit of the web build against 0012 and 0013 found that several browser +behaviors had been worked around where they needed designing for. Each was +verified in a browser or in the source of the library involved: + +- The offline service worker was hand-written runtime caching. It began caching + only once it controlled the page, after Flutter had fetched its entry files, + so an app visited once did not open offline. With Workers Static Assets' + default `Cache-Control: public, max-age=0, must-revalidate`, a headless Chrome + cold start with the origin down showed the browser's error page after one + visit. It also served unhashed entry points cache-first, so the + update-required reload came back to the old build, and could mix files from + two builds. +- Drift's web runtime (`sqlite3.wasm`, `drift_worker.js`) was copied into every + app and into the scaffold, pinned by a README note while `drift` floated on a + caret. +- The browser tab lock was taken when `SharedWorker` was missing, but drift also + falls back to per-tab IndexedDB when a shared worker exists and fails, so the + unsafe case could open unlocked. A refused tab never recovered on its own. +- Drift's IndexedDB storage saves pending writes only after a statement runs + outside a transaction (drift 2.35.0). A transaction's `COMMIT` does not count, + so a transaction was not saved until some unrelated later write, and neither + was the schema version opening writes last. A tab closed in between lost the + transaction, or left every later open failing to create tables that exist. + Both reproduced in Chrome with shared-worker storage; the first is fixed + upstream in simolus3/drift#3865, not yet released. +- The sync pass lock was taken before joining a pass in flight, so a trigger + arriving mid-pass queued a second full pass rather than joining; on native the + lock was immediate and joining worked. +- Flutter's web engine maps window `blur` and `focus` to `inactive` and + `resumed`, so `onResume` fired on every alt-tab and when the sign-in popup + closed, each time running a sync pass and reconnecting an open game's socket. +- `connectivity_plus` on the web reports only `online` and `offline` events and + never the state it starts in, so an app opened offline believed itself online + and did not sync when the network returned. +- Closing the Google sign-in popup, or a blocked popup, showed a generic error. + +## Decision + +### The service worker is generated by Workbox and precaches the build + +The web build ends with `workbox generateSW workbox-config.cjs`. The worker +precaches everything the app is built from when it installs: `index.html`, +`flutter_bootstrap.js`, `main.dart.*`, the manifest, icons, and `assets/`. A +navigation is answered with the precached `index.html`, except for the routes +the game Worker renders itself, which the configuration's +`navigateFallbackDenylist` names: `run_worker_first` less `/join/*` and +`/game/*`. The scaffold's tests hold the two lists together. + +CanvasKit and the Firebase JS SDK load from Google's CDN at URLs that name their +version, so the worker caches them cache-first as they load. A first visit loads +them before the worker controls the page, so `flutter_bootstrap.js` copies what +the page loaded into the same cache, and drops versions it no longer loads. + +`flutter_bootstrap.js` starts Flutter at once and registers the workers beside +it rather than awaiting them first. + +### A deploy waits, and the update-required action activates it + +The worker does not skip waiting. A new deployment's worker precaches the new +build beside the old one and takes over when no tab runs the old build, so a +running tab never mixes two builds. When the engine refuses a client as too old, +the web's update-required action asks the browser for the newest worker, waits +for it to install, sends it Workbox's `SKIP_WAITING` message, and reloads once +it controls the page. + +### Drift's web runtime ships with `eigen_flutter` + +`sqlite3.wasm` and `drift_worker.js` are web-only package assets of +`eigen_flutter`, served at `assets/packages/eigen_flutter/assets/drift/`. +The worker and the module are one pair from one drift release, and +`eigen_flutter`'s `drift` floor names it. The constraint is an ordinary caret: +drift supports a newer client with an older worker within a major version. What +it does not do is deliver web storage fixes, which live in the worker, so +raising the floor means replacing both files. No app or template carries a copy. + +### Storage is chosen, then locked, then opened + +The web replica host probes the browser, chooses the most reliable storage it +offers, and only then decides whether this tab may open it: + +- Storage a shared worker hosts for every tab (`opfsShared`, `sharedIndexedDb`) + opens in every tab. +- Per-tab IndexedDB (`unsafeIndexedDb`) opens only in the tab holding the + database's Web Lock for its lifetime. Another tab reports that the app is + open elsewhere, waits for the lock, and opens by itself when it is granted. +- Memory opens, and the app says nothing survives a reload. + +A host is created already knowing its storage. On IndexedDB storage, until the +drift release carrying #3865, one statement runs outside a transaction after +each outermost commit and once after opening, so drift saves what they wrote. +`docs/blockers.md` tracks its removal. + +### A sync request is answered by a pass that began after it + +This replaces single-flight joining. Passes over one replica never overlap: the +pass takes a lock that, on the web, is the Web Lock every tab shares. A request +records when it was made, and once it holds the lock it runs a pass only if the +account's `last_synced_at` is older than that moment. `last_synced_at` is the +moment the last completed pass sent its first pull request, written only by the +page that completes the pass. A burst of requests, from one process or from +several tabs over one database, therefore costs one pass; a request made while a +pull is already under way still gets a pass of its own, because that pull may +have been answered before whatever prompted the request; and a failed pass +answers no request. + +### Keeping the browser's storage is offered, not requested + +A browser may clear a site's storage. Replicated rows return with the next pass; +a game played on the device and not yet uploaded does not. So the app asks the +browser to keep its storage, and because some browsers ask the player in turn, +it explains first: the home screen offers it while the account holds a game the +server does not have, once, and never on a device. `ReplicaHost` reports +persistence as a state, so an offer is made only where the browser has neither +granted nor refused. Nothing asks at startup or as a game is created. + +How many replays the replica keeps is `ReplicaConfig.keptReplays`, an app's to +set, which answers 0013's open question. It matters most in a browser, where the +whole replica is held in memory. + +### A replica that stops answering says so + +A browser may terminate the worker hosting the replica, which Chrome for Android +documents for a backgrounded app, and nothing tells the page: drift's channel +cannot observe a worker going away, so a statement simply never answers, lists +keep what they last read, and writes wait forever. There is no signal to listen +for, so statements are timed instead: one unanswered for 20 seconds reports the +replica as not answering, and any answer reports it back. Opening is not timed, +because loading a large replica out of IndexedDB is slow rather than broken. + +Nothing recovers automatically. The app says it stopped responding and offers a +reload, which opens everything again; a reload is also all that was ever needed, +since every committed write is already stored. + +### Coming back is `onShow` + +The app refreshes (sync pass, update check, notification reconciliation, the +open game's streams) when it comes back into view, `AppLifecycleListener.onShow`, +not when it regains focus. On Android this also stops the notification shade +from triggering a pass. + +### Connectivity starts from the current state + +The connectivity provider reads the current state explicitly, then follows +changes; a change that arrives before the read answers wins. + +### Web sign-in is the popup, and its outcomes are modelled + +The web signs in and upgrades a guest through Firebase's popup, with no redirect +fallback. `AuthGateway` reports a dismissed sign-in as `cancelled`, which is not +an error and leaves a guest untouched, including during a switch to an existing +account. A popup the browser blocks is `AuthWindowBlockedException`, which the +app explains. The Firebase adapter maps `popup-closed-by-user`, +`cancelled-popup-request`, and `user-cancelled`, and Google Sign-In's `canceled`, +to `cancelled`, and `popup-blocked` to blocked. + +## Invariants + +Unchanged from 0013. New: + +- A web tab runs one build, from one precache, until it reloads. +- A browser tab opens per-tab storage only while holding its lock. +- A sync request is answered by a completed pass that began pulling after it. + +## Testing + +- `eigen_client`: requests made before a pass begins pulling share it; a request + made mid-pull runs again; a failed pass answers nothing; passes sharing a lock + answer each other; `last_synced_at` changes only on a pass's last page. +- `eigen_flutter`: an app opened with no network is offline before any change, + and a change arriving before the read wins. +- `eigen_firebase`: interruption codes map to cancelled or blocked, and nothing + else does. +- `eigen_shell`: a dismissed sign-in is not an error, and a dismissed switch + keeps the guest. +- `tool/check.sh flutter` builds the example, generates its worker, and checks + the worker precaches the entry points and drift's runtime. The scaffold's + end-to-end check runs the project's own `build:web`, and its tests hold the + worker's denylist to the Worker's routes. + +Browser behavior is not covered by CI and was verified in headless Chrome when +this was decided: an offline cold start after one visit with every host but the +origin unreachable, an offline `/game/:id` link, the update handshake, two tabs +over shared-worker storage, a refused tab taking over, and reopening after the +only tab closed. + +## Open questions + +- Chrome for Android shipped shared workers in Chrome 148, with a documented + caveat that one may be terminated when the app is backgrounded. Whether it + happens in practice is untested on a device; the reload offer above is what + the app does if it ever does. +- IndexedDB storage holds the whole database in the worker's memory and writes + it back behind every save, so the replica's size is memory on the web. Chrome + and Safari have no other persistent storage without cross-origin isolation. + A browser that starts offering OPFS opens the replica there, empty: synced + data returns with the next pass, but local games not yet uploaded stay in the + IndexedDB database. Drift's `moveFromIndexedDBToOpfs` is the route if that + needs handling once there are players. +- A browser that refuses to keep storage says so only as a failed request: + Chrome reports the permission as `prompt` and then decides for itself without + asking anyone, so the app cannot tell beforehand which browsers will ask. diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 1affc8d0..58e6de8d 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -20,6 +20,7 @@ the implementation is wrong or the record must be superseded explicitly. | [0011](0011-commerce-entitlements-and-access.md) | Accepted | Commerce, entitlements, fixed access capabilities, and optional limits | | [0012](0012-offline-play.md) | Accepted | Offline play against local bots with lazy import | | [0013](0013-device-replica-and-sync.md) | Accepted | Device replica of the read model, and one sync pass | +| [0014](0014-web-application-shell.md) | Accepted | The web application shell: precache, updates, browser storage, and sign-in | The machine-readable contract is generated, not hand-written: the HTTP surface as OpenAPI 3.1 (`server/packages/server/openapi.json`) from the Zod schemas in `routes/wire.ts`, and each game's payload schemas as `game-contract.json` from its TypeScript rules. [`status.md`](status.md) records delivery status and the next product work. diff --git a/docs/blockers.md b/docs/blockers.md index db639d22..f18d1dbe 100644 --- a/docs/blockers.md +++ b/docs/blockers.md @@ -10,6 +10,7 @@ upgrades. - [Android built-in Kotlin migration](#android-built-in-kotlin-migration) - [Dart SDK ships a crashing dartdoc](#dart-sdk-ships-a-crashing-dartdoc) +- [Drift does not persist IndexedDB transactions](#drift-does-not-persist-indexeddb-transactions) - [FlutterFire Firebase Installation ID registration API](#flutterfire-firebase-installation-id-registration-api) ## Android built-in Kotlin migration @@ -105,6 +106,67 @@ References: - [dartdoc changelog](https://pub.dev/packages/dartdoc/changelog) - [Dart SDK `DEPS`](https://github.com/dart-lang/sdk/blob/main/DEPS) +## Drift does not persist IndexedDB transactions + +**Status:** Worked around in `eigen_flutter`; fixed upstream, unreleased. +**Last checked:** 2026-09-17. + +Drift's IndexedDB storage (`sharedIndexedDb`, `unsafeIndexedDb`) keeps the +database in memory and saves pending writes to IndexedDB only after a statement +runs outside a transaction. In drift 2.35.0 two writes are never followed by +one: + +- A transaction's `COMMIT` runs while drift still considers itself inside the + transaction, so nothing a transaction wrote is saved until some later, + unrelated statement. Almost every replica write is a transaction, including + each move of a local game, which exists nowhere else until it is uploaded. +- `Sqlite3Delegate.setSchemaVersion` writes the schema version after every + migration statement and saves nothing. Lost, it makes every later open run the + creating migration again and fail, for good. + +A tab that closes in between loses the write. Reproduced in Chrome 153 with +`sharedIndexedDb`: a row inserted in a transaction was gone after closing the +only tab and reopening. IndexedDB is the storage Chrome and Safari get, because +OPFS needs either shared workers that can start dedicated workers (Firefox +only) or cross-origin isolation, which breaks the sign-in popup. + +[simolus3/drift#3865](https://github.com/simolus3/drift/pull/3865) (merged +2026-09-16, fixing [#3864](https://github.com/simolus3/drift/issues/3864)) +saves after a commit and after every read outside a transaction, which also +saves the schema version on the first query after opening. drift 2.35.0 +(2026-09-09) is the latest release and predates it. + +### Current compatibility seam + +`_PersistToIndexedDb` in `flutter/lib/core/replica/replica_host_web.dart`, a +drift `QueryInterceptor` applied only to IndexedDB storage: after each outermost +commit, and once after opening, it runs one statement outside a transaction, +which is what makes drift save. Nothing else in the platform knows about it. + +### Unblock and remove + +1. Watch drift's releases for the first one whose changelog carries #3865: + + ```bash + gh release list -R simolus3/drift --limit 5 + ``` + +2. Raise `drift` in `flutter/pubspec.yaml` to that release, and replace + `flutter/assets/drift/sqlite3.wasm` and `drift_worker.js` with that + release's assets. The fix runs inside the worker, so the Dart constraint alone + changes nothing in a browser. +3. Delete `_PersistToIndexedDb` and its use in `openReplicaHost`. +4. In a browser with `sharedIndexedDb` (Chrome), write in a transaction, close + the only tab, and reopen: the row must still be there. Repeat on a fresh + profile with nothing written after opening: the second open must not fail. +5. Remove this entry. + +References: + +- [drift PR #3865](https://github.com/simolus3/drift/pull/3865) +- [drift issue #3864](https://github.com/simolus3/drift/issues/3864) +- [Architecture decision 0014](architecture/0014-web-application-shell.md) + ## FlutterFire Firebase Installation ID registration API **Status:** Blocked until FlutterFire publishes the proposed API. **Last diff --git a/firebase/CHANGELOG.md b/firebase/CHANGELOG.md index 5c402369..04f3e3c0 100644 --- a/firebase/CHANGELOG.md +++ b/firebase/CHANGELOG.md @@ -1,4 +1,8 @@ # Changelog +## [Unreleased] +### Changed +- Web sign-in stays on the popup and reports its interruptions: a closed or superseded popup, or a dismissed native account picker, is a cancellation, and a blocked popup is `AuthWindowBlockedException`. + ## [0.4.0] - 2026-09-16 ### Added - `foregroundMessages`, the stream that lets the app sync when a push arrives while it is open. @@ -31,6 +35,7 @@ permanent Android notification-permission denials. - Firebase Auth, bearer tokens, Analytics, Crashlytics, Cloud Messaging, and Android notification resources compose above `eigen_flutter` ports. +[Unreleased]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_firebase-v0.4.0...HEAD [0.4.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_firebase-v0.3.2...eigen_firebase-v0.4.0 [0.3.2]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_firebase-v0.3.1...eigen_firebase-v0.3.2 [0.3.1]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_firebase-v0.3.0...eigen_firebase-v0.3.1 diff --git a/firebase/lib/src/auth/firebase_auth_gateway.dart b/firebase/lib/src/auth/firebase_auth_gateway.dart index 3d72f418..0e96568a 100644 --- a/firebase/lib/src/auth/firebase_auth_gateway.dart +++ b/firebase/lib/src/auth/firebase_auth_gateway.dart @@ -84,8 +84,12 @@ class FirebaseAuthGateway implements AuthGateway { GoogleAuthProvider _googleProvider() => GoogleAuthProvider(); /// Signs in with Google, creating the account on first use. + /// + /// The web signs in through Firebase's popup and only the popup (decision + /// 0014): never a redirect, which unloads the app mid-flow and needs the auth + /// handler on the app's own site to work in browsers that partition storage. @override - Future signInWithGoogle() async { + Future signInWithGoogle() async { try { if (kIsWeb) { // google_sign_in's endorsed web implementation deliberately does not @@ -97,14 +101,22 @@ class FirebaseAuthGateway implements AuthGateway { await _auth.signInWithCredential(await _googleCredential()); } developer.log('Signed in with Google', name: 'auth.service'); + return AuthSignInResult.signedIn; } catch (error, stackTrace) { - developer.log( - 'Failed to sign in with Google', - name: 'auth.service', - error: error, - stackTrace: stackTrace, - ); - rethrow; + switch (signInInterruptionOf(error)) { + case SignInInterruption.cancelled: + return AuthSignInResult.cancelled; + case SignInInterruption.blocked: + throw const AuthWindowBlockedException(); + case null: + developer.log( + 'Failed to sign in with Google', + name: 'auth.service', + error: error, + stackTrace: stackTrace, + ); + rethrow; + } } } @@ -150,21 +162,29 @@ class FirebaseAuthGateway implements AuthGateway { cancelExistingAccountSwitch(); developer.log('Guest upgraded to Google', name: 'auth.service'); return AuthUpgradeResult.linked; - } on FirebaseAuthException catch (error, stackTrace) { + } catch (error, stackTrace) { // Both codes mean the same thing to a user: that Google account is taken. - if (error.code == 'credential-already-in-use' || - error.code == 'email-already-in-use') { + if (error case FirebaseAuthException( + code: 'credential-already-in-use' || 'email-already-in-use', + )) { _pendingExistingAccountCredential = error.credential; _hasPendingExistingAccount = true; return AuthUpgradeResult.existingAccount; } - developer.log( - 'Failed to upgrade guest account', - name: 'auth.service', - error: error, - stackTrace: stackTrace, - ); - rethrow; + switch (signInInterruptionOf(error)) { + case SignInInterruption.cancelled: + return AuthUpgradeResult.cancelled; + case SignInInterruption.blocked: + throw const AuthWindowBlockedException(); + case null: + developer.log( + 'Failed to upgrade guest account', + name: 'auth.service', + error: error, + stackTrace: stackTrace, + ); + rethrow; + } } } @@ -174,17 +194,15 @@ class FirebaseAuthGateway implements AuthGateway { /// one, avoiding a second account prompt. Some providers/platforms omit it, /// in which case the normal sign-in flow is the safe fallback. @override - Future switchToExistingGoogleAccount() async { + Future switchToExistingGoogleAccount() async { if (!_hasPendingExistingAccount) { throw StateError('No existing Google account switch is pending.'); } final credential = _pendingExistingAccountCredential; try { - if (credential == null) { - await signInWithGoogle(); - } else { - await _auth.signInWithCredential(credential); - } + if (credential == null) return await signInWithGoogle(); + await _auth.signInWithCredential(credential); + return AuthSignInResult.signedIn; } finally { cancelExistingAccountSwitch(); } @@ -217,3 +235,32 @@ class FirebaseAuthGateway implements AuthGateway { } } } + +/// How an interactive sign-in ended without failing. +@visibleForTesting +enum SignInInterruption { + /// The player dismissed the provider's sign-in. + cancelled, + + /// The browser refused to open the provider's window. + blocked, +} + +/// What [error], thrown by an interactive sign-in, says the player did, or null +/// when it is a genuine failure. +/// +/// A second popup opened over the first (`cancelled-popup-request`) is the same +/// to a player as closing it: they tapped twice, and the later one stands. +@visibleForTesting +SignInInterruption? signInInterruptionOf(Object error) => switch (error) { + FirebaseAuthException( + code: 'popup-closed-by-user' || + 'cancelled-popup-request' || + 'user-cancelled', + ) => + SignInInterruption.cancelled, + FirebaseAuthException(code: 'popup-blocked') => SignInInterruption.blocked, + GoogleSignInException(code: GoogleSignInExceptionCode.canceled) => + SignInInterruption.cancelled, + _ => null, +}; diff --git a/firebase/test/auth/sign_in_interruption_test.dart b/firebase/test/auth/sign_in_interruption_test.dart new file mode 100644 index 00000000..1b617e80 --- /dev/null +++ b/firebase/test/auth/sign_in_interruption_test.dart @@ -0,0 +1,49 @@ +import 'package:checks/checks.dart'; +import 'package:eigen_firebase/src/auth/firebase_auth_gateway.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +void main() { + test('dismissing the popup, or opening a second one, is a cancellation', () { + for (final code in [ + 'popup-closed-by-user', + 'cancelled-popup-request', + 'user-cancelled', + ]) { + check( + signInInterruptionOf(FirebaseAuthException(code: code)), + because: code, + ).equals(SignInInterruption.cancelled); + } + }); + + test('a popup the browser refused is blocked, not cancelled', () { + check(signInInterruptionOf(FirebaseAuthException(code: 'popup-blocked'))) + .equals(SignInInterruption.blocked); + }); + + test('dismissing the native account picker is a cancellation', () { + check( + signInInterruptionOf( + const GoogleSignInException(code: GoogleSignInExceptionCode.canceled), + ), + ).equals(SignInInterruption.cancelled); + }); + + test('anything else is a failure', () { + check( + signInInterruptionOf( + FirebaseAuthException(code: 'network-request-failed'), + ), + ).isNull(); + check( + signInInterruptionOf( + const GoogleSignInException( + code: GoogleSignInExceptionCode.clientConfigurationError, + ), + ), + ).isNull(); + check(signInInterruptionOf(StateError('boom'))).isNull(); + }); +} diff --git a/flutter/CHANGELOG.md b/flutter/CHANGELOG.md index 0bb1a3a3..5d22f93c 100644 --- a/flutter/CHANGELOG.md +++ b/flutter/CHANGELOG.md @@ -14,6 +14,28 @@ Pre-1.0, breaking changes land in a **MINOR** bump: `^0.1.0` resolves to [Versions and compatibility](https://eigeninteractive.com/docs/reference/compatibility) for how this package, the engine and the generated `eigen_api` client pair up. +## [Unreleased] +### Added +- Drift's web runtime (`sqlite3.wasm`, `drift_worker.js`) ships as web-only package assets, so an app carries no copy, and `drift` is held to the minor line they come from (`>=2.35.0 <2.36.0`). +- Drift's web runtime (`sqlite3.wasm`, `drift_worker.js`) ships as web-only package assets, so an app carries no copy of it. +- `ReplicaConfig.keptReplays` on `AppConfig`: how many ended online games keep their replay on the device. In a browser the whole replica is held in memory, so an app with large replays can keep fewer there. +- `replicaAnsweringProvider`: whether the replica still answers. A browser can take the worker holding it away without telling the page, and statements then never answer, so they are timed, and the app can offer the reload that opens everything again. + +### Changed +- The web replica host chooses its storage before opening anything and locks a tab only for per-tab IndexedDB, the one storage unsafe to share, including when a shared worker exists but fails. A tab refused the database opens by itself once the tab holding it closes. `ReplicaHost.storage` is known when the host is, and `ReplicaHost.available` completes when a refused tab may open. +- `ReplicaHost.exclusively` excludes within one process too, and `SyncCoordinator` shares its pass lock across tabs, so triggers arriving together run one pass. +- `AuthGateway.signInWithGoogle` and `switchToExistingGoogleAccount` return `AuthSignInResult`, and `AuthUpgradeResult` gains `cancelled`: dismissing the provider's sign-in is not an error. A blocked sign-in window is `AuthWindowBlockedException`, which `humanize` explains. +- The web replica host chooses its storage before opening anything and locks a tab only for per-tab IndexedDB, the one storage unsafe to share, including when a shared worker exists but fails. A tab refused the database opens by itself once the tab holding it closes. `ReplicaHost.storage` is known when the host is, and `ReplicaHost.available` completes when a refused tab may open. +- `ReplicaHost.exclusively` excludes within one process too, and `SyncCoordinator` shares its pass lock across tabs, so triggers arriving together run one pass. +- `AuthGateway.signInWithGoogle` and `switchToExistingGoogleAccount` return `AuthSignInResult`, and `AuthUpgradeResult` gains `cancelled`: dismissing the provider's sign-in is not an error. A blocked sign-in window is `AuthWindowBlockedException`, which `humanize` explains. +- `ReplicaHost.persistence()` reports whether the browser keeps this site's storage, and `requestPersistence()` answers what it decided. `KeepLocalGames` offers it while the account holds a game the server does not have, once, instead of creating a local game asking silently. + +### Fixed +- On the web, a browser that opened the replica and closed before writing anything else lost its schema version, and every later open failed. Opening now persists it. +- The connectivity provider reads the current state before following changes, so a web app opened with no network is offline, and syncs when the network returns. +- On the web, a transaction the replica committed to IndexedDB was not saved until some later unrelated write, so closing the tab could lose it, including a local game's moves; and a browser that opened the replica and closed before writing anything lost its schema version, failing every later open. Both are now saved, until drift releases its own fix. +- The connectivity provider reads the current state before following changes, so a web app opened with no network is offline, and syncs when the network returns. + ## [0.13.0] - 2026-09-16 ### Added - `replicaHostProvider` opens the device replica for the platform: a file on a device, drift's shared-worker storage on the web where the browser has it, and an exclusive single-tab database where it does not. `ReplicaStorage` says which the app got, and whether anything survives a reload. @@ -327,6 +349,7 @@ server-side concern now live in the engine. - `google_fonts`, which fetched Inter at runtime, replaced by the bundled package font above. +[Unreleased]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_flutter-v0.13.0...HEAD [0.13.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_flutter-v0.12.0...eigen_flutter-v0.13.0 [0.12.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_flutter-v0.11.0...eigen_flutter-v0.12.0 [0.11.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_flutter-v0.10.0...eigen_flutter-v0.11.0 diff --git a/flutter/README.md b/flutter/README.md index 34c44ea7..9dc5480c 100644 --- a/flutter/README.md +++ b/flutter/README.md @@ -168,11 +168,14 @@ cd example flutter pub get flutter test flutter build web --release +npx workbox-cli generateSW workbox-config.cjs ``` -The package treats Android and web as supported targets. The generated scaffold -includes the browser Firebase Messaging service worker, Firebase Auth's web -popup flow, cross-origin Worker setup, and a release web build in CI. See +The package treats Android and web as supported targets, and ships drift's web +runtime as web-only package assets, so an app copies none of it. The generated +scaffold includes the browser Firebase Messaging service worker, Firebase Auth's +web popup flow, cross-origin Worker setup, a Workbox service worker that makes +the web app open offline, and a release web build in CI. See [Deploy the web app](https://eigeninteractive.com/docs/ship-it/deploy-the-web-app). ## Documentation diff --git a/flutter/assets/drift/README.md b/flutter/assets/drift/README.md new file mode 100644 index 00000000..10d35fbe --- /dev/null +++ b/flutter/assets/drift/README.md @@ -0,0 +1,16 @@ +# Drift's web runtime + +`sqlite3.wasm` and `drift_worker.js` are what give a browser the replica +database: the SQLite module, and the worker that hosts it so every tab of the +app shares one database. They are taken verbatim from the [drift 2.35.0 +release](https://github.com/simolus3/drift/releases/tag/drift-2.35.0), and the +worker and the module are one pair. + +They ship here, as web-only package assets, because this package is what +chooses drift. An app gets them at +`assets/packages/eigen_flutter/assets/drift/` without copying anything, and +`pubspec.yaml`'s floor for `drift` names the release they come from. Drift +supports a newer client with an older worker within a major version, so an app +may resolve a later 2.x, but raising the floor means replacing both files from +the matching release in the same change: fixes to web storage live in the +worker, not in the Dart package. diff --git a/flutter/example/web/drift_worker.js b/flutter/assets/drift/drift_worker.js similarity index 100% rename from flutter/example/web/drift_worker.js rename to flutter/assets/drift/drift_worker.js diff --git a/flutter/example/web/sqlite3.wasm b/flutter/assets/drift/sqlite3.wasm similarity index 100% rename from flutter/example/web/sqlite3.wasm rename to flutter/assets/drift/sqlite3.wasm diff --git a/flutter/example/README.md b/flutter/example/README.md index 0afa4ce7..6a2dd207 100644 --- a/flutter/example/README.md +++ b/flutter/example/README.md @@ -66,8 +66,13 @@ submissions land in either order. flutter pub get flutter test flutter build web --release --dart-define-from-file=app-config.json +npx workbox-cli generateSW workbox-config.cjs ``` +The last step generates `build/web/sw.js`, the service worker that precaches the +build so the app opens offline. `workbox-config.cjs` is the same configuration a +scaffolded game carries. + Playing it against a real server needs two things this repository deliberately does not contain: a Firebase project and a deployed worker. Configure Firebase without copying its Web identifiers by hand: diff --git a/flutter/example/web/README.md b/flutter/example/web/README.md deleted file mode 100644 index 89dbabd7..00000000 --- a/flutter/example/web/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Web assets - -`sqlite3.wasm` and `drift_worker.js` are drift's web runtime, taken verbatim -from the [drift 2.35.0 -release](https://github.com/simolus3/drift/releases/tag/drift-2.35.0). They are -served from the app's own origin because that is where `LocalDatabase` looks for -them, and they are what gives a browser the storage offline play needs. - -Replace both together whenever the `drift` constraint in `eigen_flutter`'s -pubspec moves, and take them from the matching release: the worker and the -module are one pair. diff --git a/flutter/example/web/eigen_offline_sw.js b/flutter/example/web/eigen_offline_sw.js deleted file mode 100644 index 30e62442..00000000 --- a/flutter/example/web/eigen_offline_sw.js +++ /dev/null @@ -1,82 +0,0 @@ -// The app shell's cache, so a game can be opened with no network. -// -// Flutter stopped generating a service worker in 2025, and the browser cache it -// left behind is not a promise: it is evicted on its own terms and never -// answers a cold start offline. Offline play needs the opposite guarantee, so -// this worker is the app's own, small and readable rather than generated. -// -// Runtime caching, not a precache manifest. Flutter's build emits hashed file -// names that a checked-in manifest would have to track release by release; what -// this does instead is remember what the app actually asked for, which after one -// online visit is exactly the shell. - -const CACHE = "eigen-shell-v1"; - -// Never cached: the engine's own API and socket. They are the live truth, and a -// stale answer from here would be worse than an honest failure the app already -// knows how to render. -const isApi = (url) => url.pathname.startsWith("/api/"); - -self.addEventListener("install", (event) => { - // Take over as soon as this version is ready; there is no migration to stage. - event.waitUntil(self.skipWaiting()); -}); - -self.addEventListener("activate", (event) => { - event.waitUntil( - (async () => { - const names = await caches.keys(); - await Promise.all(names.filter((name) => name !== CACHE).map((name) => caches.delete(name))); - await self.clients.claim(); - })(), - ); -}); - -self.addEventListener("fetch", (event) => { - const request = event.request; - if (request.method !== "GET") return; - const url = new URL(request.url); - if (url.origin !== self.location.origin || isApi(url)) return; - - // A navigation is the app opening. Prefer the network so a deploy is picked - // up, and fall back to whatever shell was cached, which is what makes a cold - // start offline work at all. - if (request.mode === "navigate") { - event.respondWith( - (async () => { - try { - const response = await fetch(request); - const cache = await caches.open(CACHE); - cache.put(request, response.clone()); - return response; - } catch (error) { - const cached = (await caches.match(request)) || (await caches.match("/")); - if (cached) return cached; - throw error; - } - })(), - ); - return; - } - - // Everything else the shell is built from: answer from the cache instantly and - // refresh it in the background, so a release lands on the next load. - event.respondWith( - (async () => { - const cached = await caches.match(request); - const network = fetch(request) - .then(async (response) => { - if (response.ok) { - const cache = await caches.open(CACHE); - cache.put(request, response.clone()); - } - return response; - }) - .catch((error) => { - if (cached) return cached; - throw error; - }); - return cached || network; - })(), - ); -}); diff --git a/flutter/example/web/firebase-messaging-sw.js b/flutter/example/web/firebase-messaging-sw.js index adb6ca82..fdd042c3 100644 --- a/flutter/example/web/firebase-messaging-sw.js +++ b/flutter/example/web/firebase-messaging-sw.js @@ -1,5 +1,5 @@ -importScripts("https://www.gstatic.com/firebasejs/12.15.0/firebase-app-compat.js"); -importScripts("https://www.gstatic.com/firebasejs/12.15.0/firebase-messaging-compat.js"); +importScripts("https://www.gstatic.com/firebasejs/12.19.0/firebase-app-compat.js"); +importScripts("https://www.gstatic.com/firebasejs/12.19.0/firebase-messaging-compat.js"); importScripts("firebase-config.js"); firebase.initializeApp(self.firebaseConfig); diff --git a/flutter/example/web/flutter_bootstrap.js b/flutter/example/web/flutter_bootstrap.js index aaf8afd7..0bbd8057 100644 --- a/flutter/example/web/flutter_bootstrap.js +++ b/flutter/example/web/flutter_bootstrap.js @@ -1,30 +1,43 @@ {{flutter_js}} {{flutter_build_config}} -(async () => { - if ("serviceWorker" in navigator) { - await navigator.serviceWorker - .register("firebase-messaging-sw.js", { - scope: "/firebase-cloud-messaging-push-scope", - }) - .catch((error) => { - console.warn( - "Firebase Messaging service worker registration failed", - error, - ); - }); - } +// Flutter starts at once. Neither worker below is anything this page waits on, +// so they register beside it rather than ahead of it. +_flutter.loader.load(); - if ("serviceWorker" in navigator) { - // The app shell's own cache, registered at the root scope so it can answer - // a cold start with no network. Separate from the messaging worker above, - // which owns only its push scope. - await navigator.serviceWorker - .register("eigen_offline_sw.js", { scope: "/" }) - .catch((error) => { - console.warn("Offline shell service worker registration failed", error); - }); - } +if ("serviceWorker" in navigator) { + // The app's own worker, generated by Workbox (workbox-config.cjs): the + // precached build, which is what lets the app open with no network. + navigator.serviceWorker.register("sw.js").catch((error) => { + console.warn("App service worker registration failed", error); + }); + // Firebase Messaging's worker, which owns only its push scope. + navigator.serviceWorker.register("firebase-messaging-sw.js", { scope: "/firebase-cloud-messaging-push-scope" }).catch((error) => { + console.warn("Firebase Messaging service worker registration failed", error); + }); +} - _flutter.loader.load(); -})(); +// CanvasKit and the Firebase JS SDK load from Google's CDN, which the app's +// worker caches as they pass through it. A first visit fetches them before that +// worker controls the page, so the page copies what it loaded into the same +// cache ("eigen-cdn" in workbox-config.cjs), and drops versions of each it no +// longer loads. Without this, the first visit would not open offline. +if ("caches" in self && "PerformanceObserver" in self) { + const cdn = /^https:\/\/www\.gstatic\.com\/(flutter-canvaskit|firebasejs)\/[^/]+\//; + new PerformanceObserver(async (entries) => { + for (const { name } of entries.getEntries()) { + const loaded = cdn.exec(name); + if (!loaded) continue; + try { + const cache = await caches.open("eigen-cdn"); + if (!(await cache.match(name))) await cache.add(name); + for (const request of await cache.keys()) { + const cached = cdn.exec(request.url); + if (cached && cached[1] === loaded[1] && cached[0] !== loaded[0]) await cache.delete(request); + } + } catch { + // Only a later offline start is at stake, and the next load tries again. + } + } + }).observe({ type: "resource", buffered: true }); +} diff --git a/flutter/example/workbox-config.cjs b/flutter/example/workbox-config.cjs new file mode 100644 index 00000000..d28d7148 --- /dev/null +++ b/flutter/example/workbox-config.cjs @@ -0,0 +1,46 @@ +// The web app's service worker, generated by Workbox from the Flutter build +// (decision 0014). Run after `flutter build web`: +// +// workbox generateSW workbox-config.cjs +// +// Every file the app is built from is precached when the worker installs, so +// the app opens with no network from the first visit on, and always from one +// consistent build. A deploy reaches a player as a new worker that precaches +// the new build beside the old one and takes over once no tab still runs the +// old build, or at once when the app asks it to because the engine requires the +// update. + +// Paths the game Worker answers itself rather than the app shell: its +// `run_worker_first` routes in wrangler.jsonc, less `/join/*` and `/game/*`, +// which render the app. A navigation to any other path opens the app. +const workerRoutes = [/^\/api\//, /^\/avatars\//, /^\/\.well-known\//, /^\/(health|download|terms|privacy|delete-account|robots\.txt|sitemap\.xml|site\.webmanifest)$/]; + +module.exports = { + globDirectory: "build/web", + swDest: "build/web/sw.js", + globPatterns: ["index.html", "flutter_bootstrap.js", "main.dart.*", "manifest.json", "icons/**", "assets/**"], + globIgnores: ["**/*.map", "**/*.symbols"], + // `main.dart.js` alone is several megabytes, and a game's assets may be too. + // A file over the limit would be left out with only a warning, and the app + // would then fail offline, so the limit is set well above anything expected. + maximumFileSizeToCacheInBytes: 32 * 1024 * 1024, + navigateFallback: "index.html", + navigateFallbackDenylist: workerRoutes, + runtimeCaching: [ + { + // CanvasKit and the Firebase JS SDK load from Google's CDN at URLs that + // name their version, so a cached copy is never stale. The page adds what + // a first visit loaded before this worker controlled it (see + // web/flutter_bootstrap.js), under the same cache name. + urlPattern: /^https:\/\/www\.gstatic\.com\/(flutter-canvaskit|firebasejs)\//, + handler: "CacheFirst", + options: { cacheName: "eigen-cdn", cacheableResponse: { statuses: [200] } }, + }, + ], + skipWaiting: false, + clientsClaim: true, + cleanupOutdatedCaches: true, + inlineWorkboxRuntime: true, + sourcemap: false, + mode: "production", +}; diff --git a/flutter/lib/core/config/app_config.dart b/flutter/lib/core/config/app_config.dart index a30bd2ba..684321f9 100644 --- a/flutter/lib/core/config/app_config.dart +++ b/flutter/lib/core/config/app_config.dart @@ -1,3 +1,4 @@ +import 'package:eigen_client/eigen_client.dart' show defaultKeptReplays; import 'package:eigen_flutter/core/theme/app_theme.dart'; import 'package:flutter/material.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -12,6 +13,7 @@ part 'app_config.g.dart'; /// /// - [branding]: user-facing identity (name, theme seed). /// - [engine]: Eigen server and app-host values the framework needs. +/// - [replica]: how much the device keeps of what it has synced. /// /// Keeping each concern as its own value object is what stops this from /// decaying into a junk drawer of unrelated flags. A consuming app reads its @@ -20,13 +22,40 @@ part 'app_config.g.dart'; /// built. @immutable class AppConfig { - const AppConfig({required this.branding, required this.engine}); + const AppConfig({ + required this.branding, + required this.engine, + this.replica = const ReplicaConfig(), + }); /// User-facing identity: app name and theme seed color. final Branding branding; /// Backend and integration values the framework needs at runtime. final EngineConfig engine; + + /// What the device replica keeps (decision 0013). + final ReplicaConfig replica; +} + +/// What the device replica keeps of what it has synced (decision 0013). +@immutable +class ReplicaConfig { + const ReplicaConfig({this.keptReplays = defaultKeptReplays}) + : assert(keptReplays >= 0, 'keptReplays cannot be negative'); + + /// How many ended online games keep their replay on the device, the most + /// recently opened first. A replay beyond it is fetched again when opened. + /// + /// Nothing else is bounded by it: games still in play, and games played on + /// the device, keep every frame. In a browser where drift stores the replica + /// in IndexedDB, the whole replica is held in memory while the app is open, + /// so a game whose replays are large may keep fewer there: + /// + /// ```dart + /// replica: ReplicaConfig(keptReplays: kIsWeb ? 50 : defaultKeptReplays), + /// ``` + final int keptReplays; } /// Runtime configuration the framework needs to talk to its backends. diff --git a/flutter/lib/core/connectivity/connectivity_provider.dart b/flutter/lib/core/connectivity/connectivity_provider.dart index 74f845ca..78a0cc05 100644 --- a/flutter/lib/core/connectivity/connectivity_provider.dart +++ b/flutter/lib/core/connectivity/connectivity_provider.dart @@ -1,20 +1,48 @@ +import 'dart:async'; + import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'connectivity_provider.g.dart'; -/// Emits the current connectivity state whenever the network changes. +/// The device's connectivity: what it is now, then every change. +/// +/// Reflects network interface availability, not internet reachability: a +/// connected Wi-Fi with no route to the internet does not report +/// [ConnectivityResult.none]. /// -/// Note: reflects network interface availability, not necessarily internet -/// reachability (e.g. a connected Wi-Fi with no route to the internet will -/// not report [ConnectivityResult.none]). +/// The current state is read explicitly because the change stream does not +/// promise one. A browser reports only `online` and `offline` events, so an app +/// opened with no network would otherwise believe itself online until the +/// network came and went again. A change that arrives before that read answers +/// is newer, and the read is then dropped. @riverpod -Stream> connectivity(Ref ref) => - Connectivity().onConnectivityChanged; +Stream> connectivity(Ref ref) { + final connectivity = Connectivity(); + final results = StreamController>(); + var changed = false; + void fail(Object error, StackTrace stackTrace) { + if (!results.isClosed) results.addError(error, stackTrace); + } + + final changes = connectivity.onConnectivityChanged.listen((result) { + changed = true; + results.add(result); + }, onError: fail); + connectivity.checkConnectivity().then((current) { + if (!changed && !results.isClosed) results.add(current); + }, onError: fail); + ref.onDispose(() async { + await changes.cancel(); + await results.close(); + }); + return results.stream; +} /// True when every connectivity result is [ConnectivityResult.none]. /// -/// Returns false during the brief loading window before the first event. +/// Returns false during the brief loading window before the current state is +/// known. @riverpod bool isOffline(Ref ref) { final results = ref.watch(connectivityProvider).whenOrNull(data: (v) => v); diff --git a/flutter/lib/core/connectivity/connectivity_provider.g.dart b/flutter/lib/core/connectivity/connectivity_provider.g.dart index 8e5dcdb2..57485aee 100644 --- a/flutter/lib/core/connectivity/connectivity_provider.g.dart +++ b/flutter/lib/core/connectivity/connectivity_provider.g.dart @@ -8,20 +8,32 @@ part of 'connectivity_provider.dart'; // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint, type=warning -/// Emits the current connectivity state whenever the network changes. +/// The device's connectivity: what it is now, then every change. /// -/// Note: reflects network interface availability, not necessarily internet -/// reachability (e.g. a connected Wi-Fi with no route to the internet will -/// not report [ConnectivityResult.none]). +/// Reflects network interface availability, not internet reachability: a +/// connected Wi-Fi with no route to the internet does not report +/// [ConnectivityResult.none]. +/// +/// The current state is read explicitly because the change stream does not +/// promise one. A browser reports only `online` and `offline` events, so an app +/// opened with no network would otherwise believe itself online until the +/// network came and went again. A change that arrives before that read answers +/// is newer, and the read is then dropped. @ProviderFor(connectivity) final connectivityProvider = ConnectivityProvider._(); -/// Emits the current connectivity state whenever the network changes. +/// The device's connectivity: what it is now, then every change. +/// +/// Reflects network interface availability, not internet reachability: a +/// connected Wi-Fi with no route to the internet does not report +/// [ConnectivityResult.none]. /// -/// Note: reflects network interface availability, not necessarily internet -/// reachability (e.g. a connected Wi-Fi with no route to the internet will -/// not report [ConnectivityResult.none]). +/// The current state is read explicitly because the change stream does not +/// promise one. A browser reports only `online` and `offline` events, so an app +/// opened with no network would otherwise believe itself online until the +/// network came and went again. A change that arrives before that read answers +/// is newer, and the read is then dropped. final class ConnectivityProvider extends @@ -33,11 +45,17 @@ final class ConnectivityProvider with $FutureModifier>, $StreamProvider> { - /// Emits the current connectivity state whenever the network changes. + /// The device's connectivity: what it is now, then every change. + /// + /// Reflects network interface availability, not internet reachability: a + /// connected Wi-Fi with no route to the internet does not report + /// [ConnectivityResult.none]. /// - /// Note: reflects network interface availability, not necessarily internet - /// reachability (e.g. a connected Wi-Fi with no route to the internet will - /// not report [ConnectivityResult.none]). + /// The current state is read explicitly because the change stream does not + /// promise one. A browser reports only `online` and `offline` events, so an app + /// opened with no network would otherwise believe itself online until the + /// network came and went again. A change that arrives before that read answers + /// is newer, and the read is then dropped. ConnectivityProvider._() : super( from: null, @@ -64,24 +82,27 @@ final class ConnectivityProvider } } -String _$connectivityHash() => r'59a63c90973f1e1b35f3d22e08aa91406cbfa045'; +String _$connectivityHash() => r'a7214eba57e1ba87a1c8e29132c3204b7b5f0bb2'; /// True when every connectivity result is [ConnectivityResult.none]. /// -/// Returns false during the brief loading window before the first event. +/// Returns false during the brief loading window before the current state is +/// known. @ProviderFor(isOffline) final isOfflineProvider = IsOfflineProvider._(); /// True when every connectivity result is [ConnectivityResult.none]. /// -/// Returns false during the brief loading window before the first event. +/// Returns false during the brief loading window before the current state is +/// known. final class IsOfflineProvider extends $FunctionalProvider with $Provider { /// True when every connectivity result is [ConnectivityResult.none]. /// - /// Returns false during the brief loading window before the first event. + /// Returns false during the brief loading window before the current state is + /// known. IsOfflineProvider._() : super( from: null, diff --git a/flutter/lib/core/errors/error_messages.dart b/flutter/lib/core/errors/error_messages.dart index d79df05d..9c5876ee 100644 --- a/flutter/lib/core/errors/error_messages.dart +++ b/flutter/lib/core/errors/error_messages.dart @@ -1,5 +1,6 @@ import 'package:dio/dio.dart'; import 'package:eigen_client/eigen_client.dart'; +import 'package:eigen_flutter/features/auth/domain/auth_gateway.dart'; /// Converts a raw exception into a message suitable for display in a snackbar /// or inline form error. @@ -16,6 +17,9 @@ String humanize(Object e) => switch (e) { // No response at all: engineCall only converts failures that carried one, so // any DioException reaching here is a genuine transport failure. DioException() => _offline, + AuthWindowBlockedException() => + 'Your browser blocked the sign-in window. Allow pop-ups for this site, ' + 'then try again.', _ => _unexpected, }; diff --git a/flutter/lib/core/notifications/notification_provider.dart b/flutter/lib/core/notifications/notification_provider.dart index 00343666..697254d8 100644 --- a/flutter/lib/core/notifications/notification_provider.dart +++ b/flutter/lib/core/notifications/notification_provider.dart @@ -35,8 +35,8 @@ NotificationService notificationService(Ref ref) => /// Current app-facing notification permission and capability state. /// /// Auto-disposes so it is re-fetched on demand. Invalidate this provider -/// in [AppLifecycleListener.onResume] so the Settings screen reflects any -/// changes the user made in system Settings while the app was backgrounded. +/// in [AppLifecycleListener.onShow] so the Settings screen reflects any +/// changes the user made in system Settings while the app was out of view. @riverpod Future notificationPermissionStatus(Ref ref) => ref.watch(notificationServiceProvider).permissionState(); diff --git a/flutter/lib/core/notifications/notification_provider.g.dart b/flutter/lib/core/notifications/notification_provider.g.dart index 6d38f3de..449de017 100644 --- a/flutter/lib/core/notifications/notification_provider.g.dart +++ b/flutter/lib/core/notifications/notification_provider.g.dart @@ -64,8 +64,8 @@ String _$notificationServiceHash() => /// Current app-facing notification permission and capability state. /// /// Auto-disposes so it is re-fetched on demand. Invalidate this provider -/// in [AppLifecycleListener.onResume] so the Settings screen reflects any -/// changes the user made in system Settings while the app was backgrounded. +/// in [AppLifecycleListener.onShow] so the Settings screen reflects any +/// changes the user made in system Settings while the app was out of view. @ProviderFor(notificationPermissionStatus) final notificationPermissionStatusProvider = @@ -74,8 +74,8 @@ final notificationPermissionStatusProvider = /// Current app-facing notification permission and capability state. /// /// Auto-disposes so it is re-fetched on demand. Invalidate this provider -/// in [AppLifecycleListener.onResume] so the Settings screen reflects any -/// changes the user made in system Settings while the app was backgrounded. +/// in [AppLifecycleListener.onShow] so the Settings screen reflects any +/// changes the user made in system Settings while the app was out of view. final class NotificationPermissionStatusProvider extends @@ -90,8 +90,8 @@ final class NotificationPermissionStatusProvider /// Current app-facing notification permission and capability state. /// /// Auto-disposes so it is re-fetched on demand. Invalidate this provider - /// in [AppLifecycleListener.onResume] so the Settings screen reflects any - /// changes the user made in system Settings while the app was backgrounded. + /// in [AppLifecycleListener.onShow] so the Settings screen reflects any + /// changes the user made in system Settings while the app was out of view. NotificationPermissionStatusProvider._() : super( from: null, diff --git a/flutter/lib/core/replica/answering_watch.dart b/flutter/lib/core/replica/answering_watch.dart new file mode 100644 index 00000000..1600277d --- /dev/null +++ b/flutter/lib/core/replica/answering_watch.dart @@ -0,0 +1,111 @@ +import 'dart:async'; + +import 'package:drift/drift.dart'; + +/// How long one statement may go unanswered before the replica is reported as +/// not answering. +/// +/// Well beyond any statement the replica runs, which are local and take +/// milliseconds, so reaching it means something has stopped rather than slowed. +const defaultAnswerTimeout = Duration(seconds: 20); + +/// Watches whether the database still answers at all (decision 0014). +/// +/// A browser may terminate the worker hosting the replica -- Chrome for Android +/// does when the app has been in the background -- and nothing tells the page. +/// There is no event for it: drift's own channel documents that a worker or tab +/// going away is not something a channel can observe. The statement simply +/// never answers, so lists keep showing what they last read and writes wait +/// forever. +/// +/// So this times statements instead. It reports the database as not answering +/// once one has gone unanswered for [timeout], and as answering again the +/// moment any statement completes, whether it succeeded or failed: what matters +/// is that something came back. Opening is deliberately not timed, because +/// loading a large replica out of IndexedDB can take a while and means nothing +/// is wrong. +/// +/// Nothing here recovers anything. Reopening the database is the app's to +/// offer, and a reload is what does it. +final class AnsweringWatch extends QueryInterceptor { + AnsweringWatch({this.timeout = defaultAnswerTimeout}); + + /// How long one statement may go unanswered. + final Duration timeout; + + final _changes = StreamController.broadcast(); + var _answering = true; + + /// Whether the database is answering, as it changes. + Stream get answering => _changes.stream; + + /// Whether the database is answering as of now. + bool get isAnswering => _answering; + + Future _timed(Future Function() statement) async { + final overdue = Timer(timeout, () => _report(answering: false)); + try { + return await statement(); + } finally { + overdue.cancel(); + _report(answering: true); + } + } + + void _report({required bool answering}) { + if (_answering == answering || _changes.isClosed) return; + _answering = answering; + _changes.add(answering); + } + + @override + Future runCustom( + QueryExecutor executor, + String statement, + List args, + ) => _timed(() => executor.runCustom(statement, args)); + + @override + Future runInsert( + QueryExecutor executor, + String statement, + List args, + ) => _timed(() => executor.runInsert(statement, args)); + + @override + Future runUpdate( + QueryExecutor executor, + String statement, + List args, + ) => _timed(() => executor.runUpdate(statement, args)); + + @override + Future runDelete( + QueryExecutor executor, + String statement, + List args, + ) => _timed(() => executor.runDelete(statement, args)); + + @override + Future>> runSelect( + QueryExecutor executor, + String statement, + List args, + ) => _timed(() => executor.runSelect(statement, args)); + + @override + Future runBatched( + QueryExecutor executor, + BatchedStatements statements, + ) => _timed(() => executor.runBatched(statements)); + + @override + Future commitTransaction(TransactionExecutor inner) => + _timed(inner.send); + + @override + Future close(QueryExecutor inner) async { + await inner.close(); + await _changes.close(); + } +} diff --git a/flutter/lib/core/replica/replica_host.dart b/flutter/lib/core/replica/replica_host.dart index 4540c576..ed89e296 100644 --- a/flutter/lib/core/replica/replica_host.dart +++ b/flutter/lib/core/replica/replica_host.dart @@ -13,30 +13,81 @@ enum ReplicaStorage { /// and offers no local play, whose games would be lost. ephemeral, - /// Another tab of this app holds the database in a browser whose only - /// persistent storage is unsafe to share between tabs. This tab opens - /// nothing, and says the app is open elsewhere. + /// Another tab of this app holds the database, in a browser whose storage + /// for it is unsafe to share between tabs. This tab opens nothing until that + /// tab closes. heldElsewhere, } +/// Whether the browser keeps this site's storage when it runs short of space. +enum StoragePersistence { + /// Kept: always so on a device, and in a browser that has granted it. + granted, + + /// Not granted yet. Asking may show the player the browser's own prompt, so + /// the app explains what it is for before it asks. + askable, + + /// The browser will not keep it, because the player or the browser itself + /// refused. Asking again shows nothing. + refused, +} + /// The replica database as this platform opens it, and the few platform -/// capabilities that differ between a device and a browser (decision 0013). +/// capabilities that differ between a device and a browser (decisions 0013 and +/// 0014). +/// +/// Opening a host is what decides its storage, so a host is only ever handed +/// out already knowing it. abstract interface class ReplicaHost { /// The connection to open [ReplicaDatabase] over, or null when this tab may /// not open one ([ReplicaStorage.heldElsewhere]). QueryExecutor? get executor; - /// What the opened storage turned out to be. Completes once the database has - /// actually opened, which a browser decides only then. - Future get storage; + /// What this host's storage is. + ReplicaStorage get storage; + + /// Completes once a tab held elsewhere may open the replica, which is when + /// the tab holding it closes. Opening again then succeeds. Already complete + /// for every other host. + Future get available; - /// Runs [body] while holding [name], so two tabs of the app never run it at - /// once. Immediate on native, which has one process. + /// Runs [body] while holding [name], so no other body under that name runs + /// at the same time, in this process or in another tab of the app. Future exclusively(String name, Future Function() body); - /// Asks the browser not to evict this site's storage under pressure. The - /// replica itself re-syncs if evicted; what cannot be recovered is a local - /// game not yet uploaded, so this is asked when one is first created. A - /// no-op on native. - Future requestPersistence(); + /// Whether the database answers, as it changes. + /// + /// A browser may terminate the worker holding the replica without telling the + /// page, and a statement then never answers (decision 0014). False means the + /// app should offer a reload, which opens everything again. Always true on a + /// device, whose database is in this process. + Stream get answering; + + /// Whether the browser keeps this site's storage under pressure. + /// + /// The replica itself re-syncs if it is evicted; what cannot be recovered is + /// a local game not yet uploaded. Always [StoragePersistence.granted] on a + /// device, which evicts nothing. + Future persistence(); + + /// Asks the browser to keep this site's storage, and answers what it decided. + /// + /// Some browsers ask the player, so this belongs behind an explanation and a + /// deliberate action, never a startup call. + Future requestPersistence(); +} + +/// Named locks that only this process takes: each body under a name starts +/// once the last one under it has ended. What [ReplicaHost.exclusively] needs +/// where there is only one process to exclude. +final class ProcessLocks { + final _tails = >{}; + + /// Runs [body] once every earlier body under [name] has ended. + Future exclusively(String name, Future Function() body) { + final next = (_tails[name] ?? Future.value()).then((_) => body()); + _tails[name] = next.then((_) {}, onError: (Object _) {}); + return next; + } } diff --git a/flutter/lib/core/replica/replica_host_io.dart b/flutter/lib/core/replica/replica_host_io.dart index a632f45b..261ec89a 100644 --- a/flutter/lib/core/replica/replica_host_io.dart +++ b/flutter/lib/core/replica/replica_host_io.dart @@ -14,11 +14,24 @@ final class _FileReplicaHost implements ReplicaHost { final QueryExecutor executor; @override - Future get storage async => ReplicaStorage.persistent; + ReplicaStorage get storage => ReplicaStorage.persistent; @override - Future exclusively(String name, Future Function() body) => body(); + Future get available => Future.value(); + + final _locks = ProcessLocks(); + + @override + Future exclusively(String name, Future Function() body) => + _locks.exclusively(name, body); + + @override + Stream get answering => Stream.value(true); + + @override + Future persistence() async => StoragePersistence.granted; @override - Future requestPersistence() async {} + Future requestPersistence() async => + StoragePersistence.granted; } diff --git a/flutter/lib/core/replica/replica_host_web.dart b/flutter/lib/core/replica/replica_host_web.dart index 39f764b9..9fb69d7c 100644 --- a/flutter/lib/core/replica/replica_host_web.dart +++ b/flutter/lib/core/replica/replica_host_web.dart @@ -1,68 +1,191 @@ import 'dart:async'; import 'dart:js_interop'; -import 'dart:js_interop_unsafe'; import 'package:drift/drift.dart'; -import 'package:drift_flutter/drift_flutter.dart'; +import 'package:drift/wasm.dart'; import 'package:web/web.dart' as web; +import 'answering_watch.dart'; import 'replica_host.dart'; -/// Opens the replica in the browser. +/// Where drift's web runtime is served from: this package's own web assets. +const _runtime = 'assets/packages/eigen_flutter/assets/drift'; + +/// Opens the replica in the browser (decision 0014). /// -/// The shell cannot send the cross-origin isolation headers, because they break -/// the sign-in popup, so drift chooses among storage that needs shared workers -/// to be safe across tabs and IndexedDB without them, which drift documents as -/// unsafe for more than one tab. So without shared workers this tab first takes -/// an exclusive lock on the database for its whole lifetime, and a second tab -/// that cannot get it opens nothing. +/// Storage is chosen before anything opens, because whether this tab may open +/// the database at all depends on which storage it is. The shell cannot send +/// the cross-origin isolation headers, which break the sign-in popup, so a +/// browser offers some of: storage one shared worker hosts for every tab +/// (`opfsShared`, `sharedIndexedDb`), IndexedDB in this tab's own worker +/// (`unsafeIndexedDb`), and memory. Drift prefers them in that order, and so +/// does this. The middle one is unsafe the moment two tabs write it, so under +/// it this tab opens the database only while holding the database's tab lock, +/// and a tab that finds it held waits for it rather than opening. Future openReplicaHost({required String name}) async { - if (!web.window.has('SharedWorker') && !await _holdForever('$name-tab')) { - return _BrowserReplicaHost( - null, - Future.value(ReplicaStorage.heldElsewhere), + final probe = await WasmDatabase.probe( + sqlite3Uri: _asset('sqlite3.wasm'), + driftWorkerUri: _asset('drift_worker.js'), + databaseName: name, + ); + // Drift's enum lists its storages most reliable first, and memory, the last, + // is always available. + final storage = probe.availableStorages.reduce( + (best, next) => next.index < best.index ? next : best, + ); + final tabLock = '$name-tab'; + if (storage == WasmStorageImplementation.unsafeIndexedDb && + !await _TabLocks.take(tabLock)) { + return _BrowserReplicaHost.heldElsewhere(_TabLocks.wait(tabLock)); + } + var connection = await probe.open(storage, name); + if (storage.storageApi == WebStorageApi.indexedDb) { + connection = connection.interceptWith( + _PersistToIndexedDb(connection.executor), ); } - final chosen = Completer(); - final executor = driftDatabase( - name: name, - web: DriftWebOptions( - sqlite3Wasm: Uri.parse('sqlite3.wasm'), - driftWorker: Uri.parse('drift_worker.js'), - onResult: (result) => chosen.complete( - result.chosenImplementation == WasmStorageImplementation.inMemory - ? ReplicaStorage.ephemeral - : ReplicaStorage.persistent, - ), - ), + // Outermost, so it times everything the database is asked, the line above + // included. + final watch = AnsweringWatch(); + return _BrowserReplicaHost( + connection.interceptWith(watch), + storage == WasmStorageImplementation.inMemory + ? ReplicaStorage.ephemeral + : ReplicaStorage.persistent, + watch, ); - return _BrowserReplicaHost(executor, chosen.future); } -/// Takes [name] and never lets it go, answering whether it was free. The lock -/// is released only when the tab closes. -Future _holdForever(String name) { - final granted = Completer(); - web.window.navigator.locks.request( - name, - web.LockOptions(ifAvailable: true), - ((web.Lock? lock) { - granted.complete(lock != null); - // A promise that never settles is what holds the lock for the tab's life. - return lock == null ? null : Completer().future.toJS; - }).toJS, - ); - return granted.future; +/// Makes what the database writes durable in IndexedDB. Temporary: remove once +/// `eigen_flutter` is on a drift release carrying simolus3/drift#3865 (see +/// docs/blockers.md, "Drift does not persist IndexedDB transactions"). +/// +/// Drift's IndexedDB storage holds writes in memory and saves them only after a +/// statement run outside a transaction. In drift 2.35.0 neither of the two +/// writes that matter most is followed by one: +/// +/// - A transaction's `COMMIT` still counts as inside the transaction, so nothing +/// it wrote is saved until some later, unrelated statement. Nearly every write +/// the replica makes is a transaction, including a local game's moves, which +/// exist nowhere else until uploaded. +/// - Opening a database writes its schema version last, after every migration +/// statement. Lost, it makes every later open fail creating tables that exist. +/// +/// A tab that closes in between loses them. So after each outermost commit, and +/// once after opening, this runs one statement outside any transaction, which +/// is what makes drift save. A nested transaction is left alone: its writes are +/// saved with its outermost one, and the root cannot run a statement while that +/// is still open. +final class _PersistToIndexedDb extends QueryInterceptor { + _PersistToIndexedDb(this._root); + + /// The connection's own executor, outside every transaction. + final QueryExecutor _root; + + final _outermost = {}; + Future? _opened; + + @override + Future ensureOpen( + QueryExecutor executor, + QueryExecutorUser user, + ) async { + final opened = await executor.ensureOpen(user); + if (identical(executor, _root)) { + try { + await (_opened ??= _save()); + } on Object { + _opened = null; + rethrow; + } + } + return opened; + } + + @override + TransactionExecutor beginTransaction(QueryExecutor parent) { + final transaction = parent.beginTransaction(); + if (identical(parent, _root)) _outermost.add(transaction); + return transaction; + } + + @override + Future commitTransaction(TransactionExecutor inner) async { + // Only once the commit succeeded: drift may retry a failed one. + await inner.send(); + if (_outermost.remove(inner)) await _save(); + } + + @override + Future rollbackTransaction(TransactionExecutor inner) { + _outermost.remove(inner); + return inner.rollback(); + } + + /// Any statement outside a transaction makes drift save what it holds; this + /// one reads nothing. + Future _save() => _root.runCustom('SELECT 1'); +} + +Uri _asset(String file) => + Uri.parse(web.document.baseURI).resolve('$_runtime/$file'); + +/// Locks this tab takes for the rest of its life: released only when it closes. +abstract final class _TabLocks { + static final _held = {}; + + /// Takes [name] if it is free, answering whether this tab now holds it. + static Future take(String name) async => + _held.contains(name) || await _request(name, ifAvailable: true); + + /// Completes once this tab holds [name], however long another tab keeps it. + static Future wait(String name) => + _request(name, ifAvailable: false).then((_) {}); + + static Future _request(String name, {required bool ifAvailable}) { + final granted = Completer(); + web.window.navigator.locks.request( + name, + web.LockOptions(ifAvailable: ifAvailable), + ((web.Lock? lock) { + if (lock == null) { + granted.complete(false); + return null; + } + _held.add(name); + granted.complete(true); + // A promise that never settles is what holds the lock for the tab's + // life. + return Completer().future.toJS; + }).toJS, + ); + return granted.future; + } } final class _BrowserReplicaHost implements ReplicaHost { - _BrowserReplicaHost(this.executor, this.storage); + _BrowserReplicaHost(QueryExecutor this.executor, this.storage, this._watch) + : available = Future.value(); + + _BrowserReplicaHost.heldElsewhere(this.available) + : executor = null, + storage = ReplicaStorage.heldElsewhere, + _watch = null; + + /// Null for a tab that opened nothing: it has no database to answer it. + final AnsweringWatch? _watch; + + @override + Stream get answering => _watch?.answering ?? Stream.value(true); @override final QueryExecutor? executor; @override - final Future storage; + final ReplicaStorage storage; + + @override + final Future available; @override Future exclusively(String name, Future Function() body) async { @@ -72,7 +195,26 @@ final class _BrowserReplicaHost implements ReplicaHost { } @override - Future requestPersistence() async { - await web.window.navigator.storage.persist().toDart; + Future persistence() async { + final storage = web.window.navigator.storage; + if ((await storage.persisted().toDart).toDart) { + return StoragePersistence.granted; + } + try { + final status = await web.window.navigator.permissions + .query({'name': 'persistent-storage'}.jsify()! as JSObject) + .toDart; + if (status.state == 'denied') return StoragePersistence.refused; + } on Object { + // A browser that does not name this permission decides for itself, and + // asking it costs the player nothing. + } + return StoragePersistence.askable; } + + @override + Future requestPersistence() async => + (await web.window.navigator.storage.persist().toDart).toDart + ? StoragePersistence.granted + : StoragePersistence.refused; } diff --git a/flutter/lib/core/replica/replica_providers.dart b/flutter/lib/core/replica/replica_providers.dart index 122acb73..e04cfd12 100644 --- a/flutter/lib/core/replica/replica_providers.dart +++ b/flutter/lib/core/replica/replica_providers.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:eigen_client/eigen_client.dart'; import 'package:eigen_flutter/core/replica/replica_host.dart'; import 'package:eigen_flutter/features/auth/providers/auth_providers.dart'; @@ -10,10 +12,22 @@ const replicaDatabaseName = 'eigen_replica'; /// The platform's replica host: how this device or browser opens the database. /// +/// A browser tab that finds another tab holding the database opens nothing, +/// and opens again by itself once that tab closes. +/// /// A test overrides this with a host over an in-memory database. @Riverpod(keepAlive: true) -Future replicaHost(Ref ref) => - openReplicaHost(name: replicaDatabaseName); +Future replicaHost(Ref ref) async { + final host = await openReplicaHost(name: replicaDatabaseName); + if (host.storage == ReplicaStorage.heldElsewhere) { + unawaited( + host.available.then((_) { + if (ref.mounted) ref.invalidateSelf(); + }), + ); + } + return host; +} /// The device's replica database (decision 0013). One connection for the /// session. @@ -29,20 +43,23 @@ Future replicaDatabase(Ref ref) async { return database; } -/// What the replica's storage turned out to be once opened. +/// Whether the replica answers (decision 0014). /// -/// Reading it opens the database, because a browser only decides its storage -/// when it opens one. +/// False where the browser has taken the worker holding the database away +/// without telling the page: nothing the app reads or writes will complete, and +/// only reopening, which a reload does, recovers it. @Riverpod(keepAlive: true) -Future replicaStorage(Ref ref) async { +Stream replicaAnswering(Ref ref) async* { final host = await ref.watch(replicaHostProvider.future); - if (host.executor == null) return ReplicaStorage.heldElsewhere; - final database = await ref.watch(replicaDatabaseProvider.future); - // Any statement opens the connection; this one reads nothing. - await database.customSelect('SELECT 1').get(); - return host.storage; + yield true; + yield* host.answering; } +/// What the replica's storage is on this device or in this tab. +@Riverpod(keepAlive: true) +Future replicaStorage(Ref ref) async => + (await ref.watch(replicaHostProvider.future)).storage; + /// The replica's public reference data: identities, bots, ratings. @Riverpod(keepAlive: true) Future publicReplica(Ref ref) async => @@ -64,8 +81,8 @@ Future accountReplica(Ref ref) async { Future localGameStorage(Ref ref) async => LocalGameStorage(await ref.watch(replicaDatabaseProvider.future)); -/// This browser tab may not open the replica: another tab of the app holds it, -/// in a browser where sharing it between tabs is unsafe. +/// This browser tab may not open the replica yet: another tab of the app holds +/// it, in a browser where sharing it between tabs is unsafe. final class ReplicaUnavailableException implements Exception { const ReplicaUnavailableException(); diff --git a/flutter/lib/core/replica/replica_providers.g.dart b/flutter/lib/core/replica/replica_providers.g.dart index e503c4ee..06b9353e 100644 --- a/flutter/lib/core/replica/replica_providers.g.dart +++ b/flutter/lib/core/replica/replica_providers.g.dart @@ -10,6 +10,9 @@ part of 'replica_providers.dart'; // ignore_for_file: type=lint, type=warning /// The platform's replica host: how this device or browser opens the database. /// +/// A browser tab that finds another tab holding the database opens nothing, +/// and opens again by itself once that tab closes. +/// /// A test overrides this with a host over an in-memory database. @ProviderFor(replicaHost) @@ -17,6 +20,9 @@ final replicaHostProvider = ReplicaHostProvider._(); /// The platform's replica host: how this device or browser opens the database. /// +/// A browser tab that finds another tab holding the database opens nothing, +/// and opens again by itself once that tab closes. +/// /// A test overrides this with a host over an in-memory database. final class ReplicaHostProvider @@ -29,6 +35,9 @@ final class ReplicaHostProvider with $FutureModifier, $FutureProvider { /// The platform's replica host: how this device or browser opens the database. /// + /// A browser tab that finds another tab holding the database opens nothing, + /// and opens again by itself once that tab closes. + /// /// A test overrides this with a host over an in-memory database. ReplicaHostProvider._() : super( @@ -56,7 +65,7 @@ final class ReplicaHostProvider } } -String _$replicaHostHash() => r'85d2c117296bebaff717d2e5c2fecea02a024121'; +String _$replicaHostHash() => r'26be17e7ccbb88edcbaccdcae8455f8c40c2382c'; /// The device's replica database (decision 0013). One connection for the /// session. @@ -114,18 +123,62 @@ final class ReplicaDatabaseProvider String _$replicaDatabaseHash() => r'6f5b5807d733499e987f467c0d15fee73d6e6814'; -/// What the replica's storage turned out to be once opened. +/// Whether the replica answers (decision 0014). /// -/// Reading it opens the database, because a browser only decides its storage -/// when it opens one. +/// False where the browser has taken the worker holding the database away +/// without telling the page: nothing the app reads or writes will complete, and +/// only reopening, which a reload does, recovers it. + +@ProviderFor(replicaAnswering) +final replicaAnsweringProvider = ReplicaAnsweringProvider._(); + +/// Whether the replica answers (decision 0014). +/// +/// False where the browser has taken the worker holding the database away +/// without telling the page: nothing the app reads or writes will complete, and +/// only reopening, which a reload does, recovers it. + +final class ReplicaAnsweringProvider + extends $FunctionalProvider, bool, Stream> + with $FutureModifier, $StreamProvider { + /// Whether the replica answers (decision 0014). + /// + /// False where the browser has taken the worker holding the database away + /// without telling the page: nothing the app reads or writes will complete, and + /// only reopening, which a reload does, recovers it. + ReplicaAnsweringProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'replicaAnsweringProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$replicaAnsweringHash(); + + @$internal + @override + $StreamProviderElement $createElement($ProviderPointer pointer) => + $StreamProviderElement(pointer); + + @override + Stream create(Ref ref) { + return replicaAnswering(ref); + } +} + +String _$replicaAnsweringHash() => r'4ac1abbf814efd1067888c0cba50c2346442347c'; + +/// What the replica's storage is on this device or in this tab. @ProviderFor(replicaStorage) final replicaStorageProvider = ReplicaStorageProvider._(); -/// What the replica's storage turned out to be once opened. -/// -/// Reading it opens the database, because a browser only decides its storage -/// when it opens one. +/// What the replica's storage is on this device or in this tab. final class ReplicaStorageProvider extends @@ -135,10 +188,7 @@ final class ReplicaStorageProvider FutureOr > with $FutureModifier, $FutureProvider { - /// What the replica's storage turned out to be once opened. - /// - /// Reading it opens the database, because a browser only decides its storage - /// when it opens one. + /// What the replica's storage is on this device or in this tab. ReplicaStorageProvider._() : super( from: null, @@ -165,7 +215,7 @@ final class ReplicaStorageProvider } } -String _$replicaStorageHash() => r'1ae7549495f54b6c47b7fda5aada73872d95faa4'; +String _$replicaStorageHash() => r'78da2fe08471136f15df4991bc2f053498cbd547'; /// The replica's public reference data: identities, bots, ratings. diff --git a/flutter/lib/eigen_flutter.dart b/flutter/lib/eigen_flutter.dart index 7989c8e7..6061f48a 100644 --- a/flutter/lib/eigen_flutter.dart +++ b/flutter/lib/eigen_flutter.dart @@ -38,7 +38,7 @@ export 'package:eigen_client/eigen_client.dart'; export 'composition.dart' show EigenFlutterScope; export 'core/config/app_config.dart' - show AppConfig, Branding, EngineConfig, appConfigProvider; + show AppConfig, Branding, EngineConfig, ReplicaConfig, appConfigProvider; export 'core/game/game_module.dart'; export 'features/auth/domain/auth_gateway.dart'; export 'features/auth/domain/auth_user.dart'; diff --git a/flutter/lib/features/auth/domain/auth_gateway.dart b/flutter/lib/features/auth/domain/auth_gateway.dart index 08a5df5d..06953d0a 100644 --- a/flutter/lib/features/auth/domain/auth_gateway.dart +++ b/flutter/lib/features/auth/domain/auth_gateway.dart @@ -1,7 +1,40 @@ import 'package:eigen_flutter/features/auth/domain/auth_user.dart'; +/// How a sign-in the player started ended, when it did not fail. +enum AuthSignInResult { + /// The player is signed in. + signedIn, + + /// The player closed or dismissed the provider's sign-in before finishing. + /// Nothing changed, and there is nothing to report. + cancelled, +} + /// Result of trying to turn a guest session into a Google-backed account. -enum AuthUpgradeResult { linked, existingAccount } +enum AuthUpgradeResult { + /// The Google identity now belongs to the guest's own account. + linked, + + /// The Google identity already belongs to another account; switching to it + /// needs the player's confirmation. + existingAccount, + + /// The player dismissed the provider's sign-in. The guest is unchanged. + cancelled, +} + +/// The provider's sign-in could not open its window: in a browser, a pop-up +/// blocker refused it. +/// +/// Unlike a cancellation this is not the player's choice, and unlike most +/// failures they can fix it themselves, so it is its own type for the app to +/// explain. +final class AuthWindowBlockedException implements Exception { + const AuthWindowBlockedException(); + + @override + String toString() => 'The sign-in window was blocked.'; +} /// Authentication required by the Flutter presentation package. /// @@ -12,10 +45,10 @@ enum AuthUpgradeResult { linked, existingAccount } abstract interface class AuthGateway { AuthUser? get currentUser; Stream get authStateChanges; - Future signInWithGoogle(); + Future signInWithGoogle(); Future signInAnonymously(); Future upgradeWithGoogle(); - Future switchToExistingGoogleAccount(); + Future switchToExistingGoogleAccount(); void cancelExistingAccountSwitch(); Future signOut(); } @@ -42,7 +75,7 @@ final class UnavailableAuthGateway implements AuthGateway { ); @override - Future signInWithGoogle() async => _missing(); + Future signInWithGoogle() async => _missing(); @override Future signInAnonymously() async => _missing(); @@ -51,7 +84,7 @@ final class UnavailableAuthGateway implements AuthGateway { Future upgradeWithGoogle() async => _missing(); @override - Future switchToExistingGoogleAccount() async => _missing(); + Future switchToExistingGoogleAccount() async => _missing(); @override void cancelExistingAccountSwitch() {} diff --git a/flutter/lib/features/game/providers/keep_local_games.dart b/flutter/lib/features/game/providers/keep_local_games.dart new file mode 100644 index 00000000..9e25b36d --- /dev/null +++ b/flutter/lib/features/game/providers/keep_local_games.dart @@ -0,0 +1,60 @@ +import 'package:eigen_flutter/core/replica/replica_host.dart'; +import 'package:eigen_flutter/core/replica/replica_providers.dart'; +import 'package:eigen_flutter/core/storage/shared_preferences_provider.dart'; +import 'package:eigen_flutter/features/auth/providers/auth_providers.dart'; +import 'package:eigen_flutter/features/game/providers/game_providers.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'keep_local_games.g.dart'; + +/// Whether this app has already offered to keep local games, whatever the +/// answer was. Asking twice is asking too often. +const _offeredKey = 'eigen.storage_persistence_offered'; + +/// Offering to have the browser keep this device's games (decision 0014). +/// +/// A browser may clear a site's storage when it runs short of space. Replicated +/// rows come back with the next sync; a game played on this device and not yet +/// uploaded does not, so it is worth asking the browser to keep them. Some +/// browsers ask the player in turn, which is why this is an offer the app +/// explains rather than a call at startup, and why it is made once. +/// +/// [build] answers whether to make the offer: only where the browser has not +/// already granted or refused, where it has not been made before, and while the +/// account holds a game this device has not uploaded. Always false on a device, +/// which evicts nothing. +@riverpod +class KeepLocalGames extends _$KeepLocalGames { + @override + Future build() async { + final userId = ref.watch(currentUserIdProvider); + if (userId == null) return false; + final host = await ref.watch(replicaHostProvider.future); + if (await host.persistence() != StoragePersistence.askable) return false; + final preferences = await ref.watch(sharedPreferencesProvider.future); + if (preferences.getBool(_offeredKey) ?? false) return false; + // Re-read as games come and go: the offer belongs with a game at stake. + ref.watch(activeGamesProvider); + final storage = await ref.watch(localGameStorageProvider.future); + return (await storage.unsynced(userId)).isNotEmpty; + } + + /// Asks the browser to keep this site's storage, and answers what it decided. + Future keep() async { + final host = await ref.read(replicaHostProvider.future); + // Before anything that could outlast the tap: a browser that asks the + // player will only do so while the tap still counts as one. + final decision = await host.requestPersistence(); + await _offered(); + return decision; + } + + /// Leaves the storage as it is, and does not offer again. + Future dismiss() => _offered(); + + Future _offered() async { + final preferences = await ref.read(sharedPreferencesProvider.future); + await preferences.setBool(_offeredKey, true); + ref.invalidateSelf(); + } +} diff --git a/flutter/lib/features/game/providers/keep_local_games.g.dart b/flutter/lib/features/game/providers/keep_local_games.g.dart new file mode 100644 index 00000000..43cf19c5 --- /dev/null +++ b/flutter/lib/features/game/providers/keep_local_games.g.dart @@ -0,0 +1,103 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'keep_local_games.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning +/// Offering to have the browser keep this device's games (decision 0014). +/// +/// A browser may clear a site's storage when it runs short of space. Replicated +/// rows come back with the next sync; a game played on this device and not yet +/// uploaded does not, so it is worth asking the browser to keep them. Some +/// browsers ask the player in turn, which is why this is an offer the app +/// explains rather than a call at startup, and why it is made once. +/// +/// [build] answers whether to make the offer: only where the browser has not +/// already granted or refused, where it has not been made before, and while the +/// account holds a game this device has not uploaded. Always false on a device, +/// which evicts nothing. + +@ProviderFor(KeepLocalGames) +final keepLocalGamesProvider = KeepLocalGamesProvider._(); + +/// Offering to have the browser keep this device's games (decision 0014). +/// +/// A browser may clear a site's storage when it runs short of space. Replicated +/// rows come back with the next sync; a game played on this device and not yet +/// uploaded does not, so it is worth asking the browser to keep them. Some +/// browsers ask the player in turn, which is why this is an offer the app +/// explains rather than a call at startup, and why it is made once. +/// +/// [build] answers whether to make the offer: only where the browser has not +/// already granted or refused, where it has not been made before, and while the +/// account holds a game this device has not uploaded. Always false on a device, +/// which evicts nothing. +final class KeepLocalGamesProvider + extends $AsyncNotifierProvider { + /// Offering to have the browser keep this device's games (decision 0014). + /// + /// A browser may clear a site's storage when it runs short of space. Replicated + /// rows come back with the next sync; a game played on this device and not yet + /// uploaded does not, so it is worth asking the browser to keep them. Some + /// browsers ask the player in turn, which is why this is an offer the app + /// explains rather than a call at startup, and why it is made once. + /// + /// [build] answers whether to make the offer: only where the browser has not + /// already granted or refused, where it has not been made before, and while the + /// account holds a game this device has not uploaded. Always false on a device, + /// which evicts nothing. + KeepLocalGamesProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'keepLocalGamesProvider', + isAutoDispose: true, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$keepLocalGamesHash(); + + @$internal + @override + KeepLocalGames create() => KeepLocalGames(); +} + +String _$keepLocalGamesHash() => r'a2c3059af1f74c4c2ade27b72f9a7b73be174306'; + +/// Offering to have the browser keep this device's games (decision 0014). +/// +/// A browser may clear a site's storage when it runs short of space. Replicated +/// rows come back with the next sync; a game played on this device and not yet +/// uploaded does not, so it is worth asking the browser to keep them. Some +/// browsers ask the player in turn, which is why this is an offer the app +/// explains rather than a call at startup, and why it is made once. +/// +/// [build] answers whether to make the offer: only where the browser has not +/// already granted or refused, where it has not been made before, and while the +/// account holds a game this device has not uploaded. Always false on a device, +/// which evicts nothing. + +abstract class _$KeepLocalGames extends $AsyncNotifier { + FutureOr build(); + @$mustCallSuper + @override + WhenComplete runBuild() { + final ref = this.ref as $Ref, bool>; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier, bool>, + AsyncValue, + Object?, + Object? + >; + return element.handleCreate(ref, build); + } +} diff --git a/flutter/lib/features/game/providers/local_game_providers.dart b/flutter/lib/features/game/providers/local_game_providers.dart index 6437ca72..106b0ddd 100644 --- a/flutter/lib/features/game/providers/local_game_providers.dart +++ b/flutter/lib/features/game/providers/local_game_providers.dart @@ -282,13 +282,9 @@ createLocalGame(Ref ref) { botRunner: ref.read(botRunnerProvider), ); await engine.close(); - // A browser may evict site storage under pressure, and a local game not yet - // uploaded is the one thing a sync cannot bring back. - unawaited( - ref.read(replicaHostProvider.future).then((host) { - return host.requestPersistence(); - }), - ); + // Nothing asks the browser to keep its storage here: some browsers ask the + // player, and a prompt arriving as a game starts explains nothing. That is + // `KeepLocalGames`, which offers it once a game is actually at stake. return engine.game.id; }; } diff --git a/flutter/lib/features/game/providers/local_game_providers.g.dart b/flutter/lib/features/game/providers/local_game_providers.g.dart index fed6d34d..07113bf4 100644 --- a/flutter/lib/features/game/providers/local_game_providers.g.dart +++ b/flutter/lib/features/game/providers/local_game_providers.g.dart @@ -608,7 +608,7 @@ final class CreateLocalGameProvider } } -String _$createLocalGameHash() => r'19ced586ece86d3af675ca428717baab332f50c4'; +String _$createLocalGameHash() => r'f6dd6e07b1e325eb3b798dee310f4a18116404bb'; /// How to command one game, resolved once from where it is played. diff --git a/flutter/lib/features/sync/providers/sync_providers.dart b/flutter/lib/features/sync/providers/sync_providers.dart index 58a43dfc..ee404fe5 100644 --- a/flutter/lib/features/sync/providers/sync_providers.dart +++ b/flutter/lib/features/sync/providers/sync_providers.dart @@ -3,6 +3,7 @@ import 'dart:developer' as developer; import 'package:eigen_client/eigen_client.dart'; import 'package:eigen_flutter/core/api/engine_api_providers.dart'; +import 'package:eigen_flutter/core/config/app_config.dart'; import 'package:eigen_flutter/core/connectivity/connectivity_provider.dart'; import 'package:eigen_flutter/core/notifications/notification_provider.dart'; import 'package:eigen_flutter/core/replica/replica_providers.dart'; @@ -16,6 +17,7 @@ part 'sync_providers.g.dart'; Future syncPass(Ref ref) async { final replica = await ref.watch(accountReplicaProvider.future); if (replica == null) return null; + final host = await ref.watch(replicaHostProvider.future); final client = ref.watch(engineClientProvider); return SyncPass( replica: replica, @@ -27,6 +29,10 @@ Future syncPass(Ref ref) async { games: client.games, userId: replica.accountId, ), + // Two tabs of the app in one browser share one database, so their passes + // take one lock, and a pass one tab ran answers the other's requests too. + lock: (body) => host.exclusively('eigen-sync', body), + keptReplays: ref.watch(appConfigProvider).replica.keptReplays, ); } @@ -37,9 +43,10 @@ typedef SyncStatus = ({bool running, SyncReport? last}); /// /// The reasons are events, never a timer: somebody signs in, the device /// regains connectivity, a push arrives while the app is open, and a local game -/// finishes. An app also calls [run] on resume and on pull-to-refresh; resume -/// is the application's lifecycle to observe, which is why it is not wired -/// here. +/// finishes. An app also calls [run] when the player comes back to it and on +/// pull-to-refresh; coming back is the application's lifecycle to observe, +/// which is why it is not wired here. However many reasons arrive together, the +/// pass itself runs once for them (decision 0014). /// /// Nothing here blocks a screen: every screen reads the replica, and a pass /// only changes what it shows. @@ -61,23 +68,25 @@ class SyncCoordinator extends _$SyncCoordinator { return (running: false, last: null); } - /// Runs a pass, or joins the one already running, and answers with its - /// report; null when nobody is signed in, or when no pass could start. + /// Requests currently waiting on or running a pass. + var _requests = 0; + + /// Brings the replica up to date for a reason arising now, and answers with + /// the report of the pass that ran for it; null when nobody is signed in, when + /// no pass could start, or when a pass run for an earlier request, here or in + /// another tab, already covered this one. /// /// Never throws: every caller is a trigger that has nothing to do with a /// failure but try again later, and the replica still holds what the last good - /// pass wrote. Two tabs of the app in one browser share one database, so a - /// pass runs under a lock only one of them can hold at a time. + /// pass wrote. Future run() async { + _requests++; if (ref.mounted) state = (running: true, last: state.last); SyncReport? report; try { final pass = await ref.read(syncPassProvider.future); if (pass == null) return null; - final host = await ref.read(replicaHostProvider.future); - await host.exclusively('eigen-sync', () async { - report = await pass.run(); - }); + report = await pass.run(); if (report?.error case final error?) { developer.log('Sync pass could not pull', name: 'sync', error: error); } @@ -91,7 +100,10 @@ class SyncCoordinator extends _$SyncCoordinator { ); return null; } finally { - if (ref.mounted) state = (running: false, last: report ?? state.last); + _requests--; + if (ref.mounted) { + state = (running: _requests > 0, last: report ?? state.last); + } } } diff --git a/flutter/lib/features/sync/providers/sync_providers.g.dart b/flutter/lib/features/sync/providers/sync_providers.g.dart index d71c8f20..1aac4b1f 100644 --- a/flutter/lib/features/sync/providers/sync_providers.g.dart +++ b/flutter/lib/features/sync/providers/sync_providers.g.dart @@ -49,15 +49,16 @@ final class SyncPassProvider } } -String _$syncPassHash() => r'c9000b81972020dccaf7b06167cef2b902583450'; +String _$syncPassHash() => r'341b64cbb30b10a12b5d99d2c8968ddd8bf20860'; /// Runs the account's sync pass whenever there is reason to (decision 0013). /// /// The reasons are events, never a timer: somebody signs in, the device /// regains connectivity, a push arrives while the app is open, and a local game -/// finishes. An app also calls [run] on resume and on pull-to-refresh; resume -/// is the application's lifecycle to observe, which is why it is not wired -/// here. +/// finishes. An app also calls [run] when the player comes back to it and on +/// pull-to-refresh; coming back is the application's lifecycle to observe, +/// which is why it is not wired here. However many reasons arrive together, the +/// pass itself runs once for them (decision 0014). /// /// Nothing here blocks a screen: every screen reads the replica, and a pass /// only changes what it shows. @@ -69,9 +70,10 @@ final syncCoordinatorProvider = SyncCoordinatorProvider._(); /// /// The reasons are events, never a timer: somebody signs in, the device /// regains connectivity, a push arrives while the app is open, and a local game -/// finishes. An app also calls [run] on resume and on pull-to-refresh; resume -/// is the application's lifecycle to observe, which is why it is not wired -/// here. +/// finishes. An app also calls [run] when the player comes back to it and on +/// pull-to-refresh; coming back is the application's lifecycle to observe, +/// which is why it is not wired here. However many reasons arrive together, the +/// pass itself runs once for them (decision 0014). /// /// Nothing here blocks a screen: every screen reads the replica, and a pass /// only changes what it shows. @@ -81,9 +83,10 @@ final class SyncCoordinatorProvider /// /// The reasons are events, never a timer: somebody signs in, the device /// regains connectivity, a push arrives while the app is open, and a local game - /// finishes. An app also calls [run] on resume and on pull-to-refresh; resume - /// is the application's lifecycle to observe, which is why it is not wired - /// here. + /// finishes. An app also calls [run] when the player comes back to it and on + /// pull-to-refresh; coming back is the application's lifecycle to observe, + /// which is why it is not wired here. However many reasons arrive together, the + /// pass itself runs once for them (decision 0014). /// /// Nothing here blocks a screen: every screen reads the replica, and a pass /// only changes what it shows. @@ -114,15 +117,16 @@ final class SyncCoordinatorProvider } } -String _$syncCoordinatorHash() => r'f3f48ab1501cee2a3814a96fecca3a7c37f58a59'; +String _$syncCoordinatorHash() => r'885eb8fe3f215402f75ad15d90e8ef1de6c9c7cb'; /// Runs the account's sync pass whenever there is reason to (decision 0013). /// /// The reasons are events, never a timer: somebody signs in, the device /// regains connectivity, a push arrives while the app is open, and a local game -/// finishes. An app also calls [run] on resume and on pull-to-refresh; resume -/// is the application's lifecycle to observe, which is why it is not wired -/// here. +/// finishes. An app also calls [run] when the player comes back to it and on +/// pull-to-refresh; coming back is the application's lifecycle to observe, +/// which is why it is not wired here. However many reasons arrive together, the +/// pass itself runs once for them (decision 0014). /// /// Nothing here blocks a screen: every screen reads the replica, and a pass /// only changes what it shows. diff --git a/flutter/lib/shared/widgets/status_banner.dart b/flutter/lib/shared/widgets/status_banner.dart index f70a2e5b..4d3e2eac 100644 --- a/flutter/lib/shared/widgets/status_banner.dart +++ b/flutter/lib/shared/widgets/status_banner.dart @@ -11,6 +11,7 @@ class StatusBanner extends StatelessWidget { required this.label, required this.backgroundColor, required this.foregroundColor, + this.trailing, }); final Widget leading; @@ -18,6 +19,10 @@ class StatusBanner extends StatelessWidget { final Color backgroundColor; final Color foregroundColor; + /// An action the banner offers, at its end. A banner that only reports + /// something has none. + final Widget? trailing; + @override Widget build(BuildContext context) { return Semantics( @@ -33,11 +38,17 @@ class StatusBanner extends StatelessWidget { children: [ leading, const SizedBox(width: 10), - Text( - label, - style: Theme.of(context).textTheme.bodySmall - ?.copyWith(color: foregroundColor), + Expanded( + child: Text( + label, + style: Theme.of(context).textTheme.bodySmall + ?.copyWith(color: foregroundColor), + ), ), + if (trailing case final action?) ...[ + const SizedBox(width: 8), + action, + ], ], ), ), diff --git a/flutter/lib/shell_support.dart b/flutter/lib/shell_support.dart index f3251861..5b006144 100644 --- a/flutter/lib/shell_support.dart +++ b/flutter/lib/shell_support.dart @@ -20,7 +20,7 @@ export 'core/navigation/navigation_ports.dart'; export 'core/notifications/notification_provider.dart'; export 'core/notifications/notification_service.dart'; export 'core/storage/shared_preferences_provider.dart'; -export 'core/replica/replica_host.dart' show ReplicaStorage; +export 'core/replica/replica_host.dart' show ReplicaStorage, StoragePersistence; export 'core/replica/replica_providers.dart'; export 'core/theme/app_semantic_colors.dart'; export 'core/theme/app_theme.dart'; @@ -37,6 +37,7 @@ export 'features/commerce/providers/commerce_providers.dart'; export 'features/game/presentation/widgets/timer_builders.dart'; export 'features/game/providers/game_frame_provider.dart'; export 'features/game/providers/game_providers.dart'; +export 'features/game/providers/keep_local_games.dart'; export 'features/game/providers/local_game_providers.dart'; export 'features/game/utils/bot_compatibility.dart'; export 'features/game/utils/game_timing.dart'; diff --git a/flutter/lib/testing/memory_replica_host.dart b/flutter/lib/testing/memory_replica_host.dart index 013126fc..d7406992 100644 --- a/flutter/lib/testing/memory_replica_host.dart +++ b/flutter/lib/testing/memory_replica_host.dart @@ -11,7 +11,10 @@ import 'package:eigen_flutter/core/replica/replica_host.dart'; /// replicaHostProvider.overrideWith((ref) async => MemoryReplicaHost()), /// ``` final class MemoryReplicaHost implements ReplicaHost { - MemoryReplicaHost({this.storageMode = ReplicaStorage.persistent}) { + MemoryReplicaHost({ + this.storageMode = ReplicaStorage.persistent, + this.persistenceMode = StoragePersistence.granted, + }) { // A test opens a database per case on purpose. driftRuntimeOptions.dontWarnAboutMultipleDatabases = true; } @@ -20,15 +23,39 @@ final class MemoryReplicaHost implements ReplicaHost { /// nothing. final ReplicaStorage storageMode; + /// What [persistence] reports, so a test can stand in for a browser that has + /// not been asked to keep this site's storage. + final StoragePersistence persistenceMode; + + /// Whether [requestPersistence] was called. + var persistenceRequested = false; + @override final QueryExecutor executor = NativeDatabase.memory(); @override - Future get storage async => storageMode; + ReplicaStorage get storage => storageMode; + + @override + Future get available => Future.value(); + + final _locks = ProcessLocks(); + + @override + Future exclusively(String name, Future Function() body) => + _locks.exclusively(name, body); @override - Future exclusively(String name, Future Function() body) => body(); + Stream get answering => Stream.value(true); @override - Future requestPersistence() async {} + Future persistence() async => persistenceMode; + + @override + Future requestPersistence() async { + persistenceRequested = true; + return persistenceMode == StoragePersistence.askable + ? StoragePersistence.granted + : persistenceMode; + } } diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index e73e0961..98230006 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -34,6 +34,15 @@ dependencies: shared_preferences: ^2.5.4 cached_network_image: ^4.0.0 connectivity_plus: ^7.1.1 + # `assets/drift/` carries this release's web worker and SQLite module. Drift + # supports a newer client with an older worker within a major version, so the + # range is an ordinary caret; raising its floor means replacing both files + # from the matching drift release, since fixes to web storage live in the + # worker. + # + # Tracking: the first release carrying simolus3/drift#3865 (IndexedDB + # transactions are saved) lets `_PersistToIndexedDb` in + # lib/core/replica/replica_host_web.dart go. See docs/blockers.md. drift: ^2.35.0 drift_flutter: ^0.3.1 # The generated REST client. It is produced and published by the ENGINE repo @@ -70,6 +79,9 @@ dev_dependencies: freezed: 4.0.1 checks: ^0.3.1 eigen_codegen: ^0.1.0 + # A fake connectivity platform, so a test can start the app with no network. + connectivity_plus_platform_interface: ^2.1.0 + plugin_platform_interface: ^2.1.8 flutter: uses-material-design: true @@ -77,6 +89,12 @@ flutter: assets: - fonts/OFL-Inter.txt - fonts/OFL-SpaceGrotesk.txt + # Drift's web runtime, served from the app's own origin. Web only: a device + # opens SQLite natively and has no use for either file. + - path: assets/drift/sqlite3.wasm + platforms: [web] + - path: assets/drift/drift_worker.js + platforms: [web] # Both faces are bundled as package fonts, so a consuming app gets them # automatically and they render offline from the first frame with no runtime diff --git a/flutter/test/core/connectivity/connectivity_provider_test.dart b/flutter/test/core/connectivity/connectivity_provider_test.dart new file mode 100644 index 00000000..fda09c24 --- /dev/null +++ b/flutter/test/core/connectivity/connectivity_provider_test.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:checks/checks.dart'; +import 'package:connectivity_plus_platform_interface/connectivity_plus_platform_interface.dart'; +import 'package:eigen_flutter/core/connectivity/connectivity_provider.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +/// A platform that, like a browser, reports changes and never the state it +/// starts in. +final class _ChangesOnlyPlatform extends ConnectivityPlatform + with MockPlatformInterfaceMixin { + _ChangesOnlyPlatform(this.current); + + final Future> current; + final changes = StreamController>.broadcast(); + + @override + Future> checkConnectivity() => current; + + @override + Stream> get onConnectivityChanged => changes.stream; +} + +void main() { + late ConnectivityPlatform original; + + setUp(() => original = ConnectivityPlatform.instance); + tearDown(() => ConnectivityPlatform.instance = original); + + test('an app opened with no network is offline before any change', () async { + ConnectivityPlatform.instance = _ChangesOnlyPlatform( + Future.value(const [ConnectivityResult.none]), + ); + final container = ProviderContainer.test(); + container.listen(isOfflineProvider, (_, _) {}); + + await container.read(connectivityProvider.future); + + check(container.read(isOfflineProvider)).isTrue(); + }); + + test('a change that arrives before the current state is read wins', () async { + final current = Completer>(); + final platform = _ChangesOnlyPlatform(current.future); + ConnectivityPlatform.instance = platform; + final container = ProviderContainer.test(); + container.listen(isOfflineProvider, (_, _) {}); + await pumpEventQueue(); + + platform.changes.add(const [ConnectivityResult.wifi]); + current.complete(const [ConnectivityResult.none]); + await pumpEventQueue(); + + check(container.read(isOfflineProvider)).isFalse(); + }); +} diff --git a/flutter/test/core/replica/answering_watch_test.dart b/flutter/test/core/replica/answering_watch_test.dart new file mode 100644 index 00000000..65d4b890 --- /dev/null +++ b/flutter/test/core/replica/answering_watch_test.dart @@ -0,0 +1,123 @@ +import 'dart:async'; + +import 'package:checks/checks.dart'; +import 'package:drift/backends.dart'; +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:eigen_flutter/core/replica/answering_watch.dart'; +import 'package:flutter_test/flutter_test.dart'; + +/// A database whose statements answer only when a test lets them, standing in +/// for a worker the browser has taken away. +class _HeldDatabase extends DelegatedDatabase { + _HeldDatabase(this.gate) : super(_HeldDelegate(gate)); + + final Completer gate; +} + +class _HeldDelegate extends DatabaseDelegate { + _HeldDelegate(this.gate); + + final Completer gate; + + @override + late final DbVersionDelegate versionDelegate = const NoVersionDelegate(); + + @override + TransactionDelegate get transactionDelegate => const NoTransactionDelegate(); + + @override + bool get isOpen => true; + + @override + Future open(QueryExecutorUser user) async {} + + @override + Future close() async {} + + @override + Future runBatched(BatchedStatements statements) => gate.future; + + @override + Future runCustom(String statement, List args) => gate.future; + + @override + Future runInsert(String statement, List args) async { + await gate.future; + return 0; + } + + @override + Future runSelect(String statement, List args) async { + await gate.future; + return QueryResult.fromRows(const []); + } + + @override + Future runUpdate(String statement, List args) async { + await gate.future; + return 0; + } +} + +/// The database opening; drift refuses statements before it. +class _User extends QueryExecutorUser { + @override + int get schemaVersion => 1; + + @override + Future beforeOpen( + QueryExecutor executor, + OpeningDetails details, + ) async {} +} + +void main() { + const timeout = Duration(milliseconds: 30); + + test('a statement that never answers reports the replica stopped', () async { + final watch = AnsweringWatch(timeout: timeout); + final gate = Completer(); + final executor = _HeldDatabase(gate).interceptWith(watch); + await executor.ensureOpen(_User()); + final reported = []; + watch.answering.listen(reported.add); + + unawaited(executor.runSelect('SELECT 1', const [])); + await Future.delayed(timeout * 3); + + check(watch.isAnswering).isFalse(); + check(reported).deepEquals([false]); + }); + + test('an answer, however late, says it is back', () async { + final watch = AnsweringWatch(timeout: timeout); + final gate = Completer(); + final executor = _HeldDatabase(gate).interceptWith(watch); + await executor.ensureOpen(_User()); + final reported = []; + watch.answering.listen(reported.add); + + final statement = executor.runSelect('SELECT 1', const []); + await Future.delayed(timeout * 3); + gate.complete(); + await statement; + await pumpEventQueue(); + + check(watch.isAnswering).isTrue(); + check(reported).deepEquals([false, true]); + }); + + test('a statement answering in time reports nothing at all', () async { + final watch = AnsweringWatch(timeout: timeout); + final database = NativeDatabase.memory().interceptWith(watch); + await database.ensureOpen(_User()); + final reported = []; + watch.answering.listen(reported.add); + + await database.runCustom('CREATE TABLE rows (x INTEGER)', const []); + + check(watch.isAnswering).isTrue(); + check(reported).isEmpty(); + }); +} diff --git a/flutter/test/features/game/providers/keep_local_games_test.dart b/flutter/test/features/game/providers/keep_local_games_test.dart new file mode 100644 index 00000000..670b71a1 --- /dev/null +++ b/flutter/test/features/game/providers/keep_local_games_test.dart @@ -0,0 +1,118 @@ +import 'package:checks/checks.dart'; +import 'package:eigen_client/eigen_client.dart'; +import 'package:eigen_flutter/core/replica/replica_host.dart'; +import 'package:eigen_flutter/core/replica/replica_providers.dart'; +import 'package:eigen_flutter/features/auth/providers/auth_providers.dart'; +import 'package:eigen_flutter/features/game/providers/keep_local_games.dart'; +import 'package:eigen_flutter/testing/memory_replica_host.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../../../core/local/counter_local_game.dart'; +import '../../../helpers/container.dart'; + +const _me = 'user-a'; + +Bot _bot() => Bot( + id: 'counter-bot', + username: 'counter-bot', + displayName: 'Counter', + avatarUrl: null, + schemaVersion: 1, + type: BotType.local, + ratedEligible: false, + config: {}, + tier: 'standard', +); + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late MemoryReplicaHost host; + + ProviderContainer containerFor({ + StoragePersistence persistence = StoragePersistence.askable, + }) { + host = MemoryReplicaHost(persistenceMode: persistence); + final container = makeContainer( + overrides: [ + replicaHostProvider.overrideWith((ref) async => host), + currentUserIdProvider.overrideWithValue(_me), + ], + ); + // The card watches it; without a listener it is disposed mid-read. + container.listen(keepLocalGamesProvider, (_, _) {}); + return container; + } + + /// A game played on this device that the server does not hold yet. + Future seedLocalGame(ProviderContainer container) async { + final storage = await container.read(localGameStorageProvider.future); + final engine = await LocalGameEngine.create( + userId: _me, + schemaVersion: 1, + config: const {'target': 4}, + botIds: const ['counter-bot'], + bots: {'counter-bot': _bot()}, + rules: const CounterLocalRules(), + storage: storage, + ); + addTearDown(engine.close); + } + + setUp(() => SharedPreferences.setMockInitialValues({})); + + test('offers while a game is on this device alone', () async { + final container = containerFor(); + await seedLocalGame(container); + + check(await container.read(keepLocalGamesProvider.future)).isTrue(); + }); + + test('says nothing until a game is at stake', () async { + final container = containerFor(); + + check(await container.read(keepLocalGamesProvider.future)).isFalse(); + }); + + test('says nothing where storage is already kept, as on a device', () async { + final container = containerFor(persistence: StoragePersistence.granted); + await seedLocalGame(container); + + check(await container.read(keepLocalGamesProvider.future)).isFalse(); + check(host.persistenceRequested).isFalse(); + }); + + test('says nothing where the browser has refused', () async { + final container = containerFor(persistence: StoragePersistence.refused); + await seedLocalGame(container); + + check(await container.read(keepLocalGamesProvider.future)).isFalse(); + }); + + test('asks the browser once, and does not offer again', () async { + final container = containerFor(); + await seedLocalGame(container); + check(await container.read(keepLocalGamesProvider.future)).isTrue(); + + final decision = await container + .read(keepLocalGamesProvider.notifier) + .keep(); + + check(decision).equals(StoragePersistence.granted); + check(host.persistenceRequested).isTrue(); + check(await container.read(keepLocalGamesProvider.future)).isFalse(); + }); + + test('a declined offer is not made again', () async { + final container = containerFor(); + await seedLocalGame(container); + check(await container.read(keepLocalGamesProvider.future)).isTrue(); + + await container.read(keepLocalGamesProvider.notifier).dismiss(); + + check(await container.read(keepLocalGamesProvider.future)).isFalse(); + check(host.persistenceRequested).isFalse(); + }); +} diff --git a/package.json b/package.json index 66bfaac3..3c5308a2 100644 --- a/package.json +++ b/package.json @@ -9,5 +9,8 @@ "check:web": "./tool/check.sh web", "contracts:check": "node tool/check-contracts.mjs", "dart-releases:check": "node tool/check-dart-releases.mjs" + }, + "devDependencies": { + "workbox-cli": "7.4.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b60ae17..db0d4eea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,4 +6,4655 @@ settings: importers: - .: {} + .: + devDependencies: + workbox-cli: + specifier: 7.4.1 + version: 7.4.1(supports-color@7.2.0) + +packages: + + '@apideck/better-ajv-errors@0.3.7': + resolution: {integrity: sha512-TajUJwGWbDwkCx/CZi7tRE8PVB7simCvKJfHUsSdvps+aTM/PDPP4gkLmKnc+x3CE//y9i/nj74GqdL/hwk7Iw==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.29.8': + resolution: {integrity: sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.29.8': + resolution: {integrity: sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.29.8': + resolution: {integrity: sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.29.7': + resolution: {integrity: sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.3': + resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} + engines: {node: '>=12'} + + '@rollup/plugin-babel@6.1.0': + resolution: {integrity: sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@1.0.0': + resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.63.3': + resolution: {integrity: sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.63.3': + resolution: {integrity: sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.63.3': + resolution: {integrity: sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.63.3': + resolution: {integrity: sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.63.3': + resolution: {integrity: sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.63.3': + resolution: {integrity: sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.63.3': + resolution: {integrity: sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.63.3': + resolution: {integrity: sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.63.3': + resolution: {integrity: sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.63.3': + resolution: {integrity: sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.63.3': + resolution: {integrity: sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.63.3': + resolution: {integrity: sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.63.3': + resolution: {integrity: sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.63.3': + resolution: {integrity: sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.63.3': + resolution: {integrity: sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.63.3': + resolution: {integrity: sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.63.3': + resolution: {integrity: sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.63.3': + resolution: {integrity: sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.63.3': + resolution: {integrity: sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.63.3': + resolution: {integrity: sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.63.3': + resolution: {integrity: sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.63.3': + resolution: {integrity: sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.63.3': + resolution: {integrity: sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.63.3': + resolution: {integrity: sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.63.3': + resolution: {integrity: sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==} + cpu: [x64] + os: [win32] + + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': + resolution: {integrity: sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==} + engines: {node: '>=12'} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomically@2.1.1: + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.11.24: + resolution: {integrity: sha512-hYrgxie335U08WqICoGqKRzV1HFXv6zdxwJE4ekCb80CM9a0SVVsN4QPwT67RraRo+9h8IATk6uxHJw7QSkdOg==} + engines: {node: '>=6.0.0'} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} + + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.29.0: + resolution: {integrity: sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-js-compat@3.50.0: + resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} + engines: {node: '>=6.4.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.429: + resolution: {integrity: sha512-/1ENIE3cx4HTIx4IfPZFaOunJmsrSVTnj6coXoRVbiJUbkeTyFkJvBeWGkdgh08OhFbxYLMT1kbkwFVSarq6Ow==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@4.6.0: + resolution: {integrity: sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==} + engines: {node: '>=20'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + ky@1.14.3: + resolution: {integrity: sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==} + engines: {node: '>=18'} + + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + meow@7.1.1: + resolution: {integrity: sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==} + engines: {node: '>=10'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + node-releases@2.0.55: + resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==} + engines: {node: '>=18'} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} + engines: {node: '>=12.20'} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} + hasBin: true + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + rollup@4.63.3: + resolution: {integrity: sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@7.1.1: + resolution: {integrity: sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==} + engines: {node: '>=20.0.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + smob@1.6.2: + resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==} + engines: {node: '>=20.0.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.matchall@4.1.0: + resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + + terser@5.51.2: + resolution: {integrity: sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==} + engines: {node: '>=10'} + hasBin: true + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + workbox-background-sync@7.4.1: + resolution: {integrity: sha512-HhT7KE8tOWDm02wRNshXUnUPofMlhenF2DBdUnDPOubhizzPeItkYTmAB6td1Z2cjYPa98vzEiPLEuzn5hN66g==} + + workbox-broadcast-update@7.4.1: + resolution: {integrity: sha512-uAlgslKLvbQY+suirIdnBCSYrcgBhjp81Nj4l1lj/Jmj0MJO2CJERnCJjT0GFVwmReV0N+zs78K6gqd5gr9/+A==} + + workbox-build@7.4.1: + resolution: {integrity: sha512-SDhxIvEAde9Gy/5w4Yo1Jh/M49Z0qE3q0oteyE8zGq0DScxFqVBcCtIXFuLtmtxRQZCMbf0prco4VyEu3KBQuw==} + engines: {node: '>=20.0.0'} + + workbox-cacheable-response@7.4.1: + resolution: {integrity: sha512-8xaFoJdDc2OjrlbbL3gEeBO1WKcMwRqwLRupgqahYXu75yXajPLuwrbXMrIGZuWYXrQwk0xDjOxZ/ujCy/oJYw==} + + workbox-cli@7.4.1: + resolution: {integrity: sha512-ssOp3t5AQ4i9ZpoClekisv+RT3iSqsR++5GDlarGvn59Agz1io2O3ssJ//W90OIuLL526Uhsdepwk1tQdqKtKw==} + engines: {node: '>=20.0.0'} + hasBin: true + + workbox-core@7.4.1: + resolution: {integrity: sha512-DT+vu46eh/2vRsSHTY4Xmc32Z1rr9PRlQUXr1Dx30ZuXRWwOsvZgGgcwxcasubQLQmbTNYZjv44LkBAQ4tT5tQ==} + + workbox-expiration@7.4.1: + resolution: {integrity: sha512-lRKUF7b+OGbeXkQk1s6MHXOa3d7Xxf7Of31W6c6hCfipfIyrtdWZ89stq21AHZMaoG7VNFoHply4Ox+rU31TWg==} + + workbox-google-analytics@7.4.1: + resolution: {integrity: sha512-Mks1JwLEt++ZAkF6sS1OpSh9RtAMIsiDgRpK+codiHGIPXeaUOgi4cPc3GFadUl8V5QPeypEk8Oxgl3HlwVzHw==} + + workbox-navigation-preload@7.4.1: + resolution: {integrity: sha512-C4KVsjPcYKJOhr631AxR9XoG2rLF3QiTk5aMv36MXOjtWvm8axwNFAtKUPGsWUwLXXAMgYM1En7fsvndaXeXRQ==} + + workbox-precaching@7.4.1: + resolution: {integrity: sha512-cdr/9qByww7yzEp7zg/qI4ukUrrNjQLgN+ONQRpjy/VqGQXwkgHwr00KksGJK8v0VifwDXBb8a4cWNZH71jn3Q==} + + workbox-range-requests@7.4.1: + resolution: {integrity: sha512-7i2oxAUE82gHdAJBCAQ04JzNOdRPqzuOzGfoUyJpFSmeqBNYGPrAH8GPoPjUQTfp+NycwrD2H68VtuF8qxv0vQ==} + + workbox-recipes@7.4.1: + resolution: {integrity: sha512-gnbVfmV4/TtmQaM4x9AtuXhcdstJsep3XMVeztOrQVPT+R6+6DeBjGTCQ7fFCXm+4GEHUA5VEBTyi5+4gWGeog==} + + workbox-routing@7.4.1: + resolution: {integrity: sha512-yubJGErZOusuidAenaL5ypfhQOa7urxP/f8E0ws7FPb4039RiWXUWBAyUkmUoOL/BcQGen3h0J8872d51IYxtA==} + + workbox-strategies@7.4.1: + resolution: {integrity: sha512-GZxpaw9NbmOelj7667uZ2kpk5BFpOGbO4X0qjwh5ls8XQ8C+Lha5LQchTiUzsTFSS+NlUpftYAyOVXvQUrcqOQ==} + + workbox-streams@7.4.1: + resolution: {integrity: sha512-HWWtraKUbJknd9kgqGcpQ3G114HOPYvqs8HaJMDs2ebLNAimDkVDaWfAXE6Ybl+m8U6KsCE6pWyLYuigWmnAXw==} + + workbox-sw@7.4.1: + resolution: {integrity: sha512-fez5f2DUlDJWTFYkCWQpY10N8gtztd849NswCbVFk0QlcSM4HT5A8x4g4ii650yem4I8tHY0R7JZahwp3ltIPw==} + + workbox-window@7.4.1: + resolution: {integrity: sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + +snapshots: + + '@apideck/better-ajv-errors@0.3.7(ajv@8.20.0)': + dependencies: + ajv: 8.20.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@7.2.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.29.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@7.2.0) + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@7.2.0) + '@babel/traverse': 7.29.8(supports-color@7.2.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + debug: 4.4.3(supports-color@7.2.0) + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7(supports-color@7.2.0) + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@7.2.0) + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@7.2.0) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 + + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-regenerator@7.29.8(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-spread@7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-modules-systemjs': 7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-spread': 7.29.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7(supports-color@7.2.0)) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + core-js-compat: 3.50.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7(supports-color@7.2.0))': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.8 + esutils: 2.0.3 + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8(supports-color@7.2.0)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@isaacs/cliui@9.0.0': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.3': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@rollup/plugin-babel@6.1.0(@babel/core@7.29.7(supports-color@7.2.0))(rollup@4.63.3)(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) + '@rollup/pluginutils': 5.4.0(rollup@4.63.3) + optionalDependencies: + rollup: 4.63.3 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.63.3)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.63.3) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.12 + optionalDependencies: + rollup: 4.63.3 + + '@rollup/plugin-replace@6.0.3(rollup@4.63.3)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.63.3) + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.63.3 + + '@rollup/plugin-terser@1.0.0(rollup@4.63.3)': + dependencies: + serialize-javascript: 7.1.1 + smob: 1.6.2 + terser: 5.51.2 + optionalDependencies: + rollup: 4.63.3 + + '@rollup/pluginutils@5.4.0(rollup@4.63.3)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.7 + optionalDependencies: + rollup: 4.63.3 + + '@rollup/rollup-android-arm-eabi@4.63.3': + optional: true + + '@rollup/rollup-android-arm64@4.63.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.63.3': + optional: true + + '@rollup/rollup-darwin-x64@4.63.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.63.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.63.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.63.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.63.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.63.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.63.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.63.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.63.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.63.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.63.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.63.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.63.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.63.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.63.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.63.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.63.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.63.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.63.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.63.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.63.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.63.3': + optional: true + + '@trickfilm400/rollup-plugin-off-main-thread@3.0.0-pre1': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.30.21 + string.prototype.matchall: 4.1.0 + + '@types/estree@1.0.9': {} + + '@types/minimist@1.2.5': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/resolve@1.20.2': {} + + '@types/trusted-types@2.0.7': {} + + acorn@8.18.0: {} + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.3.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + arrify@1.0.1: {} + + async-function@1.0.0: {} + + async@3.2.6: {} + + at-least-node@1.0.0: {} + + atomically@2.1.1: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0): + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0): + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + core-js-compat: 3.50.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0): + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.11.24: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@2.1.7: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.29.0: + dependencies: + baseline-browser-mapping: 2.11.24 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.429 + node-releases: 2.0.55 + update-browserslist-db: 1.3.3(browserslist@4.29.0) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + camelcase@8.0.0: {} + + caniuse-lite@1.0.30001810: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cli-boxes@3.0.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-width@3.0.0: {} + + clone@1.0.4: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@2.20.3: {} + + common-tags@1.8.2: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@7.1.0: + dependencies: + atomically: 2.1.1 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + + convert-source-map@2.0.0: {} + + core-js-compat@3.50.0: + dependencies: + browserslist: 4.29.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@2.0.0: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.3(supports-color@7.2.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-to-chromium@1.5.429: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-to-primitive@1.3.4: + dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-goat@4.0.0: {} + + escape-string-regexp@1.0.5: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + eta@4.6.0: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-uri@3.1.8: {} + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.6 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + hard-rejection@2.1.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + idb@7.1.1: {} + + ieee754@1.2.1: {} + + indent-string@4.0.0: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + inquirer@7.3.3: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.18.1 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ci@1.0.0: {} + + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + + is-interactive@1.0.0: {} + + is-map@2.0.3: {} + + is-module@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-npm@6.1.0: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@1.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-regexp@1.0.0: {} + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpointer@5.0.1: {} + + kind-of@6.0.3: {} + + ky@1.14.3: {} + + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + + leven@3.1.0: {} + + lines-and-columns@1.2.4: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.debounce@4.0.8: {} + + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + lru-cache@11.5.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + math-intrinsics@1.1.0: {} + + meow@7.1.1: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + + mimic-fn@2.1.0: {} + + min-indent@1.0.1: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.12 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.7 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + ms@2.1.3: {} + + mute-stream@0.0.8: {} + + node-releases@2.0.55: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.12 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-tmpdir@1.0.2: {} + + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-json@10.0.1: + dependencies: + ky: 1.14.3 + registry-auth-token: 5.1.1 + registry-url: 6.0.1 + semver: 7.8.5 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.7: {} + + possible-typed-array-names@1.1.0: {} + + pretty-bytes@5.6.0: {} + + proto-list@1.2.4: {} + + pupa@3.3.0: + dependencies: + escape-goat: 4.0.0 + + quick-lru@4.0.1: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.3 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + regjsgen@0.8.0: {} + + regjsparser@0.13.2: + dependencies: + jsesc: 3.1.0 + + require-from-string@2.0.2: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + rollup@4.63.3: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.3 + '@rollup/rollup-android-arm64': 4.63.3 + '@rollup/rollup-darwin-arm64': 4.63.3 + '@rollup/rollup-darwin-x64': 4.63.3 + '@rollup/rollup-freebsd-arm64': 4.63.3 + '@rollup/rollup-freebsd-x64': 4.63.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.3 + '@rollup/rollup-linux-arm-musleabihf': 4.63.3 + '@rollup/rollup-linux-arm64-gnu': 4.63.3 + '@rollup/rollup-linux-arm64-musl': 4.63.3 + '@rollup/rollup-linux-loong64-gnu': 4.63.3 + '@rollup/rollup-linux-loong64-musl': 4.63.3 + '@rollup/rollup-linux-ppc64-gnu': 4.63.3 + '@rollup/rollup-linux-ppc64-musl': 4.63.3 + '@rollup/rollup-linux-riscv64-gnu': 4.63.3 + '@rollup/rollup-linux-riscv64-musl': 4.63.3 + '@rollup/rollup-linux-s390x-gnu': 4.63.3 + '@rollup/rollup-linux-x64-gnu': 4.63.3 + '@rollup/rollup-linux-x64-musl': 4.63.3 + '@rollup/rollup-openbsd-x64': 4.63.3 + '@rollup/rollup-openharmony-arm64': 4.63.3 + '@rollup/rollup-win32-arm64-msvc': 4.63.3 + '@rollup/rollup-win32-ia32-msvc': 4.63.3 + '@rollup/rollup-win32-x64-gnu': 4.63.3 + '@rollup/rollup-win32-x64-msvc': 4.63.3 + fsevents: 2.3.3 + + run-async@2.4.1: {} + + rxjs@6.6.7: + dependencies: + tslib: 1.14.1 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + serialize-javascript@7.1.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + smob@1.6.2: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string.prototype.matchall@4.1.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.1 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + + strip-comments@2.0.1: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + temp-dir@2.0.0: {} + + tempy@0.6.0: + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + + terser@5.51.2: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.18.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + through@2.3.8: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-newlines@3.0.1: {} + + tslib@1.14.1: {} + + type-fest@0.13.1: {} + + type-fest@0.16.0: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@4.41.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + universalify@2.0.1: {} + + upath@1.2.0: {} + + update-browserslist-db@1.3.3(browserslist@4.29.0): + dependencies: + browserslist: 4.29.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.6.2 + configstore: 7.1.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.1.0 + latest-version: 9.0.0 + pupa: 3.3.0 + semver: 7.8.5 + xdg-basedir: 5.1.0 + + util-deprecate@1.0.2: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + when-exit@2.1.5: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.22 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + workbox-background-sync@7.4.1: + dependencies: + idb: 7.1.1 + workbox-core: 7.4.1 + + workbox-broadcast-update@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-build@7.4.1(supports-color@7.2.0): + dependencies: + '@apideck/better-ajv-errors': 0.3.7(ajv@8.20.0) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/preset-env': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/runtime': 7.29.7 + '@rollup/plugin-babel': 6.1.0(@babel/core@7.29.7(supports-color@7.2.0))(rollup@4.63.3)(supports-color@7.2.0) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.63.3) + '@rollup/plugin-replace': 6.0.3(rollup@4.63.3) + '@rollup/plugin-terser': 1.0.0(rollup@4.63.3) + '@trickfilm400/rollup-plugin-off-main-thread': 3.0.0-pre1 + ajv: 8.20.0 + common-tags: 1.8.2 + eta: 4.6.0 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 11.1.0 + pretty-bytes: 5.6.0 + rollup: 4.63.3 + source-map: 0.8.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.4.1 + workbox-broadcast-update: 7.4.1 + workbox-cacheable-response: 7.4.1 + workbox-core: 7.4.1 + workbox-expiration: 7.4.1 + workbox-google-analytics: 7.4.1 + workbox-navigation-preload: 7.4.1 + workbox-precaching: 7.4.1 + workbox-range-requests: 7.4.1 + workbox-recipes: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + workbox-streams: 7.4.1 + workbox-sw: 7.4.1 + workbox-window: 7.4.1 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + workbox-cacheable-response@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-cli@7.4.1(supports-color@7.2.0): + dependencies: + chalk: 4.1.2 + chokidar: 3.6.0 + common-tags: 1.8.2 + fs-extra: 9.1.0 + glob: 11.1.0 + inquirer: 7.3.3 + meow: 7.1.1 + ora: 5.4.1 + pretty-bytes: 5.6.0 + stringify-object: 3.3.0 + upath: 1.2.0 + update-notifier: 7.3.1 + workbox-build: 7.4.1(supports-color@7.2.0) + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + workbox-core@7.4.1: {} + + workbox-expiration@7.4.1: + dependencies: + idb: 7.1.1 + workbox-core: 7.4.1 + + workbox-google-analytics@7.4.1: + dependencies: + workbox-background-sync: 7.4.1 + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + + workbox-navigation-preload@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-precaching@7.4.1: + dependencies: + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + + workbox-range-requests@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-recipes@7.4.1: + dependencies: + workbox-cacheable-response: 7.4.1 + workbox-core: 7.4.1 + workbox-expiration: 7.4.1 + workbox-precaching: 7.4.1 + workbox-routing: 7.4.1 + workbox-strategies: 7.4.1 + + workbox-routing@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-strategies@7.4.1: + dependencies: + workbox-core: 7.4.1 + + workbox-streams@7.4.1: + dependencies: + workbox-core: 7.4.1 + workbox-routing: 7.4.1 + + workbox-sw@7.4.1: {} + + workbox-window@7.4.1: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.4.1 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + xdg-basedir@5.1.0: {} + + yallist@3.1.1: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 diff --git a/server/.changeset/web-application-shell.md b/server/.changeset/web-application-shell.md new file mode 100644 index 00000000..ba54bede --- /dev/null +++ b/server/.changeset/web-application-shell.md @@ -0,0 +1,12 @@ +--- +"create-eigen-game": minor +--- + +A scaffolded game's web app opens offline from its first visit, and updates cleanly (decision 0014). + +- `build:web` finishes by generating the service worker with Workbox (`workbox generateSW workbox-config.cjs`), which precaches the whole build. `workbox-cli` is a root dev dependency, and the generated CI installs the root and runs `build:web`. The hand-written `web/eigen_offline_sw.js` is gone. +- `web/flutter_bootstrap.js` starts Flutter without waiting for either service worker, and keeps the CDN files a first visit loads for offline use. +- `web/sqlite3.wasm` and `web/drift_worker.js` are gone: `eigen_flutter` ships drift's web runtime itself. +- The messaging worker loads the Firebase JS SDK version `firebase_core_web` is tested against, 12.19.0. + +Migrating an existing game: delete `app/web/sqlite3.wasm`, `app/web/drift_worker.js`, and `app/web/eigen_offline_sw.js`; copy `workbox-config.cjs`, `app/web/flutter_bootstrap.js`, and the `build:web` script from a fresh scaffold; add `workbox-cli` to the root's dev dependencies; and add every route in the Worker's `run_worker_first` that it renders itself to `navigateFallbackDenylist`. diff --git a/server/biome.json b/server/biome.json index 4b14a84b..a92bb9ca 100644 --- a/server/biome.json +++ b/server/biome.json @@ -7,7 +7,7 @@ }, "files": { "ignoreUnknown": false, - "includes": ["**", "!**/worker-configuration.d.ts", "!**/migrations/meta", "!packages/server/openapi.json", "!**/game-contract.json", "!**/templates/app-overlay/web/drift_worker.js"] + "includes": ["**", "!**/worker-configuration.d.ts", "!**/migrations/meta", "!packages/server/openapi.json", "!**/game-contract.json"] }, "formatter": { "enabled": true, diff --git a/server/packages/create-eigen-game/scripts/scaffold-e2e.mjs b/server/packages/create-eigen-game/scripts/scaffold-e2e.mjs index c2faa3bc..12d9fc1d 100644 --- a/server/packages/create-eigen-game/scripts/scaffold-e2e.mjs +++ b/server/packages/create-eigen-game/scripts/scaffold-e2e.mjs @@ -31,7 +31,7 @@ // A separate registry query below still checks the engine/eigen_api wire line. import { execFileSync } from "node:child_process"; -import { appendFileSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs"; +import { appendFileSync, existsSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; @@ -386,7 +386,13 @@ if (buildTarget === "all" || buildTarget === "android") { shell("flutter", ["build", "apk", "--release", "--dart-define-from-file=app-config.json"], appRoot); } if (buildTarget === "all" || buildTarget === "web") { - shell("flutter", ["build", "web", "--release", "--dart-define-from-file=app-config.json"], appRoot); + // The project's own script, because a web build is Flutter's output plus the + // service worker Workbox generates from it; building Flutter alone would + // leave the offline half unproven. + shell("pnpm", ["run", "build:web"], root); + for (const built of ["sw.js", "assets/packages/eigen_flutter/assets/drift/drift_worker.js"]) { + if (!existsSync(resolve(root, "server/public", built))) throw new Error(`the web build did not produce server/public/${built}`); + } } console.log(`\nScaffolded, built and tested ${buildTarget} at ${root}`); diff --git a/server/packages/create-eigen-game/templates/app-overlay/web/README.md b/server/packages/create-eigen-game/templates/app-overlay/web/README.md deleted file mode 100644 index 89dbabd7..00000000 --- a/server/packages/create-eigen-game/templates/app-overlay/web/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Web assets - -`sqlite3.wasm` and `drift_worker.js` are drift's web runtime, taken verbatim -from the [drift 2.35.0 -release](https://github.com/simolus3/drift/releases/tag/drift-2.35.0). They are -served from the app's own origin because that is where `LocalDatabase` looks for -them, and they are what gives a browser the storage offline play needs. - -Replace both together whenever the `drift` constraint in `eigen_flutter`'s -pubspec moves, and take them from the matching release: the worker and the -module are one pair. diff --git a/server/packages/create-eigen-game/templates/app-overlay/web/drift_worker.js b/server/packages/create-eigen-game/templates/app-overlay/web/drift_worker.js deleted file mode 100644 index a2cd6106..00000000 --- a/server/packages/create-eigen-game/templates/app-overlay/web/drift_worker.js +++ /dev/null @@ -1,13453 +0,0 @@ -(function dartProgram(){function copyProperties(a,b){var s=Object.keys(a) -for(var r=0;r=0)return true -if(typeof version=="function"&&version.length==0){var q=version() -if(/^\d+\.\d+\.\d+\.\d+$/.test(q))return true}}catch(p){}return false}() -function inherit(a,b){a.prototype.constructor=a -a.prototype["$i"+a.name]=a -if(b!=null){if(z){Object.setPrototypeOf(a.prototype,b.prototype) -return}var s=Object.create(b.prototype) -copyProperties(a.prototype,s) -a.prototype=s}}function inheritMany(a,b){for(var s=0;s4294967295)throw A.b(A.X(a,0,4294967295,"length",null)) -return J.uy(new Array(a),b)}, -q7(a,b){if(a<0)throw A.b(A.K("Length must be a non-negative integer: "+a,null)) -return A.f(new Array(a),b.h("u<0>"))}, -uy(a,b){var s=A.f(a,b.h("u<0>")) -s.$flags=1 -return s}, -uz(a,b){return J.tV(a,b)}, -q8(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0 -default:return!1}switch(a){case 5760:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0 -default:return!1}}, -uA(a,b){var s,r -for(s=a.length;b0;b=s){s=b-1 -r=a.charCodeAt(s) -if(r!==32&&r!==13&&!J.q8(r))break}return b}, -cX(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.eq.prototype -return J.hj.prototype}if(typeof a=="string")return J.bY.prototype -if(a==null)return J.er.prototype -if(typeof a=="boolean")return J.hh.prototype -if(Array.isArray(a))return J.u.prototype -if(typeof a!="object"){if(typeof a=="function")return J.aV.prototype -if(typeof a=="symbol")return J.d9.prototype -if(typeof a=="bigint")return J.aN.prototype -return a}if(a instanceof A.d)return a -return J.o6(a)}, -a5(a){if(typeof a=="string")return J.bY.prototype -if(a==null)return a -if(Array.isArray(a))return J.u.prototype -if(typeof a!="object"){if(typeof a=="function")return J.aV.prototype -if(typeof a=="symbol")return J.d9.prototype -if(typeof a=="bigint")return J.aN.prototype -return a}if(a instanceof A.d)return a -return J.o6(a)}, -aT(a){if(a==null)return a -if(Array.isArray(a))return J.u.prototype -if(typeof a!="object"){if(typeof a=="function")return J.aV.prototype -if(typeof a=="symbol")return J.d9.prototype -if(typeof a=="bigint")return J.aN.prototype -return a}if(a instanceof A.d)return a -return J.o6(a)}, -xA(a){if(typeof a=="number")return J.d8.prototype -if(typeof a=="string")return J.bY.prototype -if(a==null)return a -if(!(a instanceof A.d))return J.cH.prototype -return a}, -o4(a){if(typeof a=="string")return J.bY.prototype -if(a==null)return a -if(!(a instanceof A.d))return J.cH.prototype -return a}, -rR(a){if(a==null)return a -if(typeof a!="object"){if(typeof a=="function")return J.aV.prototype -if(typeof a=="symbol")return J.d9.prototype -if(typeof a=="bigint")return J.aN.prototype -return a}if(a instanceof A.d)return a -return J.o6(a)}, -aj(a,b){if(a==null)return b==null -if(typeof a!="object")return b!=null&&a===b -return J.cX(a).T(a,b)}, -aM(a,b){if(typeof b==="number")if(Array.isArray(a)||typeof a=="string"||A.rU(a,a[v.dispatchPropertyName]))if(b>>>0===b&&b>>0===b&&b").H(c).h("f0<1,2>")) -return new A.cr(a,b.h("@<0>").H(c).h("cr<1,2>"))}, -q9(a){return new A.da("Field '"+a+"' has been assigned during initialization.")}, -qa(a){return new A.da("Field '"+a+"' has not been initialized.")}, -uC(a){return new A.da("Field '"+a+"' has already been initialized.")}, -o7(a){var s,r=a^48 -if(r<=9)return r -s=a|32 -if(97<=s&&s<=102)return s-87 -return-1}, -ca(a,b){a=a+b&536870911 -a=a+((a&524287)<<10)&536870911 -return a^a>>>6}, -oR(a){a=a+((a&67108863)<<3)&536870911 -a^=a>>>11 -return a+((a&16383)<<15)&536870911}, -cW(a,b,c){return a}, -pr(a){var s,r -for(s=$.cV.length,r=0;rc)A.D(A.X(b,0,c,"start",null))}return new A.cF(a,b,c,d.h("cF<0>"))}, -hr(a,b,c,d){if(t.Q.b(a))return new A.cx(a,b,c.h("@<0>").H(d).h("cx<1,2>")) -return new A.aG(a,b,c.h("@<0>").H(d).h("aG<1,2>"))}, -oS(a,b,c){var s="takeCount" -A.bU(b,s) -A.ac(b,s) -if(t.Q.b(a))return new A.ei(a,b,c.h("ei<0>")) -return new A.cG(a,b,c.h("cG<0>"))}, -qv(a,b,c){var s="count" -if(t.Q.b(a)){A.bU(b,s) -A.ac(b,s) -return new A.d5(a,b,c.h("d5<0>"))}A.bU(b,s) -A.ac(b,s) -return new A.bK(a,b,c.h("bK<0>"))}, -uw(a,b,c){return new A.cw(a,b,c.h("cw<0>"))}, -ax(){return new A.aI("No element")}, -q5(){return new A.aI("Too few elements")}, -cf:function cf(){}, -fR:function fR(a,b){this.a=a -this.$ti=b}, -cr:function cr(a,b){this.a=a -this.$ti=b}, -f0:function f0(a,b){this.a=a -this.$ti=b}, -eV:function eV(){}, -ak:function ak(a,b){this.a=a -this.$ti=b}, -da:function da(a){this.a=a}, -fS:function fS(a){this.a=a}, -oe:function oe(){}, -kS:function kS(){}, -q:function q(){}, -Q:function Q(){}, -cF:function cF(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.$ti=d}, -b6:function b6(a,b,c){var _=this -_.a=a -_.b=b -_.c=0 -_.d=null -_.$ti=c}, -aG:function aG(a,b,c){this.a=a -this.b=b -this.$ti=c}, -cx:function cx(a,b,c){this.a=a -this.b=b -this.$ti=c}, -dc:function dc(a,b,c){var _=this -_.a=null -_.b=a -_.c=b -_.$ti=c}, -E:function E(a,b,c){this.a=a -this.b=b -this.$ti=c}, -aK:function aK(a,b,c){this.a=a -this.b=b -this.$ti=c}, -cI:function cI(a,b){this.a=a -this.b=b}, -ek:function ek(a,b,c){this.a=a -this.b=b -this.$ti=c}, -h7:function h7(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=null -_.$ti=d}, -cG:function cG(a,b,c){this.a=a -this.b=b -this.$ti=c}, -ei:function ei(a,b,c){this.a=a -this.b=b -this.$ti=c}, -hP:function hP(a,b,c){this.a=a -this.b=b -this.$ti=c}, -bK:function bK(a,b,c){this.a=a -this.b=b -this.$ti=c}, -d5:function d5(a,b,c){this.a=a -this.b=b -this.$ti=c}, -hK:function hK(a,b){this.a=a -this.b=b}, -eG:function eG(a,b,c){this.a=a -this.b=b -this.$ti=c}, -hL:function hL(a,b){this.a=a -this.b=b -this.c=!1}, -cy:function cy(a){this.$ti=a}, -h4:function h4(){}, -eP:function eP(a,b){this.a=a -this.$ti=b}, -i6:function i6(a,b){this.a=a -this.$ti=b}, -bz:function bz(a,b,c){this.a=a -this.b=b -this.$ti=c}, -cw:function cw(a,b,c){this.a=a -this.b=b -this.$ti=c}, -eo:function eo(a,b){this.a=a -this.b=b -this.c=-1}, -el:function el(){}, -hT:function hT(){}, -du:function du(){}, -eE:function eE(a,b){this.a=a -this.$ti=b}, -hO:function hO(a){this.a=a}, -fy:function fy(){}, -ue(){throw A.b(A.a3("Cannot modify unmodifiable Map"))}, -t4(a){var s=A.t3(a) -if(s!=null)return s -return"minified:"+a}, -rU(a,b){var s -if(b!=null){s=b.x -if(s!=null)return s}return t.aU.b(a)}, -t(a){var s -if(typeof a=="string")return a -if(typeof a=="number"){if(a!==0)return""+a}else if(!0===a)return"true" -else if(!1===a)return"false" -else if(a==null)return"null" -s=J.b3(a) -return s}, -eC(a){var s,r=$.qg -if(r==null)r=$.qg=Symbol("identityHashCode") -s=a[r] -if(s==null){s=Math.random()*0x3fffffff|0 -a[r]=s}return s}, -qn(a,b){var s,r,q,p,o,n=null,m=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a) -if(m==null)return n -s=m[3] -if(b==null){if(s!=null)return parseInt(a,10) -if(m[2]!=null)return parseInt(a,16) -return n}if(b<2||b>36)throw A.b(A.X(b,2,36,"radix",n)) -if(b===10&&s!=null)return parseInt(a,10) -if(b<10||s==null){r=b<=10?47+b:86+b -q=m[1] -for(p=q.length,o=0;or)return n}return parseInt(a,b)}, -hF(a){var s,r,q,p -if(a instanceof A.d)return A.b0(A.aU(a),null) -s=J.cX(a) -if(s===B.av||s===B.ay||t.ak.b(a)){r=B.I(a) -if(r!=="Object"&&r!=="")return r -q=a.constructor -if(typeof q=="function"){p=q.name -if(typeof p=="string"&&p!=="Object"&&p!=="")return p}}return A.b0(A.aU(a),null)}, -qo(a){var s,r,q -if(a==null||typeof a=="number"||A.bR(a))return J.b3(a) -if(typeof a=="string")return JSON.stringify(a) -if(a instanceof A.cs)return a.i(0) -if(a instanceof A.fh)return a.fT(!0) -s=$.tI() -for(r=0;r<1;++r){q=s[r].lm(a) -if(q!=null)return q}return"Instance of '"+A.hF(a)+"'"}, -uM(){if(!!self.location)return self.location.href -return null}, -qf(a){var s,r,q,p,o=a.length -if(o<=500)return String.fromCharCode.apply(null,a) -for(s="",r=0;r65535)return A.uQ(a)}return A.qf(a)}, -uR(a,b,c){var s,r,q,p -if(c<=500&&b===0&&c===a.length)return String.fromCharCode.apply(null,a) -for(s=b,r="";s>>0,s&1023|56320)}}throw A.b(A.X(a,0,1114111,null,null))}, -aH(a){if(a.date===void 0)a.date=new Date(a.a) -return a.date}, -qm(a){return a.c?A.aH(a).getUTCFullYear()+0:A.aH(a).getFullYear()+0}, -qk(a){return a.c?A.aH(a).getUTCMonth()+1:A.aH(a).getMonth()+1}, -qh(a){return a.c?A.aH(a).getUTCDate()+0:A.aH(a).getDate()+0}, -qi(a){return a.c?A.aH(a).getUTCHours()+0:A.aH(a).getHours()+0}, -qj(a){return a.c?A.aH(a).getUTCMinutes()+0:A.aH(a).getMinutes()+0}, -ql(a){return a.c?A.aH(a).getUTCSeconds()+0:A.aH(a).getSeconds()+0}, -uO(a){return a.c?A.aH(a).getUTCMilliseconds()+0:A.aH(a).getMilliseconds()+0}, -uP(a){return B.b.ac((a.c?A.aH(a).getUTCDay()+0:A.aH(a).getDay()+0)+6,7)+1}, -uN(a){var s=a.$thrownJsError -if(s==null)return null -return A.a8(s)}, -eD(a,b){var s -if(a.$thrownJsError==null){s=new Error() -A.ab(a,s) -a.$thrownJsError=s -s.stack=b.i(0)}}, -iY(a,b){var s,r="index" -if(!A.bw(b))return new A.bc(!0,b,r,null) -s=J.aC(a) -if(b<0||b>=s)return A.hc(b,s,a,null,r) -return A.kO(b,r)}, -xu(a,b,c){if(a>c)return A.X(a,0,c,"start",null) -if(b!=null)if(bc)return A.X(b,a,c,"end",null) -return new A.bc(!0,b,"end",null)}, -e2(a){return new A.bc(!0,a,null,null)}, -b(a){return A.ab(a,new Error())}, -ab(a,b){var s -if(a==null)a=new A.bM() -b.dartException=a -s=A.y7 -if("defineProperty" in Object){Object.defineProperty(b,"message",{get:s}) -b.name=""}else b.toString=s -return b}, -y7(){return J.b3(this.dartException)}, -D(a,b){throw A.ab(a,b==null?new Error():b)}, -z(a,b,c){var s -if(b==null)b=0 -if(c==null)c=0 -s=Error() -A.D(A.wj(a,b,c),s)}, -wj(a,b,c){var s,r,q,p,o,n,m,l,k -if(typeof b=="string")s=b -else{r="[]=;add;removeWhere;retainWhere;removeRange;setRange;setInt8;setInt16;setInt32;setUint8;setUint16;setUint32;setFloat32;setFloat64".split(";") -q=r.length -p=b -if(p>q){c=p/q|0 -p%=q}s=r[p]}o=typeof c=="string"?c:"modify;remove from;add to".split(";")[c] -n=t.j.b(a)?"list":"ByteData" -m=a.$flags|0 -l="a " -if((m&4)!==0)k="constant " -else if((m&2)!==0){k="unmodifiable " -l="an "}else k=(m&1)!==0?"fixed-length ":"" -return new A.eN("'"+s+"': Cannot "+o+" "+l+k+n)}, -P(a){throw A.b(A.ao(a))}, -bN(a){var s,r,q,p,o,n -a=A.t1(a.replace(String({}),"$receiver$")) -s=a.match(/\\\$[a-zA-Z]+\\\$/g) -if(s==null)s=A.f([],t.s) -r=s.indexOf("\\$arguments\\$") -q=s.indexOf("\\$argumentsExpr\\$") -p=s.indexOf("\\$expr\\$") -o=s.indexOf("\\$method\\$") -n=s.indexOf("\\$receiver\\$") -return new A.ly(a.replace(new RegExp("\\\\\\$arguments\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$","g"),"((?:x|[^x])*)"),r,q,p,o,n)}, -lz(a){return function($expr$){var $argumentsExpr$="$arguments$" -try{$expr$.$method$($argumentsExpr$)}catch(s){return s.message}}(a)}, -qE(a){return function($expr$){try{$expr$.$method$}catch(s){return s.message}}(a)}, -oH(a,b){var s=b==null,r=s?null:b.method -return new A.hl(a,r,s?null:b.receiver)}, -I(a){if(a==null)return new A.hB(a) -if(a instanceof A.ej)return A.cn(a,a.a) -if(typeof a!=="object")return a -if("dartException" in a)return A.cn(a,a.dartException) -return A.x2(a)}, -cn(a,b){if(t.C.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a -return b}, -x2(a){var s,r,q,p,o,n,m,l,k,j,i,h,g -if(!("message" in a))return a -s=a.message -if("number" in a&&typeof a.number=="number"){r=a.number -q=r&65535 -if((B.b.L(r,16)&8191)===10)switch(q){case 438:return A.cn(a,A.oH(A.t(s)+" (Error "+q+")",null)) -case 445:case 5007:A.t(s) -return A.cn(a,new A.ey())}}if(a instanceof TypeError){p=$.td() -o=$.te() -n=$.tf() -m=$.tg() -l=$.tj() -k=$.tk() -j=$.ti() -$.th() -i=$.tm() -h=$.tl() -g=p.aA(s) -if(g!=null)return A.cn(a,A.oH(s,g)) -else{g=o.aA(s) -if(g!=null){g.method="call" -return A.cn(a,A.oH(s,g))}else if(n.aA(s)!=null||m.aA(s)!=null||l.aA(s)!=null||k.aA(s)!=null||j.aA(s)!=null||m.aA(s)!=null||i.aA(s)!=null||h.aA(s)!=null)return A.cn(a,new A.ey())}return A.cn(a,new A.hS(typeof s=="string"?s:""))}if(a instanceof RangeError){if(typeof s=="string"&&s.indexOf("call stack")!==-1)return new A.eI() -s=function(b){try{return String(b)}catch(f){}return null}(a) -return A.cn(a,new A.bc(!1,null,null,typeof s=="string"?s.replace(/^RangeError:\s*/,""):s))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof s=="string"&&s==="too much recursion")return new A.eI() -return a}, -a8(a){var s -if(a instanceof A.ej)return a.b -if(a==null)return new A.fl(a) -s=a.$cachedTrace -if(s!=null)return s -s=new A.fl(a) -if(typeof a==="object")a.$cachedTrace=s -return s}, -pt(a){if(a==null)return J.aE(a) -if(typeof a=="object")return A.eC(a) -return J.aE(a)}, -xw(a,b){var s,r,q,p=a.length -for(s=0;s=0 -else if(b instanceof A.cA){s=B.a.K(a,c) -return b.b.test(s)}else return!J.or(b,B.a.K(a,c)).gB(0)}, -po(a){if(a.indexOf("$",0)>=0)return a.replace(/\$/g,"$$$$") -return a}, -y3(a,b,c,d){var s=b.fk(a,d) -if(s==null)return a -return A.py(a,s.b.index,s.gby(),c)}, -t1(a){if(/[[\]{}()*+?.\\^$|]/.test(a))return a.replace(/[[\]{}()*+?.\\^$|]/g,"\\$&") -return a}, -bl(a,b,c){var s -if(typeof b=="string")return A.y2(a,b,c) -if(b instanceof A.cA){s=b.gfv() -s.lastIndex=0 -return a.replace(s,A.po(c))}return A.y1(a,b,c)}, -y1(a,b,c){var s,r,q,p -for(s=J.or(b,a),s=s.gq(s),r=0,q="";s.k();){p=s.gm() -q=q+a.substring(r,p.gcA())+c -r=p.gby()}s=q+a.substring(r) -return s.charCodeAt(0)==0?s:s}, -y2(a,b,c){var s,r,q -if(b===""){if(a==="")return c -s=a.length -for(r=c,q=0;q=0)return a.split(b).join(c) -return a.replace(new RegExp(A.t1(b),"g"),A.po(c))}, -y4(a,b,c,d){var s,r,q,p -if(typeof b=="string"){s=a.indexOf(b,d) -if(s<0)return a -return A.py(a,s,s+b.length,c)}if(b instanceof A.cA)return d===0?a.replace(b.b,A.po(c)):A.y3(a,b,c,d) -r=J.tT(b,a,d) -q=r.gq(r) -if(!q.k())return a -p=q.gm() -return B.a.aO(a,p.gcA(),p.gby(),c)}, -py(a,b,c,d){return a.substring(0,b)+d+a.substring(c)}, -ah:function ah(a,b){this.a=a -this.b=b}, -cS:function cS(a,b){this.a=a -this.b=b}, -iC:function iC(a,b){this.a=a -this.b=b}, -ee:function ee(){}, -cu:function cu(a,b,c){this.a=a -this.b=b -this.$ti=c}, -cQ:function cQ(a,b){this.a=a -this.$ti=b}, -iv:function iv(a,b,c){var _=this -_.a=a -_.b=b -_.c=0 -_.d=null -_.$ti=c}, -kr:function kr(){}, -ep:function ep(a,b){this.a=a -this.$ti=b}, -eF:function eF(){}, -ly:function ly(a,b,c,d,e,f){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e -_.f=f}, -ey:function ey(){}, -hl:function hl(a,b,c){this.a=a -this.b=b -this.c=c}, -hS:function hS(a){this.a=a}, -hB:function hB(a){this.a=a}, -ej:function ej(a,b){this.a=a -this.b=b}, -fl:function fl(a){this.a=a -this.b=null}, -cs:function cs(){}, -jj:function jj(){}, -jk:function jk(){}, -lo:function lo(){}, -le:function le(){}, -ea:function ea(a,b){this.a=a -this.b=b}, -hI:function hI(a){this.a=a}, -bA:function bA(a){var _=this -_.a=0 -_.f=_.e=_.d=_.c=_.b=null -_.r=0 -_.$ti=a}, -kx:function kx(a){this.a=a}, -kA:function kA(a,b){var _=this -_.a=a -_.b=b -_.d=_.c=null}, -bB:function bB(a,b){this.a=a -this.$ti=b}, -hp:function hp(a,b,c){var _=this -_.a=a -_.b=b -_.c=c -_.d=null}, -et:function et(a,b){this.a=a -this.$ti=b}, -db:function db(a,b,c){var _=this -_.a=a -_.b=b -_.c=c -_.d=null}, -es:function es(a,b){this.a=a -this.$ti=b}, -ho:function ho(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=null -_.$ti=d}, -o8:function o8(a){this.a=a}, -o9:function o9(a){this.a=a}, -oa:function oa(a){this.a=a}, -fh:function fh(){}, -iB:function iB(){}, -cA:function cA(a,b){var _=this -_.a=a -_.b=b -_.e=_.d=_.c=null}, -dJ:function dJ(a){this.b=a}, -i7:function i7(a,b,c){this.a=a -this.b=b -this.c=c}, -ma:function ma(a,b,c){var _=this -_.a=a -_.b=b -_.c=c -_.d=null}, -ds:function ds(a,b){this.a=a -this.c=b}, -iK:function iK(a,b,c){this.a=a -this.b=b -this.c=c}, -ni:function ni(a,b,c){var _=this -_.a=a -_.b=b -_.c=c -_.d=null}, -y6(a){throw A.ab(A.q9(a),new Error())}, -x(){throw A.ab(A.qa(""),new Error())}, -j_(){throw A.ab(A.uC(""),new Error())}, -pA(){throw A.ab(A.q9(""),new Error())}, -mr(a){var s=new A.mq(a) -return s.b=s}, -mq:function mq(a){this.a=a -this.b=null}, -wh(a){return a}, -fz(a,b,c){}, -fA(a){var s,r,q -if(t.aP.b(a))return a -s=J.a5(a) -r=A.b7(s.gl(a),null,!1,t.z) -for(q=0;q>>0!==a||a>=c)throw A.b(A.iY(b,a))}, -cj(a,b,c){var s -if(!(a>>>0!==a))s=b>>>0!==b||a>b||b>c -else s=!0 -if(s)throw A.b(A.xu(a,b,c)) -return b}, -de:function de(){}, -dd:function dd(){}, -ew:function ew(){}, -iQ:function iQ(a){this.a=a}, -ev:function ev(){}, -dg:function dg(){}, -c0:function c0(){}, -aY:function aY(){}, -hs:function hs(){}, -ht:function ht(){}, -hu:function hu(){}, -df:function df(){}, -hv:function hv(){}, -hw:function hw(){}, -hx:function hx(){}, -ex:function ex(){}, -c1:function c1(){}, -fc:function fc(){}, -fd:function fd(){}, -fe:function fe(){}, -ff:function ff(){}, -oN(a,b){var s=b.c -return s==null?b.c=A.fr(a,"C",[b.x]):s}, -qu(a){var s=a.w -if(s===6||s===7)return A.qu(a.x) -return s===11||s===12}, -uV(a){return a.as}, -aw(a){return A.np(v.typeUniverse,a,!1)}, -xH(a,b){var s,r,q,p,o -if(a==null)return null -s=b.y -r=a.Q -if(r==null)r=a.Q=new Map() -q=b.as -p=r.get(q) -if(p!=null)return p -o=A.ck(v.typeUniverse,a.x,s,0) -r.set(q,o) -return o}, -ck(a1,a2,a3,a4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=a2.w -switch(a0){case 5:case 1:case 2:case 3:case 4:return a2 -case 6:s=a2.x -r=A.ck(a1,s,a3,a4) -if(r===s)return a2 -return A.r3(a1,r,!0) -case 7:s=a2.x -r=A.ck(a1,s,a3,a4) -if(r===s)return a2 -return A.r2(a1,r,!0) -case 8:q=a2.y -p=A.e_(a1,q,a3,a4) -if(p===q)return a2 -return A.fr(a1,a2.x,p) -case 9:o=a2.x -n=A.ck(a1,o,a3,a4) -m=a2.y -l=A.e_(a1,m,a3,a4) -if(n===o&&l===m)return a2 -return A.p5(a1,n,l) -case 10:k=a2.x -j=a2.y -i=A.e_(a1,j,a3,a4) -if(i===j)return a2 -return A.r4(a1,k,i) -case 11:h=a2.x -g=A.ck(a1,h,a3,a4) -f=a2.y -e=A.x_(a1,f,a3,a4) -if(g===h&&e===f)return a2 -return A.r1(a1,g,e) -case 12:d=a2.y -a4+=d.length -c=A.e_(a1,d,a3,a4) -o=a2.x -n=A.ck(a1,o,a3,a4) -if(c===d&&n===o)return a2 -return A.p6(a1,n,c,!0) -case 13:b=a2.x -if(b") -for(r=1;r=0)p+=" "+r[q];++q}return p+"})"}, -ru(a1,a2,a3){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=", ",a0=null -if(a3!=null){s=a3.length -if(a2==null)a2=A.f([],t.s) -else a0=a2.length -r=a2.length -for(q=s;q>0;--q)a2.push("T"+(r+q)) -for(p=t.X,o="<",n="",q=0;q0){c+=b+"[" -for(b="",q=0;q0){c+=b+"{" -for(b="",q=0;q "+d}, -b0(a,b){var s,r,q,p,o,n,m=a.w -if(m===5)return"erased" -if(m===2)return"dynamic" -if(m===3)return"void" -if(m===1)return"Never" -if(m===4)return"any" -if(m===6){s=a.x -r=A.b0(s,b) -q=s.w -return(q===11||q===12?"("+r+")":r)+"?"}if(m===7)return"FutureOr<"+A.b0(a.x,b)+">" -if(m===8){p=A.x1(a.x) -o=a.y -return o.length>0?p+("<"+A.rE(o,b)+">"):p}if(m===10)return A.wM(a,b) -if(m===11)return A.ru(a,b,null) -if(m===12)return A.ru(a.x,b,a.y) -if(m===13){n=a.x -return b[b.length-1-n]}return"?"}, -x1(a){var s=A.t3(a) -if(s!=null)return s -return"minified:"+a}, -vN(a,b){var s=a.tR[b] -while(typeof s=="string")s=a.tR[s] -return s}, -vM(a,b){var s,r,q,p,o,n=a.eT,m=n[b] -if(m==null)return A.np(a,b,!1) -else if(typeof m=="number"){s=m -r=A.fs(a,5,"#") -q=A.nx(s) -for(p=0;p0)p+="<"+A.fq(c)+">" -s=a.eC.get(p) -if(s!=null)return s -r=new A.be(null,null) -r.w=8 -r.x=b -r.y=c -if(c.length>0)r.c=c[0] -r.as=p -q=A.ci(a,r) -a.eC.set(p,q) -return q}, -p5(a,b,c){var s,r,q,p,o,n -if(b.w===9){s=b.x -r=b.y.concat(c)}else{r=c -s=b}q=s.as+(";<"+A.fq(r)+">") -p=a.eC.get(q) -if(p!=null)return p -o=new A.be(null,null) -o.w=9 -o.x=s -o.y=r -o.as=q -n=A.ci(a,o) -a.eC.set(q,n) -return n}, -r4(a,b,c){var s,r,q="+"+(b+"("+A.fq(c)+")"),p=a.eC.get(q) -if(p!=null)return p -s=new A.be(null,null) -s.w=10 -s.x=b -s.y=c -s.as=q -r=A.ci(a,s) -a.eC.set(q,r) -return r}, -r1(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h=i.length,g="("+A.fq(m) -if(j>0){s=l>0?",":"" -g+=s+"["+A.fq(k)+"]"}if(h>0){s=l>0?",":"" -g+=s+"{"+A.vF(i)+"}"}r=n+(g+")") -q=a.eC.get(r) -if(q!=null)return q -p=new A.be(null,null) -p.w=11 -p.x=b -p.y=c -p.as=r -o=A.ci(a,p) -a.eC.set(r,o) -return o}, -p6(a,b,c,d){var s,r=b.as+("<"+A.fq(c)+">"),q=a.eC.get(r) -if(q!=null)return q -s=A.vH(a,b,c,r,d) -a.eC.set(r,s) -return s}, -vH(a,b,c,d,e){var s,r,q,p,o,n,m,l -if(e){s=c.length -r=A.nx(s) -for(q=0,p=0;p0){n=A.ck(a,b,r,0) -m=A.e_(a,c,r,0) -return A.p6(a,n,m,c!==m)}}l=new A.be(null,null) -l.w=12 -l.x=b -l.y=c -l.as=d -return A.ci(a,l)}, -vu(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}, -vA(a){var s,r,q,p,o,n,m,l=a.r,k=a.s -for(s=l.length,r=0;r=48&&q<=57)r=A.vw(r+1,q,l,k) -else if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.qY(a,r,l,k,!1) -else if(q===46)r=A.qY(a,r,l,k,!0) -else{++r -switch(q){case 44:break -case 58:k.push(!1) -break -case 33:k.push(!0) -break -case 59:k.push(A.cR(a.u,a.e,k.pop())) -break -case 94:k.push(A.vJ(a.u,k.pop())) -break -case 35:k.push(A.fs(a.u,5,"#")) -break -case 64:k.push(A.fs(a.u,2,"@")) -break -case 126:k.push(A.fs(a.u,3,"~")) -break -case 60:k.push(a.p) -a.p=k.length -break -case 62:A.vy(a,k) -break -case 38:A.vx(a,k) -break -case 63:p=a.u -k.push(A.r3(p,A.cR(p,a.e,k.pop()),a.n)) -break -case 47:p=a.u -k.push(A.r2(p,A.cR(p,a.e,k.pop()),a.n)) -break -case 40:k.push(-3) -k.push(a.p) -a.p=k.length -break -case 41:A.vv(a,k) -break -case 91:k.push(a.p) -a.p=k.length -break -case 93:o=k.splice(a.p) -A.qZ(a.u,a.e,o) -a.p=k.pop() -k.push(o) -k.push(-1) -break -case 123:k.push(a.p) -a.p=k.length -break -case 125:o=k.splice(a.p) -A.vB(a.u,a.e,o) -a.p=k.pop() -k.push(o) -k.push(-2) -break -case 43:n=l.indexOf("(",r) -k.push(l.substring(r,n)) -k.push(-4) -k.push(a.p) -a.p=k.length -r=n+1 -break -default:throw"Bad character "+q}}}m=k.pop() -return A.cR(a.u,a.e,m)}, -vw(a,b,c,d){var s,r,q=b-48 -for(s=c.length;a=48&&r<=57))break -q=q*10+(r-48)}d.push(q) -return a}, -qY(a,b,c,d,e){var s,r,q,p,o,n,m=b+1 -for(s=c.length;m>>0)-97&65535)<26||r===95||r===36||r===124))q=r>=48&&r<=57 -else q=!0 -if(!q)break}}p=c.substring(b,m) -if(e){s=a.u -o=a.e -if(o.w===9)o=o.x -n=A.vN(s,o.x)[p] -if(n==null)A.D('No "'+p+'" in "'+A.uV(o)+'"') -d.push(A.ft(s,o,n))}else d.push(p) -return m}, -vy(a,b){var s,r=a.u,q=A.qX(a,b),p=b.pop() -if(typeof p=="string")b.push(A.fr(r,p,q)) -else{s=A.cR(r,a.e,p) -switch(s.w){case 11:b.push(A.p6(r,s,q,a.n)) -break -default:b.push(A.p5(r,s,q)) -break}}}, -vv(a,b){var s,r,q,p=a.u,o=b.pop(),n=null,m=null -if(typeof o=="number")switch(o){case-1:n=b.pop() -break -case-2:m=b.pop() -break -default:b.push(o) -break}else b.push(o) -s=A.qX(a,b) -o=b.pop() -switch(o){case-3:o=b.pop() -if(n==null)n=p.sEA -if(m==null)m=p.sEA -r=A.cR(p,a.e,o) -q=new A.ip() -q.a=s -q.b=n -q.c=m -b.push(A.r1(p,r,q)) -return -case-4:b.push(A.r4(p,b.pop(),s)) -return -default:throw A.b(A.e7("Unexpected state under `()`: "+A.t(o)))}}, -vx(a,b){var s=b.pop() -if(0===s){b.push(A.fs(a.u,1,"0&")) -return}if(1===s){b.push(A.fs(a.u,4,"1&")) -return}throw A.b(A.e7("Unexpected extended operation "+A.t(s)))}, -qX(a,b){var s=b.splice(a.p) -A.qZ(a.u,a.e,s) -a.p=b.pop() -return s}, -cR(a,b,c){if(typeof c=="string")return A.fr(a,c,a.sEA) -else if(typeof c=="number"){b.toString -return A.vz(a,b,c)}else return c}, -qZ(a,b,c){var s,r=c.length -for(s=0;sn)return!1 -m=n-o -l=s.b -k=r.b -j=l.length -i=k.length -if(o+j=d)return!1 -a1=f[b] -b+=3 -if(a00?new Array(q):v.typeUniverse.sEA -for(o=0;o0?new Array(a):v.typeUniverse.sEA}, -be:function be(a,b){var _=this -_.a=a -_.b=b -_.r=_.f=_.d=_.c=null -_.w=0 -_.as=_.Q=_.z=_.y=_.x=null}, -ip:function ip(){this.c=this.b=this.a=null}, -no:function no(a){this.a=a}, -ik:function ik(){}, -fp:function fp(a){this.a=a}, -vf(){var s,r,q -if(self.scheduleImmediate!=null)return A.x5() -if(self.MutationObserver!=null&&self.document!=null){s={} -r=self.document.createElement("div") -q=self.document.createElement("span") -s.a=null -new self.MutationObserver(A.cm(new A.mc(s),1)).observe(r,{childList:true}) -return new A.mb(s,r,q)}else if(self.setImmediate!=null)return A.x6() -return A.x7()}, -vg(a){self.scheduleImmediate(A.cm(new A.md(a),0))}, -vh(a){self.setImmediate(A.cm(new A.me(a),0))}, -vi(a){A.oT(B.K,a)}, -oT(a,b){var s=B.b.M(a.a,1000) -return A.vD(s<0?0:s,b)}, -vD(a,b){var s=new A.iN() -s.i1(a,b) -return s}, -vE(a,b){var s=new A.iN() -s.i2(a,b) -return s}, -k(a){return new A.i8(new A.m($.n,a.h("m<0>")),a.h("i8<0>"))}, -j(a,b){a.$2(0,null) -b.b=!0 -return b.a}, -c(a,b){A.w7(a,b)}, -i(a,b){b.O(a)}, -h(a,b){b.bx(A.I(a),A.a8(a))}, -w7(a,b){var s,r,q=new A.nJ(b),p=new A.nK(b) -if(a instanceof A.m)a.fR(q,p,t.z) -else{s=t.z -if(a instanceof A.m)a.b0(q,p,s) -else{r=new A.m($.n,t.eI) -r.a=8 -r.c=a -r.fR(q,p,s)}}}, -l(a){var s=function(b,c){return function(d,e){while(true){try{b(d,e) -break}catch(r){e=r -d=c}}}}(a,1) -return $.n.cj(new A.nY(s),t.H,t.S,t.z)}, -r0(a,b,c){return 0}, -fM(a){var s -if(t.C.b(a)){s=a.gaP() -if(s!=null)return s}return B.t}, -oA(a,b){var s,r,q,p,o,n,m,l=null -try{l=a.$0()}catch(q){s=A.I(q) -r=A.a8(q) -p=new A.m($.n,b.h("m<0>")) -o=s -n=r -m=A.dY(o,n) -if(m==null)o=new A.W(o,n==null?A.fM(o):n) -else o=m -p.aR(o) -return p}return b.h("C<0>").b(l)?l:A.ch(l,b)}, -b5(a,b){var s=a==null?b.a(a):a,r=new A.m($.n,b.h("m<0>")) -r.b4(s) -return r}, -q1(a,b){var s -if(!b.b(null))throw A.b(A.ae(null,"computation","The type parameter is not nullable")) -s=new A.m($.n,b.h("m<0>")) -A.v0(a,new A.kj(null,s,b)) -return s}, -q2(a,b){var s,r,q,p,o,n,m,l,k,j,i={},h=null,g=!1,f=new A.m($.n,b.h("m>")) -i.a=null -i.b=0 -i.c=i.d=null -s=new A.kl(i,h,g,f) -try{for(n=J.a0(a),m=t.P;n.k();){r=n.gm() -q=i.b -r.b0(new A.kk(i,q,f,b,h,g),s,m);++i.b}n=i.b -if(n===0){n=f -n.bM(A.f([],b.h("u<0>"))) -return n}i.a=A.b7(n,null,!1,b.h("0?"))}catch(l){p=A.I(l) -o=A.a8(l) -if(i.b===0||g){n=f -m=p -k=o -j=A.dY(m,k) -if(j==null)m=new A.W(m,k==null?A.fM(m):k) -else m=j -n.aR(m) -return n}else{i.d=p -i.c=o}}return f}, -q0(a,b,c,d,e){var s=new A.ke(e,c,b,d),r=$.n,q=new A.m(r,d.h("m<0>")) -if(r!==B.d)s=r.cj(s,d.h("0/"),t.K,t.l) -a.bL(new A.bv(q,2,null,s,a.$ti.h("@<1>").H(d).h("bv<1,2>"))) -return q}, -ut(a,b){var s,r,q,p=A.f([],b.h("u>")) -for(s=a.length,r=b.h("f6<0>"),q=0;q")),b.h("o<0>")) -s=new A.m($.n,b.h("m>")) -A.vs(p,new A.kf(new A.Z(s,b.h("Z>")),p,b)) -return s}, -wG(a){return a!=null}, -vs(a,b){var s,r={},q=r.a=r.b=0,p=new A.mG(r,a,b) -for(s=a.length;q")) -s.a=8 -s.c=a -return s}, -ch(a,b){var s=new A.m($.n,b.h("m<0>")) -s.a=8 -s.c=a -return s}, -mM(a,b,c){var s,r,q,p={},o=p.a=a -while(s=o.a,(s&4)!==0){o=o.c -p.a=o}if(o===b){s=A.ld() -b.aR(new A.W(new A.bc(!0,o,null,"Cannot complete a future with itself"),s)) -return}r=b.a&1 -s=o.a=s|r -if((s&24)===0){q=b.c -b.a=b.a&1|4 -b.c=o -o.fz(q) -return}if(!c)if(b.c==null)o=(s&16)===0||r!==0 -else o=!1 -else o=!0 -if(o){q=b.bT() -b.cE(p.a) -A.cN(b,q) -return}b.a^=2 -b.b.b2(new A.mN(p,b))}, -cN(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g={},f=g.a=a -for(;;){s={} -r=f.a -q=(r&16)===0 -p=!q -if(b==null){if(p&&(r&1)===0){r=f.c -f.b.c8(r.a,r.b)}return}s.a=b -o=b.a -for(f=b;o!=null;f=o,o=n){f.a=null -A.cN(g.a,f) -s.a=o -n=o.a}r=g.a -m=r.c -s.b=p -s.c=m -if(q){l=f.c -l=(l&1)!==0||(l&15)===8}else l=!0 -if(l){k=f.b.b -if(p){f=r.b -f=!(f===k||f.gaK()===k.gaK())}else f=!1 -if(f){f=g.a -r=f.c -f.b.c8(r.a,r.b) -return}j=$.n -if(j!==k)$.n=k -else j=null -f=s.a.c -if((f&15)===8)new A.mR(s,g,p).$0() -else if(q){if((f&1)!==0)new A.mQ(s,m).$0()}else if((f&2)!==0)new A.mP(g,s).$0() -if(j!=null)$.n=j -f=s.c -if(f instanceof A.m){r=s.a.$ti -r=r.h("C<2>").b(f)||!r.y[1].b(f)}else r=!1 -if(r){i=s.a.b -if((f.a&24)!==0){h=i.c -i.c=null -b=i.cL(h) -i.a=f.a&30|i.a&1 -i.c=f.c -g.a=f -continue}else A.mM(f,i,!0) -return}}i=s.a.b -h=i.c -i.c=null -b=i.cL(h) -f=s.b -r=s.c -if(!f){i.a=8 -i.c=r}else{i.a=i.a&1|16 -i.c=r}g.a=i -f=i}}, -wO(a,b){if(t._.b(a))return b.cj(a,t.z,t.K,t.l) -if(t.bI.b(a))return b.bD(a,t.z,t.K) -throw A.b(A.ae(a,"onError",u.c))}, -wF(){var s,r -for(s=$.dZ;s!=null;s=$.dZ){$.fC=null -r=s.b -$.dZ=r -if(r==null)$.fB=null -s.a.$0()}}, -wZ(){$.pf=!0 -try{A.wF()}finally{$.fC=null -$.pf=!1 -if($.dZ!=null)$.pD().$1(A.rM())}}, -rG(a){var s=new A.i9(a),r=$.fB -if(r==null){$.dZ=$.fB=s -if(!$.pf)$.pD().$1(A.rM())}else $.fB=r.b=s}, -wW(a){var s,r,q,p=$.dZ -if(p==null){A.rG(a) -$.fC=$.fB -return}s=new A.i9(a) -r=$.fC -if(r==null){s.b=p -$.dZ=$.fC=s}else{q=r.b -s.b=q -$.fC=r.b=s -if(q==null)$.fB=s}}, -pv(a){var s,r=null,q=$.n -if(B.d===q){A.nV(r,r,B.d,a) -return}if(B.d===q.ge4().a)s=B.d.gaK()===q.gaK() -else s=!1 -if(s){A.nV(r,r,q,q.aB(a,t.H)) -return}s=$.n -s.b2(s.c3(a))}, -yp(a){return new A.dO(A.cW(a,"stream",t.K))}, -eL(a,b,c,d){var s=null -return c?new A.dS(b,s,s,a,d.h("dS<0>")):new A.dA(b,s,s,a,d.h("dA<0>"))}, -iW(a){var s,r,q -if(a==null)return -try{a.$0()}catch(q){s=A.I(q) -r=A.a8(q) -$.n.c8(s,r)}}, -vq(a,b,c,d,e,f){var s=$.n,r=e?1:0,q=c!=null?32:0,p=A.ie(s,b,f),o=A.ig(s,c),n=d==null?A.rL():d -return new A.cg(a,p,o,s.aB(n,t.H),s,r|q,f.h("cg<0>"))}, -ie(a,b,c){var s=b==null?A.x9():b -return a.bD(s,t.H,c)}, -ig(a,b){if(b==null)b=A.xa() -if(t.da.b(b))return a.cj(b,t.z,t.K,t.l) -if(t.d5.b(b))return a.bD(b,t.z,t.K) -throw A.b(A.K("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace.",null))}, -wH(a){}, -wJ(a,b){$.n.c8(a,b)}, -wI(){}, -wU(a,b,c){var s,r,q,p -try{b.$1(a.$0())}catch(p){s=A.I(p) -r=A.a8(p) -q=A.dY(s,r) -if(q!=null)c.$2(q.a,q.b) -else c.$2(s,r)}}, -we(a,b,c){var s=a.I() -if(s!==$.co())s.ak(new A.nM(b,c)) -else b.V(c)}, -wf(a,b){return new A.nL(a,b)}, -rn(a,b,c){var s=a.I() -if(s!==$.co())s.ak(new A.nN(b,c)) -else b.b5(c)}, -vC(a,b,c){return new A.dM(new A.nh(null,null,a,c,b),b.h("@<0>").H(c).h("dM<1,2>"))}, -v0(a,b){var s=$.n -if(s===B.d)return s.ej(a,b) -return s.ej(a,s.c3(b))}, -t2(a,b,c,d){return A.wV(a,c,b,d)}, -wV(a,b,c,d){return $.n.hb(c,b).bd(a,d)}, -wS(a,b,c,d,e){A.fD(d,e)}, -fD(a,b){A.wW(new A.nS(a,b))}, -nT(a,b,c,d){var s,r=$.n -if(r===c)return d.$0() -$.n=c -s=r -try{r=d.$0() -return r}finally{$.n=s}}, -nU(a,b,c,d,e){var s,r=$.n -if(r===c)return d.$1(e) -$.n=c -s=r -try{r=d.$1(e) -return r}finally{$.n=s}}, -ph(a,b,c,d,e,f){var s,r=$.n -if(r===c)return d.$2(e,f) -$.n=c -s=r -try{r=d.$2(e,f) -return r}finally{$.n=s}}, -rC(a,b,c,d){return d}, -rD(a,b,c,d){return d}, -rB(a,b,c,d){return d}, -wR(a,b,c,d,e){return null}, -nV(a,b,c,d){var s,r -if(B.d!==c){s=B.d.gaK() -r=c.gaK() -d=s!==r?c.c3(d):c.cY(d,t.H)}A.rG(d)}, -wQ(a,b,c,d,e){e=c.cY(e,t.H) -return A.oT(d,e)}, -wP(a,b,c,d,e){var s -e=c.m1(e,t.H,t.aF) -s=d.gm4() -return A.vE(s.m_(0,0)?0:s,e)}, -wT(a,b,c,d){A.t_(d)}, -rA(a,b,c,d,e){var s,r,q,p -if(e!=null){s=t.X -r=A.uv(s,s) -r.ag(0,e)}else r=null -s=new A.ih(c.gfJ(),c.gfL(),c.gfK(),c.gfF(),c.gfG(),c.gfE(),c.gfj(),c.ge4(),c.gfe(),c.gfd(),c.gfA(),c.gfm(),c.gdX(),c.ged(),c) -if(d!=null){q=d.x -if(q!=null)s.w=new A.iU(s,q) -p=d.a -if(p!=null)s.as=new A.iT(s,p)}if(r!=null)s.at=new A.iV(s,r) -return s}, -mc:function mc(a){this.a=a}, -mb:function mb(a,b,c){this.a=a -this.b=b -this.c=c}, -md:function md(a){this.a=a}, -me:function me(a){this.a=a}, -iN:function iN(){this.c=0}, -nn:function nn(a,b){this.a=a -this.b=b}, -nm:function nm(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -i8:function i8(a,b){this.a=a -this.b=!1 -this.$ti=b}, -nJ:function nJ(a){this.a=a}, -nK:function nK(a){this.a=a}, -nY:function nY(a){this.a=a}, -iL:function iL(a){var _=this -_.a=a -_.e=_.d=_.c=_.b=null}, -dR:function dR(a,b){this.a=a -this.$ti=b}, -W:function W(a,b){this.a=a -this.b=b}, -eU:function eU(a,b){this.a=a -this.$ti=b}, -cL:function cL(a,b,c,d,e,f,g){var _=this -_.ay=0 -_.CW=_.ch=null -_.w=a -_.a=b -_.b=c -_.c=d -_.d=e -_.e=f -_.r=_.f=null -_.$ti=g}, -cK:function cK(){}, -fo:function fo(a,b,c){var _=this -_.a=a -_.b=b -_.c=0 -_.r=_.f=_.e=_.d=null -_.$ti=c}, -nj:function nj(a,b){this.a=a -this.b=b}, -nl:function nl(a,b,c){this.a=a -this.b=b -this.c=c}, -nk:function nk(a){this.a=a}, -kj:function kj(a,b,c){this.a=a -this.b=b -this.c=c}, -kl:function kl(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -kk:function kk(a,b,c,d,e,f){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e -_.f=f}, -ke:function ke(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -kf:function kf(a,b,c){this.a=a -this.b=b -this.c=c}, -eB:function eB(a,b){this.c=a -this.d=b}, -f6:function f6(a,b){var _=this -_.a=a -_.c=_.b=null -_.$ti=b}, -mH:function mH(a,b){this.a=a -this.b=b}, -mI:function mI(a,b){this.a=a -this.b=b}, -mG:function mG(a,b,c){this.a=a -this.b=b -this.c=c}, -dB:function dB(){}, -a6:function a6(a,b){this.a=a -this.$ti=b}, -Z:function Z(a,b){this.a=a -this.$ti=b}, -bv:function bv(a,b,c,d,e){var _=this -_.a=null -_.b=a -_.c=b -_.d=c -_.e=d -_.$ti=e}, -m:function m(a,b){var _=this -_.a=0 -_.b=a -_.c=null -_.$ti=b}, -mJ:function mJ(a,b){this.a=a -this.b=b}, -mO:function mO(a,b){this.a=a -this.b=b}, -mN:function mN(a,b){this.a=a -this.b=b}, -mL:function mL(a,b){this.a=a -this.b=b}, -mK:function mK(a,b){this.a=a -this.b=b}, -mR:function mR(a,b,c){this.a=a -this.b=b -this.c=c}, -mS:function mS(a,b){this.a=a -this.b=b}, -mT:function mT(a){this.a=a}, -mQ:function mQ(a,b){this.a=a -this.b=b}, -mP:function mP(a,b){this.a=a -this.b=b}, -i9:function i9(a){this.a=a -this.b=null}, -Y:function Y(){}, -ll:function ll(a,b){this.a=a -this.b=b}, -lm:function lm(a,b){this.a=a -this.b=b}, -lj:function lj(a){this.a=a}, -lk:function lk(a,b,c){this.a=a -this.b=b -this.c=c}, -lh:function lh(a,b){this.a=a -this.b=b}, -li:function li(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -lf:function lf(a,b){this.a=a -this.b=b}, -lg:function lg(a,b,c){this.a=a -this.b=b -this.c=c}, -hN:function hN(){}, -cT:function cT(){}, -ng:function ng(a){this.a=a}, -nf:function nf(a){this.a=a}, -iM:function iM(){}, -ia:function ia(){}, -dA:function dA(a,b,c,d,e){var _=this -_.a=null -_.b=0 -_.c=null -_.d=a -_.e=b -_.f=c -_.r=d -_.$ti=e}, -dS:function dS(a,b,c,d,e){var _=this -_.a=null -_.b=0 -_.c=null -_.d=a -_.e=b -_.f=c -_.r=d -_.$ti=e}, -au:function au(a,b){this.a=a -this.$ti=b}, -cg:function cg(a,b,c,d,e,f,g){var _=this -_.w=a -_.a=b -_.b=c -_.c=d -_.d=e -_.e=f -_.r=_.f=null -_.$ti=g}, -dP:function dP(a){this.a=a}, -ag:function ag(){}, -mp:function mp(a,b,c){this.a=a -this.b=b -this.c=c}, -mo:function mo(a){this.a=a}, -dN:function dN(){}, -ij:function ij(){}, -dD:function dD(a){this.b=a -this.a=null}, -eY:function eY(a,b){this.b=a -this.c=b -this.a=null}, -my:function my(){}, -fg:function fg(){this.a=0 -this.c=this.b=null}, -n6:function n6(a,b){this.a=a -this.b=b}, -f_:function f_(a){this.a=1 -this.b=a -this.c=null}, -dO:function dO(a){this.a=null -this.b=a -this.c=!1}, -nM:function nM(a,b){this.a=a -this.b=b}, -nL:function nL(a,b){this.a=a -this.b=b}, -nN:function nN(a,b){this.a=a -this.b=b}, -f4:function f4(){}, -dE:function dE(a,b,c,d,e,f,g){var _=this -_.w=a -_.x=null -_.a=b -_.b=c -_.c=d -_.d=e -_.e=f -_.r=_.f=null -_.$ti=g}, -fb:function fb(a,b,c){this.b=a -this.a=b -this.$ti=c}, -f1:function f1(a){this.a=a}, -dL:function dL(a,b,c,d,e,f){var _=this -_.w=$ -_.x=null -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e -_.r=_.f=null -_.$ti=f}, -fn:function fn(){}, -eT:function eT(a,b,c){this.a=a -this.b=b -this.$ti=c}, -dF:function dF(a,b,c,d,e){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.$ti=e}, -dM:function dM(a,b){this.a=a -this.$ti=b}, -nh:function nh(a,b,c,d,e){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e}, -nG:function nG(a,b){this.a=a -this.b=b}, -nI:function nI(a,b){this.a=a -this.b=b}, -nH:function nH(a,b){this.a=a -this.b=b}, -nE:function nE(a,b){this.a=a -this.b=b}, -nF:function nF(a,b){this.a=a -this.b=b}, -nD:function nD(a,b){this.a=a -this.b=b}, -nA:function nA(a,b){this.a=a -this.b=b}, -iU:function iU(a,b){this.a=a -this.b=b}, -nz:function nz(a,b){this.a=a -this.b=b}, -ny:function ny(){}, -nC:function nC(a,b){this.a=a -this.b=b}, -nB:function nB(a,b){this.a=a -this.b=b}, -iT:function iT(a,b){this.a=a -this.b=b}, -iV:function iV(a,b){this.a=a -this.b=b}, -iS:function iS(){}, -ih:function ih(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e -_.f=f -_.r=g -_.w=h -_.x=i -_.y=j -_.z=k -_.Q=l -_.as=m -_.at=n -_.ax=null -_.ay=o}, -mw:function mw(a,b,c){this.a=a -this.b=b -this.c=c}, -mv:function mv(a,b){this.a=a -this.b=b}, -mx:function mx(a,b,c){this.a=a -this.b=b -this.c=c}, -iG:function iG(){}, -nb:function nb(a,b,c){this.a=a -this.b=b -this.c=c}, -na:function na(a,b){this.a=a -this.b=b}, -nc:function nc(a,b,c){this.a=a -this.b=b -this.c=c}, -dV:function dV(a){this.a=a}, -nS:function nS(a,b){this.a=a -this.b=b}, -eQ:function eQ(a,b,c,d,e,f,g,h,i,j,k,l,m){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e -_.f=f -_.r=g -_.w=h -_.x=i -_.y=j -_.z=k -_.Q=l -_.as=m}, -uv(a,b){return new A.cO(a.h("@<0>").H(b).h("cO<1,2>"))}, -qW(a,b){var s=a[b] -return s===a?null:s}, -p3(a,b,c){if(c==null)a[b]=a -else a[b]=c}, -p2(){var s=Object.create(null) -A.p3(s,"",s) -delete s[""] -return s}, -uD(a,b){return new A.bA(a.h("@<0>").H(b).h("bA<1,2>"))}, -uE(a,b,c){return A.xw(a,new A.bA(b.h("@<0>").H(c).h("bA<1,2>")))}, -ap(a,b){return new A.bA(a.h("@<0>").H(b).h("bA<1,2>"))}, -oI(a){return new A.f9(a.h("f9<0>"))}, -p4(){var s=Object.create(null) -s[""]=s -delete s[""] -return s}, -iw(a,b,c){var s=new A.dI(a,b,c.h("dI<0>")) -s.c=a.e -return s}, -oJ(a){var s,r -if(A.pr(a))return"{...}" -s=new A.aD("") -try{r={} -$.cV.push(a) -s.a+="{" -r.a=!0 -a.av(0,new A.kF(r,s)) -s.a+="}"}finally{$.cV.pop()}r=s.a -return r.charCodeAt(0)==0?r:r}, -cO:function cO(a){var _=this -_.a=0 -_.e=_.d=_.c=_.b=null -_.$ti=a}, -mV:function mV(a){this.a=a}, -mU:function mU(a){this.a=a}, -dG:function dG(a){var _=this -_.a=0 -_.e=_.d=_.c=_.b=null -_.$ti=a}, -cP:function cP(a,b){this.a=a -this.$ti=b}, -iq:function iq(a,b,c){var _=this -_.a=a -_.b=b -_.c=0 -_.d=null -_.$ti=c}, -f9:function f9(a){var _=this -_.a=0 -_.f=_.e=_.d=_.c=_.b=null -_.r=0 -_.$ti=a}, -n4:function n4(a){this.a=a -this.c=this.b=null}, -dI:function dI(a,b,c){var _=this -_.a=a -_.b=b -_.d=_.c=null -_.$ti=c}, -cB:function cB(a){var _=this -_.b=_.a=0 -_.c=null -_.$ti=a}, -ix:function ix(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=null -_.d=c -_.e=!1 -_.$ti=d}, -az:function az(){}, -w:function w(){}, -S:function S(){}, -kE:function kE(a){this.a=a}, -kF:function kF(a,b){this.a=a -this.b=b}, -fa:function fa(a,b){this.a=a -this.$ti=b}, -iy:function iy(a,b,c){var _=this -_.a=a -_.b=b -_.c=null -_.$ti=c}, -dp:function dp(){}, -fj:function fj(){}, -w_(a,b,c){var s,r,q,p,o=c-b -if(o<=4096)s=$.tw() -else s=new Uint8Array(o) -for(r=J.a5(a),q=0;q=16)return null -r=r*16+o}n=h-1 -i[h]=r -for(;s=16)return null -r=r*16+o}m=n-1 -i[n]=r}if(j===1&&i[0]===0)return $.bb() -l=A.aS(j,i) -return new A.aa(l===0?!1:c,i,l)}, -vp(a,b){var s,r,q,p,o -if(a==="")return null -s=$.tq().a9(a) -if(s==null)return null -r=s.b -q=r[1]==="-" -p=r[4] -o=r[3] -if(p!=null)return A.vm(p,q) -if(o!=null)return A.vn(o,2,q) -return null}, -aS(a,b){for(;;){if(!(a>0&&b[a-1]===0))break;--a}return a}, -p_(a,b,c,d){var s,r=new Uint16Array(d),q=c-b -for(s=0;s>>0)+(o>>>4)-1075 -m=new Uint16Array(4) -m[0]=(r[1]<<8>>>0)+r[0] -m[1]=(r[3]<<8>>>0)+r[2] -m[2]=(r[5]<<8>>>0)+r[4] -m[3]=o&15|16 -l=new A.aa(!1,m,4) -if(n<0)k=l.bj(0,-n) -else k=n>0?l.aG(0,n):l -if(s)return k.al(0) -return k}, -p0(a,b,c,d){var s,r,q -if(b===0)return 0 -if(c===0&&d===a)return b -for(s=b-1,r=d.$flags|0;s>=0;--s){q=a[s] -r&2&&A.z(d) -d[s+c]=q}for(s=c-1;s>=0;--s){r&2&&A.z(d) -d[s]=0}return b+c}, -qT(a,b,c,d){var s,r,q,p,o,n=B.b.M(c,16),m=B.b.ac(c,16),l=16-m,k=B.b.aG(1,l)-1 -for(s=b-1,r=d.$flags|0,q=0;s>=0;--s){p=a[s] -o=B.b.bj(p,l) -r&2&&A.z(d) -d[s+n+1]=(o|q)>>>0 -q=B.b.aG((p&k)>>>0,m)}r&2&&A.z(d) -d[n]=q}, -qO(a,b,c,d){var s,r,q,p,o=B.b.M(c,16) -if(B.b.ac(c,16)===0)return A.p0(a,b,o,d) -s=b+o+1 -A.qT(a,b,c,d) -for(r=d.$flags|0,q=o;--q,q>=0;){r&2&&A.z(d) -d[q]=0}p=s-1 -return d[p]===0?p:s}, -vo(a,b,c,d){var s,r,q,p,o=B.b.M(c,16),n=B.b.ac(c,16),m=16-n,l=B.b.aG(1,n)-1,k=B.b.bj(a[o],n),j=b-o-1 -for(s=d.$flags|0,r=0;r>>0,m) -s&2&&A.z(d) -d[r]=(p|k)>>>0 -k=B.b.bj(q,n)}s&2&&A.z(d) -d[j]=k}, -ml(a,b,c,d){var s,r=b-d -if(r===0)for(s=b-1;s>=0;--s){r=a[s]-c[s] -if(r!==0)return r}return r}, -vk(a,b,c,d,e){var s,r,q -for(s=e.$flags|0,r=0,q=0;q=0;e=o,c=q){q=c+1 -p=a*b[c]+d[e]+r -o=e+1 -s&2&&A.z(d) -d[e]=p&65535 -r=B.b.M(p,65536)}for(;r!==0;e=o){n=d[e]+r -o=e+1 -s&2&&A.z(d) -d[e]=n&65535 -r=B.b.M(n,65536)}}, -vl(a,b,c){var s,r=b[c] -if(r===a)return 65535 -s=B.b.f1((r<<16|b[c-1])>>>0,a) -if(s>65535)return 65535 -return s}, -uk(a){throw A.b(A.ae(a,"object","Expandos are not allowed on strings, numbers, bools, records or null"))}, -mF(a,b){var s=$.ts() -s=s==null?null:new s(A.cm(A.ya(a,b),1)) -return new A.io(s,b.h("io<0>"))}, -bk(a,b){var s=A.qn(a,b) -if(s!=null)return s -throw A.b(A.al(a,null,null))}, -uj(a,b){a=A.ab(a,new Error()) -a.stack=b.i(0) -throw a}, -b7(a,b,c,d){var s,r=c?J.q7(a,d):J.q6(a,d) -if(a!==0&&b!=null)for(s=0;s")) -for(s=J.a0(a);s.k();)r.push(s.gm()) -r.$flags=1 -return r}, -am(a,b){var s,r -if(Array.isArray(a))return A.f(a.slice(0),b.h("u<0>")) -s=A.f([],b.h("u<0>")) -for(r=J.a0(a);r.k();)s.push(r.gm()) -return s}, -aO(a,b){var s=A.uG(a,!1,b) -s.$flags=3 -return s}, -qy(a,b,c){var s,r,q,p,o -A.ac(b,"start") -s=c==null -r=!s -if(r){q=c-b -if(q<0)throw A.b(A.X(c,b,null,"end",null)) -if(q===0)return""}if(Array.isArray(a)){p=a -o=p.length -if(s)c=o -return A.qp(b>0||c0)a=J.e6(a,b) -s=A.am(a,t.S) -return A.qp(s)}, -qx(a){return A.aR(a)}, -uZ(a,b,c){var s=a.length -if(b>=s)return"" -return A.uR(a,b,c==null||c>s?s:c)}, -H(a,b,c,d,e){return new A.cA(a,A.oF(a,d,b,e,c,""))}, -oQ(a,b,c){var s=J.a0(b) -if(!s.k())return a -if(c.length===0){do a+=A.t(s.gm()) -while(s.k())}else{a+=A.t(s.gm()) -while(s.k())a=a+c+A.t(s.gm())}return a}, -hY(){var s,r,q=A.uM() -if(q==null)throw A.b(A.a3("'Uri.base' is not supported")) -s=$.qJ -if(s!=null&&q===$.qI)return s -r=A.bu(q) -$.qJ=r -$.qI=q -return r}, -vY(a,b,c,d){var s,r,q,p,o,n="0123456789ABCDEF" -if(c===B.j){s=$.tt() -s=s.b.test(b)}else s=!1 -if(s)return b -r=B.i.a4(b) -for(s=r.length,q=0,p="";q>>4&15]+n[o&15]}return p.charCodeAt(0)==0?p:p}, -ld(){return A.a8(new Error())}, -pU(a,b,c){var s="microsecond" -if(b>999)throw A.b(A.X(b,0,999,s,null)) -if(a<-864e13||a>864e13)throw A.b(A.X(a,-864e13,864e13,"millisecondsSinceEpoch",null)) -if(a===864e13&&b!==0)throw A.b(A.ae(b,s,"Time including microseconds is outside valid range")) -A.cW(c,"isUtc",t.y) -return a}, -uf(a){var s=Math.abs(a),r=a<0?"-":"" -if(s>=1000)return""+a -if(s>=100)return r+"0"+s -if(s>=10)return r+"00"+s -return r+"000"+s}, -pT(a){if(a>=100)return""+a -if(a>=10)return"0"+a -return"00"+a}, -fY(a){if(a>=10)return""+a -return"0"+a}, -pV(a,b){return new A.by(a+1000*b)}, -ow(a,b){var s,r -for(s=0;s<5;++s){r=a[s] -if(r.b===b)return r}throw A.b(A.ae(b,"name","No enum value with that name"))}, -ui(a,b){var s,r,q=A.ap(t.N,b) -for(s=0;s<2;++s){r=a[s] -q.t(0,r.b,r)}return q}, -h6(a){if(typeof a=="number"||A.bR(a)||a==null)return J.b3(a) -if(typeof a=="string")return JSON.stringify(a) -return A.qo(a)}, -pY(a,b){A.cW(a,"error",t.K) -A.cW(b,"stackTrace",t.l) -A.uj(a,b)}, -e7(a){return new A.fL(a)}, -K(a,b){return new A.bc(!1,null,b,a)}, -ae(a,b,c){return new A.bc(!0,a,b,c)}, -bU(a,b){return a}, -kO(a,b){return new A.dk(null,null,!0,a,b,"Value not in range")}, -X(a,b,c,d,e){return new A.dk(b,c,!0,a,d,"Invalid value")}, -qs(a,b,c,d){if(ac)throw A.b(A.X(a,b,c,d,null)) -return a}, -uT(a,b,c,d){if(0>a||a>=d)A.D(A.hc(a,d,b,null,c)) -return a}, -bd(a,b,c){if(0>a||a>c)throw A.b(A.X(a,0,c,"start",null)) -if(b!=null){if(a>b||b>c)throw A.b(A.X(b,a,c,"end",null)) -return b}return c}, -ac(a,b){if(a<0)throw A.b(A.X(a,0,null,b,null)) -return a}, -q4(a,b){var s=b.b -return new A.en(s,!0,a,null,"Index out of range")}, -hc(a,b,c,d,e){return new A.en(b,!0,a,e,"Index out of range")}, -a3(a){return new A.eN(a)}, -qF(a){return new A.hR(a)}, -A(a){return new A.aI(a)}, -ao(a){return new A.fT(a)}, -k5(a){return new A.im(a)}, -al(a,b,c){return new A.aF(a,b,c)}, -ux(a,b,c){var s,r -if(A.pr(a)){if(b==="("&&c===")")return"(...)" -return b+"..."+c}s=A.f([],t.s) -$.cV.push(a) -try{A.wE(a,s)}finally{$.cV.pop()}r=A.oQ(b,s,", ")+c -return r.charCodeAt(0)==0?r:r}, -oD(a,b,c){var s,r -if(A.pr(a))return b+"..."+c -s=new A.aD(b) -$.cV.push(a) -try{r=s -r.a=A.oQ(r.a,a,", ")}finally{$.cV.pop()}s.a+=c -r=s.a -return r.charCodeAt(0)==0?r:r}, -wE(a,b){var s,r,q,p,o,n,m,l=a.gq(a),k=0,j=0 -for(;;){if(!(k<80||j<3))break -if(!l.k())return -s=A.t(l.gm()) -b.push(s) -k+=s.length+2;++j}if(!l.k()){if(j<=5)return -r=b.pop() -q=b.pop()}else{p=l.gm();++j -if(!l.k()){if(j<=4){b.push(A.t(p)) -return}r=A.t(p) -q=b.pop() -k+=r.length+2}else{o=l.gm();++j -for(;l.k();p=o,o=n){n=l.gm();++j -if(j>100){for(;;){if(!(k>75&&j>3))break -k-=b.pop().length+2;--j}b.push("...") -return}}q=A.t(p) -r=A.t(o) -k+=r.length+q.length+4}}if(j>b.length+2){k+=5 -m="..."}else m=null -for(;;){if(!(k>80&&b.length>3))break -k-=b.pop().length+2 -if(m==null){k+=5 -m="..."}}if(m!=null)b.push(m) -b.push(q) -b.push(r)}, -ez(a,b,c,d){var s -if(B.f===c){s=J.aE(a) -b=J.aE(b) -return A.oR(A.ca(A.ca($.op(),s),b))}if(B.f===d){s=J.aE(a) -b=J.aE(b) -c=J.aE(c) -return A.oR(A.ca(A.ca(A.ca($.op(),s),b),c))}s=J.aE(a) -b=J.aE(b) -c=J.aE(c) -d=J.aE(d) -d=A.oR(A.ca(A.ca(A.ca(A.ca($.op(),s),b),c),d)) -return d}, -xW(a){var s=A.t(a),r=$.wL -if(r==null)A.t_(s) -else r.$1(s)}, -qH(a){var s,r=null,q=new A.aD(""),p=A.f([-1],t.t) -A.v8(r,r,r,q,p) -p.push(q.a.length) -q.a+="," -A.v7(256,B.af.kB(a),q) -s=q.a -return new A.hW(s.charCodeAt(0)==0?s:s,p,r).geR()}, -bu(a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3=null,a4=a5.length -if(a4>=5){s=((a5.charCodeAt(4)^58)*3|a5.charCodeAt(0)^100|a5.charCodeAt(1)^97|a5.charCodeAt(2)^116|a5.charCodeAt(3)^97)>>>0 -if(s===0)return A.qG(a4=14)r[7]=a4 -q=r[1] -if(q>=0)if(A.rF(a5,0,q,20,r)===20)r[7]=q -p=r[2]+1 -o=r[3] -n=r[4] -m=r[5] -l=r[6] -if(lq+3)){i=o>0 -if(!(i&&o+1===n)){if(!B.a.C(a5,"\\",n))if(p>0)h=B.a.C(a5,"\\",p-1)||B.a.C(a5,"\\",p-2) -else h=!1 -else h=!0 -if(!h){if(!(mn+2&&B.a.C(a5,"/..",m-3) -else h=!0 -if(!h)if(q===4){if(B.a.C(a5,"file",0)){if(p<=0){if(!B.a.C(a5,"/",n)){g="file:///" -s=3}else{g="file://" -s=2}a5=g+B.a.p(a5,n,a4) -m+=s -l+=s -a4=a5.length -p=7 -o=7 -n=7}else if(n===m){++l -f=m+1 -a5=B.a.aO(a5,n,m,"/");++a4 -m=f}j="file"}else if(B.a.C(a5,"http",0)){if(i&&o+3===n&&B.a.C(a5,"80",o+1)){l-=3 -e=n-3 -m-=3 -a5=B.a.aO(a5,o,n,"") -a4-=3 -n=e}j="http"}}else if(q===5&&B.a.C(a5,"https",0)){if(i&&o+4===n&&B.a.C(a5,"443",o+1)){l-=4 -e=n-4 -m-=4 -a5=B.a.aO(a5,o,n,"") -a4-=3 -n=e}j="https"}k=!h}}}}if(k)return new A.b8(a40)j=A.nt(a5,0,q) -else{if(q===0)A.dT(a5,0,"Invalid empty scheme") -j=""}d=a3 -if(p>0){c=q+3 -b=c=c?0:a.charCodeAt(q) -m=n^48 -if(m<=9){if(o!==0||q===r){o=o*10+m -if(o<=255){++q -continue}A.hX("each part must be in the range 0..255",a,r)}A.hX("parts must not have leading zeros",a,r)}if(q===r){if(q===c)break -A.hX(k,a,q)}l=p+1 -s&2&&A.z(d) -d[e+p]=o -if(n===46){if(l<4){++q -p=l -r=q -o=0 -continue}break}if(q===c){if(l===4)return -break}A.hX(k,a,q) -p=l}A.hX("IPv4 address should contain exactly 4 parts",a,q)}, -va(a,b,c){var s -if(b===c)throw A.b(A.al("Empty IP address",a,b)) -if(a.charCodeAt(b)===118){s=A.vb(a,b,c) -if(s!=null)throw A.b(s) -return!1}A.qK(a,b,c) -return!0}, -vb(a,b,c){var s,r,q,p,o="Missing hex-digit in IPvFuture address";++b -for(s=b;;s=r){if(s=97&&p<=102)continue -if(q===46){if(r-1===b)return new A.aF(o,a,r) -s=r -break}return new A.aF("Unexpected character",a,r-1)}if(s-1===b)return new A.aF(o,a,s) -return new A.aF("Missing '.' in IPvFuture address",a,s)}if(s===c)return new A.aF("Missing address in IPvFuture address, host, cursor",null,null) -for(;;){if((u.v.charCodeAt(a.charCodeAt(s))&16)!==0){++s -if(s=a3?0:a1.charCodeAt(p) -A:{k=l^48 -j=!1 -if(k<=9)i=k -else{h=l|32 -if(h>=97&&h<=102)i=h-87 -else break A -m=j}if(po){if(l===46){if(m){if(q<=6){A.v9(a1,o,a3,s,q*2) -q+=2 -p=a3 -break}a0.$2(a,o)}break}g=q*2 -s[g]=B.b.L(n,8) -s[g+1]=n&255;++q -if(l===58){if(q<8){++p -o=p -n=0 -m=!0 -continue}a0.$2(a,p)}break}if(l===58){if(r<0){f=q+1;++p -r=q -q=f -o=p -continue}a0.$2("only one wildcard `::` is allowed",p)}if(r!==q-1)a0.$2("missing part",p) -break}if(p0){c=e*2 -b=16-d*2 -B.e.N(s,b,16,s,c) -B.e.en(s,c,b,0)}}return s}, -fv(a,b,c,d,e,f,g){return new A.fu(a,b,c,d,e,f,g)}, -an(a,b,c,d){var s,r,q,p,o,n,m,l,k=null -d=d==null?"":A.nt(d,0,d.length) -s=A.rf(k,0,0) -a=A.rc(a,0,a==null?0:a.length,!1) -r=A.re(k,0,0,k) -q=A.rb(k,0,0) -p=A.ns(k,d) -o=d==="file" -if(a==null)n=s.length!==0||p!=null||o -else n=!1 -if(n)a="" -n=a==null -m=!n -b=A.rd(b,0,b==null?0:b.length,c,d,m) -l=d.length===0 -if(l&&n&&!B.a.u(b,"/"))b=A.p9(b,!l||m) -else b=A.cU(b) -return A.fv(d,s,n&&B.a.u(b,"//")?"":a,p,b,r,q)}, -r8(a){if(a==="http")return 80 -if(a==="https")return 443 -return 0}, -dT(a,b,c){throw A.b(A.al(c,a,b))}, -r7(a,b){return b?A.vU(a,!1):A.vT(a,!1)}, -vP(a,b){var s,r,q -for(s=a.length,r=0;r")),r=r.h("Q.E");s.k();){q=s.d -if(q==null)q=r.a(q) -if(B.a.G(q,A.H('["*/:<>?\\\\|]',!0,!1,!1,!1)))if(b)throw A.b(A.K("Illegal character in path",null)) -else throw A.b(A.a3("Illegal character in path: "+q))}}, -vQ(a,b){var s,r="Illegal drive letter " -if(!(65<=a&&a<=90))s=97<=a&&a<=122 -else s=!0 -if(s)return -if(b)throw A.b(A.K(r+A.qx(a),null)) -else throw A.b(A.a3(r+A.qx(a)))}, -vT(a,b){var s=null,r=A.f(a.split("/"),t.s) -if(B.a.u(a,"/"))return A.an(s,s,r,"file") -else return A.an(s,s,r,s)}, -vU(a,b){var s,r,q,p,o="\\",n=null,m="file" -if(B.a.u(a,"\\\\?\\"))if(B.a.C(a,"UNC\\",4))a=B.a.aO(a,0,7,o) -else{a=B.a.K(a,4) -if(a.length<3||a.charCodeAt(1)!==58||a.charCodeAt(2)!==92)throw A.b(A.ae(a,"path","Windows paths with \\\\?\\ prefix must be absolute"))}else a=A.bl(a,"/",o) -s=a.length -if(s>1&&a.charCodeAt(1)===58){A.vQ(a.charCodeAt(0),!0) -if(s===2||a.charCodeAt(2)!==92)throw A.b(A.ae(a,"path","Windows paths with drive letter must be absolute")) -r=A.f(a.split(o),t.s) -A.nq(r,!0,1) -return A.an(n,n,r,m)}if(B.a.u(a,o))if(B.a.C(a,o,1)){q=B.a.aY(a,o,2) -s=q<0 -p=s?B.a.K(a,2):B.a.p(a,2,q) -r=A.f((s?"":B.a.K(a,q+1)).split(o),t.s) -A.nq(r,!0,0) -return A.an(p,n,r,m)}else{r=A.f(a.split(o),t.s) -A.nq(r,!0,0) -return A.an(n,n,r,m)}else{r=A.f(a.split(o),t.s) -A.nq(r,!0,0) -return A.an(n,n,r,n)}}, -ns(a,b){if(a!=null&&a===A.r8(b))return null -return a}, -rc(a,b,c,d){var s,r,q,p,o,n,m,l -if(a==null)return null -if(b===c)return"" -if(a.charCodeAt(b)===91){s=c-1 -if(a.charCodeAt(s)!==93)A.dT(a,b,"Missing end `]` to match `[` in host") -r=b+1 -q="" -if(a.charCodeAt(r)!==118){p=A.vR(a,r,s) -if(p=b&&s=b&&s=p){if(i==null)i=new A.aD("") -if(r=o){if(q==null)q=new A.aD("") -if(r")).az(0,"/")}else if(d!=null)throw A.b(A.K("Both path and pathSegments specified",null)) -else s=A.fw(a,b,c,128,!0,!0) -if(s.length===0){if(r)return"/"}else if(q&&!B.a.u(s,"/"))s="/"+s -return A.vV(s,e,f)}, -vV(a,b,c){var s=b.length===0 -if(s&&!c&&!B.a.u(a,"/")&&!B.a.u(a,"\\"))return A.p9(a,!s||c) -return A.cU(a)}, -re(a,b,c,d){if(a!=null)return A.fw(a,b,c,256,!0,!1) -return null}, -rb(a,b,c){if(a==null)return null -return A.fw(a,b,c,256,!0,!1)}, -p8(a,b,c){var s,r,q,p,o,n=b+2 -if(n>=a.length)return"%" -s=a.charCodeAt(b+1) -r=a.charCodeAt(n) -q=A.o7(s) -p=A.o7(r) -if(q<0||p<0)return"%" -o=q*16+p -if(o<127&&(u.v.charCodeAt(o)&1)!==0)return A.aR(c&&65<=o&&90>=o?(o|32)>>>0:o) -if(s>=97||r>=97)return B.a.p(a,b,b+3).toUpperCase() -return null}, -p7(a){var s,r,q,p,o,n="0123456789ABCDEF" -if(a<=127){s=new Uint8Array(3) -s[0]=37 -s[1]=n.charCodeAt(a>>>4) -s[2]=n.charCodeAt(a&15)}else{if(a>2047)if(a>65535){r=240 -q=4}else{r=224 -q=3}else{r=192 -q=2}s=new Uint8Array(3*q) -for(p=0;--q,q>=0;r=128){o=B.b.jt(a,6*q)&63|r -s[p]=37 -s[p+1]=n.charCodeAt(o>>>4) -s[p+2]=n.charCodeAt(o&15) -p+=3}}return A.qy(s,0,null)}, -fw(a,b,c,d,e,f){var s=A.rh(a,b,c,d,e,f) -return s==null?B.a.p(a,b,c):s}, -rh(a,b,c,d,e,f){var s,r,q,p,o,n,m,l,k,j=null,i=u.v -for(s=!e,r=b,q=r,p=j;r=2&&A.ra(a.charCodeAt(0)))for(s=1;s127||(u.v.charCodeAt(r)&8)===0)break}return a}, -vX(a,b){if(a.kM("package")&&a.c==null)return A.rH(b,0,b.length) -return-1}, -vS(a,b){var s,r,q -for(s=0,r=0;r<2;++r){q=a.charCodeAt(b+r) -if(48<=q&&q<=57)s=s*16+q-48 -else{q|=32 -if(97<=q&&q<=102)s=s*16+q-87 -else throw A.b(A.K("Invalid URL encoding",null))}}return s}, -pa(a,b,c,d,e){var s,r,q,p,o=b -for(;;){if(!(o127)throw A.b(A.K("Illegal percent encoding in URI",null)) -if(r===37){if(o+3>q)throw A.b(A.K("Truncated URI",null)) -p.push(A.vS(a,o+1)) -o+=2}else p.push(r)}}return d.d_(p)}, -ra(a){var s=a|32 -return 97<=s&&s<=122}, -v8(a,b,c,d,e){d.a=d.a}, -qG(a,b,c){var s,r,q,p,o,n,m,l,k="Invalid MIME type",j=A.f([b-1],t.t) -for(s=a.length,r=b,q=-1,p=null;rb)throw A.b(A.al(k,a,r)) -while(p!==44){j.push(r);++r -for(o=-1;r=0)j.push(o) -else{n=B.c.gD(j) -if(p!==44||r!==n+7||!B.a.C(a,"base64",n+1))throw A.b(A.al("Expecting '='",a,r)) -break}}j.push(r) -m=r+1 -if((j.length&1)===1)a=B.ag.kW(a,m,s) -else{l=A.rh(a,m,s,256,!0,!1) -if(l!=null)a=B.a.aO(a,m,s,l)}return new A.hW(a,j,c)}, -v7(a,b,c){var s,r,q,p,o,n="0123456789ABCDEF" -for(s=b.length,r=0,q=0;q>>4)) -c.a+=o -o=A.aR(n.charCodeAt(p&15)) -c.a+=o}}if((r&4294967040)!==0)for(q=0;q255)throw A.b(A.ae(p,"non-byte value",null))}}, -rF(a,b,c,d,e){var s,r,q -for(s=b;s95)r=31 -q='\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe3\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0e\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\n\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\xeb\xeb\x8b\xeb\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x83\xeb\xeb\x8b\xeb\x8b\xeb\xcd\x8b\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x92\x83\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x8b\xeb\x8b\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xebD\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12D\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe8\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\x05\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x10\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\f\xec\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\xec\f\xec\f\xec\xcd\f\xec\f\f\f\f\f\f\f\f\f\xec\f\f\f\f\f\f\f\f\f\f\xec\f\xec\f\xec\f\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\r\xed\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\xed\r\xed\r\xed\xed\r\xed\r\r\r\r\r\r\r\r\r\xed\r\r\r\r\r\r\r\r\r\r\xed\r\xed\r\xed\r\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0f\xea\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe9\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\t\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x11\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xe9\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\t\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x13\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\xf5\x15\x15\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5'.charCodeAt(d*96+r) -d=q&31 -e[q>>>5]=s}return d}, -r_(a){if(a.b===7&&B.a.u(a.a,"package")&&a.c<=0)return A.rH(a.a,a.e,a.f) -return-1}, -rH(a,b,c){var s,r,q -for(s=b,r=0;s=1)return a.$1(b) -return a.$0()}, -wa(a,b,c,d){if(d>=2)return a.$2(b,c) -if(d===1)return a.$1(b) -return a.$0()}, -wb(a,b,c,d,e){if(e>=3)return a.$3(b,c,d) -if(e===2)return a.$2(b,c) -if(e===1)return a.$1(b) -return a.$0()}, -wc(a,b,c,d,e,f){if(f>=4)return a.$4(b,c,d,e) -if(f===3)return a.$3(b,c,d) -if(f===2)return a.$2(b,c) -if(f===1)return a.$1(b) -return a.$0()}, -wd(a,b,c,d,e,f,g){if(g>=5)return a.$5(b,c,d,e,f) -if(g===4)return a.$4(b,c,d,e) -if(g===3)return a.$3(b,c,d) -if(g===2)return a.$2(b,c) -if(g===1)return a.$1(b) -return a.$0()}, -rz(a){return a==null||A.bR(a)||typeof a=="number"||typeof a=="string"||t.gj.b(a)||t.E.b(a)||t.go.b(a)||t.dQ.b(a)||t.h7.b(a)||t.an.b(a)||t.ai.b(a)||t.h4.b(a)||t.gN.b(a)||t.w.b(a)||t.fd.b(a)}, -xJ(a){if(A.rz(a))return a -return new A.oc(new A.dG(t.hg)).$1(a)}, -pj(a,b,c){return a[b].apply(a,c)}, -rN(a,b){var s,r -if(b==null)return new a() -if(b instanceof Array)switch(b.length){case 0:return new a() -case 1:return new a(b[0]) -case 2:return new a(b[0],b[1]) -case 3:return new a(b[0],b[1],b[2]) -case 4:return new a(b[0],b[1],b[2],b[3])}s=[null] -B.c.ag(s,b) -r=a.bind.apply(a,s) -String(r) -return new r()}, -V(a,b){var s=new A.m($.n,b.h("m<0>")),r=new A.a6(s,b.h("a6<0>")) -a.then(A.cm(new A.oh(r),1),A.cm(new A.oi(r),1)) -return s}, -ry(a){return a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string"||a instanceof Int8Array||a instanceof Uint8Array||a instanceof Uint8ClampedArray||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array||a instanceof ArrayBuffer||a instanceof DataView}, -rO(a){if(A.ry(a))return a -return new A.o1(new A.dG(t.hg)).$1(a)}, -oc:function oc(a){this.a=a}, -oh:function oh(a){this.a=a}, -oi:function oi(a){this.a=a}, -o1:function o1(a){this.a=a}, -rV(a,b){return Math.max(a,b)}, -y_(a){return Math.sqrt(a)}, -xZ(a){return Math.sin(a)}, -xr(a){return Math.cos(a)}, -y5(a){return Math.tan(a)}, -x3(a){return Math.acos(a)}, -x4(a){return Math.asin(a)}, -xn(a){return Math.atan(a)}, -n2:function n2(a){this.a=a}, -d4:function d4(){}, -fZ:function fZ(){}, -hq:function hq(){}, -hz:function hz(){}, -hU:function hU(){}, -ug(a,b){var s=new A.eh(a,b,A.ap(t.S,t.aR),A.eL(null,null,!0,t.al),new A.a6(new A.m($.n,t.D),t.h)) -s.hV(a,!1,b) -return s}, -eh:function eh(a,b,c,d,e){var _=this -_.a=a -_.c=b -_.d=0 -_.e=c -_.f=d -_.r=!1 -_.w=e}, -jV:function jV(a){this.a=a}, -jW:function jW(a,b){this.a=a -this.b=b}, -iA:function iA(a,b){this.a=a -this.b=b}, -fU:function fU(){}, -h2:function h2(a){this.a=a}, -h1:function h1(){}, -jX:function jX(a){this.a=a}, -jY:function jY(a){this.a=a}, -c_:function c_(){}, -as:function as(a,b){this.a=a -this.b=b}, -bg:function bg(a,b){this.a=a -this.b=b}, -aQ:function aQ(a){this.a=a}, -bp:function bp(a,b,c){this.a=a -this.b=b -this.c=c}, -bx:function bx(a){this.a=a}, -dh:function dh(a,b){this.a=a -this.b=b}, -cE:function cE(a,b){this.a=a -this.b=b}, -bX:function bX(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -c3:function c3(a){this.a=a}, -bq:function bq(a,b){this.a=a -this.b=b}, -c2:function c2(a,b){this.a=a -this.b=b}, -c5:function c5(a,b){this.a=a -this.b=b}, -bW:function bW(a,b){this.a=a -this.b=b}, -c6:function c6(a){this.a=a}, -c4:function c4(a,b){this.a=a -this.b=b}, -bG:function bG(a){this.a=a}, -bJ:function bJ(a){this.a=a}, -uW(a,b,c){var s=null,r=t.S,q=A.f([],t.t) -r=new A.kT(a,!1,!0,A.ap(r,t.x),A.ap(r,t.g1),q,new A.fo(s,s,t.dn),A.oI(t.gw),new A.a6(new A.m($.n,t.D),t.h),A.eL(s,s,!1,t.bw)) -r.hX(a,!1,!0) -return r}, -kT:function kT(a,b,c,d,e,f,g,h,i,j){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.f=_.e=0 -_.r=e -_.w=f -_.x=g -_.y=!1 -_.z=h -_.Q=i -_.as=j}, -kY:function kY(a){this.a=a}, -kZ:function kZ(a,b){this.a=a -this.b=b}, -l_:function l_(a,b){this.a=a -this.b=b}, -kU:function kU(a,b){this.a=a -this.b=b}, -kV:function kV(a,b){this.a=a -this.b=b}, -kX:function kX(a,b){this.a=a -this.b=b}, -kW:function kW(a){this.a=a}, -fi:function fi(a,b,c){this.a=a -this.b=b -this.c=c}, -i5:function i5(a){this.a=a}, -m6:function m6(a,b){this.a=a -this.b=b}, -m7:function m7(a,b){this.a=a -this.b=b}, -m4:function m4(){}, -m0:function m0(a,b){this.a=a -this.b=b}, -m1:function m1(){}, -m2:function m2(){}, -m_:function m_(){}, -m5:function m5(){}, -m3:function m3(){}, -dv:function dv(a,b){this.a=a -this.b=b}, -bL:function bL(a,b){this.a=a -this.b=b}, -xX(a,b){var s,r,q={} -q.a=s -q.a=null -s=new A.bV(new A.Z(new A.m($.n,b.h("m<0>")),b.h("Z<0>")),A.f([],t.bT),b.h("bV<0>")) -q.a=s -r=t.X -A.t2(new A.oj(q,a,b),null,A.uE([B.W,s],r,r),t.H) -return q.a}, -pk(){var s=$.n.j(0,B.W) -if(s instanceof A.bV&&s.c)throw A.b(B.v)}, -oj:function oj(a,b,c){this.a=a -this.b=b -this.c=c}, -bV:function bV(a,b,c){var _=this -_.a=a -_.b=b -_.c=!1 -_.$ti=c}, -eb:function eb(){}, -ar:function ar(){}, -e9:function e9(a,b){this.a=a -this.b=b}, -d2:function d2(a,b){this.a=a -this.b=b}, -rr(a){return"SAVEPOINT s"+a}, -rp(a){return"RELEASE s"+a}, -rq(a){return"ROLLBACK TO s"+a}, -jM:function jM(){}, -kL:function kL(){}, -lx:function lx(){}, -kG:function kG(){}, -jP:function jP(){}, -hy:function hy(){}, -k3:function k3(){}, -ib:function ib(){}, -mf:function mf(a,b,c){this.a=a -this.b=b -this.c=c}, -mk:function mk(a,b,c){this.a=a -this.b=b -this.c=c}, -mi:function mi(a,b,c){this.a=a -this.b=b -this.c=c}, -mj:function mj(a,b,c){this.a=a -this.b=b -this.c=c}, -mh:function mh(a,b,c){this.a=a -this.b=b -this.c=c}, -mg:function mg(a,b){this.a=a -this.b=b}, -iO:function iO(){}, -fm:function fm(a,b,c,d,e,f,g,h,i){var _=this -_.y=a -_.z=null -_.Q=b -_.as=c -_.at=d -_.ax=e -_.ay=f -_.ch=g -_.e=h -_.a=i -_.b=0 -_.d=_.c=!1}, -nd:function nd(a){this.a=a}, -ne:function ne(a){this.a=a}, -h_:function h_(){}, -jU:function jU(a,b){this.a=a -this.b=b}, -jT:function jT(a){this.a=a}, -ic:function ic(a,b){var _=this -_.e=a -_.a=b -_.b=0 -_.d=_.c=!1}, -f3:function f3(a,b,c){var _=this -_.e=a -_.f=null -_.r=b -_.a=c -_.b=0 -_.d=_.c=!1}, -mC:function mC(a,b){this.a=a -this.b=b}, -qr(a,b){var s,r,q,p=A.ap(t.N,t.S) -for(s=a.length,r=0;r3)throw A.b("Expected two or three arguments to regexp") -s=a.j(0,0) -q=a.j(0,1) -if(s==null||q==null)return null -if(typeof s!="string"||typeof q!="string")throw A.b("Expected two strings as parameters to regexp") -if(g===3){p=a.j(0,2) -if(A.bw(p)){k=(p&1)===1 -j=(p&2)!==2 -i=(p&4)===4 -h=(p&8)===8}}r=null -try{o=k -n=j -m=i -r=A.H(s,n,h,o,m)}catch(l){if(A.I(l) instanceof A.aF)throw A.b("Invalid regex") -else throw l}o=r.b -return o.test(q)}, -wi(a){var s,r,q=a.a.b -if(q<2||q>3)throw A.b("Expected 2 or 3 arguments to moor_contains") -s=a.j(0,0) -r=a.j(0,1) -if(s==null||r==null)return null -if(typeof s!="string"||typeof r!="string")throw A.b("First two args to contains must be strings") -return q===3&&a.j(0,2)===1?B.a.G(s,r):B.a.G(s.toLowerCase(),r.toLowerCase())}, -k4:function k4(){}, -nW:function nW(a){this.a=a}, -hm:function hm(a){var _=this -_.a=$ -_.b=!1 -_.d=null -_.e=a}, -ky:function ky(a,b){this.a=a -this.b=b}, -kz:function kz(a,b){this.a=a -this.b=b}, -br:function br(){this.a=null}, -kB:function kB(a,b,c,d,e){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e}, -kC:function kC(a,b,c){this.a=a -this.b=b -this.c=c}, -kD:function kD(a,b){this.a=a -this.b=b}, -ve(a,b,c,d){var s,r=null,q=new A.hM(t.a7),p=t.X,o=A.eL(r,r,!1,p),n=A.eL(r,r,!1,p),m=A.q3(new A.au(n,A.r(n).h("au<1>")),new A.dP(o),!0,p) -q.a=m -p=A.q3(new A.au(o,A.r(o).h("au<1>")),new A.dP(n),!0,p) -q.b=p -s=new A.i5(A.oK(c)) -a.onmessage=A.bj(new A.lX(b,q,d,s)) -m=m.b -m===$&&A.x() -new A.au(m,A.r(m).h("au<1>")).eD(new A.lY(d,s,a),new A.lZ(b,a)) -return p}, -lX:function lX(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -lY:function lY(a,b,c){this.a=a -this.b=b -this.c=c}, -lZ:function lZ(a,b){this.a=a -this.b=b}, -jQ:function jQ(a,b,c){var _=this -_.a=a -_.b=b -_.c=c -_.d=null}, -jS:function jS(a){this.a=a}, -jR:function jR(a,b){this.a=a -this.b=b}, -oK(a){var s -A:{if(a<=0){s=B.p -break A}if(1===a){s=B.aM -break A}if(2===a){s=B.aN -break A}if(3===a){s=B.aO -break A}if(a>3){s=B.q -break A}s=A.D(A.e7(null))}return s}, -qq(a){if("v" in a)return A.oK(A.B(A.a_(a.v))) -else return B.p}, -oU(a){var s,r,q,p,o,n,m,l,k,j=A.a4(a.type),i=a.payload -A:{if("Error"===j){s=new A.dz(A.a4(A.a7(i))) -break A}if("ServeDriftDatabase"===j){A.a7(i) -r=A.qq(i) -s=A.bu(A.a4(i.sqlite)) -q=A.a7(i.port) -p=A.ow(B.aA,A.a4(i.storage)) -o=A.a4(i.database) -n=A.pb(i.initPort) -m=r.c -l=m<2||A.bi(i.migrations) -s=new A.dn(s,q,p,o,n,r,l,m<3||A.bi(i.new_serialization)) -break A}if("StartFileSystemServer"===j){s=new A.eJ(A.a7(i)) -break A}if("RequestCompatibilityCheck"===j){s=new A.dl(A.a4(i)) -break A}if("DedicatedWorkerCompatibilityResult"===j){A.a7(i) -k=A.f([],t.L) -if("existing" in i)B.c.ag(k,A.pX(t.c.a(i.existing))) -s=A.bi(i.supportsNestedWorkers) -q=A.bi(i.canAccessOpfs) -p=A.bi(i.supportsSharedArrayBuffers) -o=A.bi(i.supportsIndexedDb) -n=A.bi(i.indexedDbExists) -m=A.bi(i.opfsExists) -m=new A.eg(s,q,p,o,k,A.qq(i),n,m) -s=m -break A}if("SharedWorkerCompatibilityResult"===j){s=A.uX(t.c.a(i)) -break A}if("DeleteDatabase"===j){s=i==null?A.pc(i):i -t.c.a(s) -q=$.pC().j(0,A.a4(s[0])) -q.toString -s=new A.h0(new A.ah(q,A.a4(s[1]))) -break A}s=A.D(A.K("Unknown type "+j,null))}return s}, -uX(a){var s,r,q=new A.l6(a) -if(a.length>5){s=A.pX(t.c.a(a[5])) -r=a.length>6?A.oK(A.B(A.a_(a[6]))):B.p}else{s=B.z -r=B.p}return new A.c7(q.$1(0),q.$1(1),q.$1(2),s,r,q.$1(3),q.$1(4))}, -pX(a){var s,r,q=A.f([],t.L),p=B.c.bw(a,t.m),o=p.$ti -p=new A.b6(p,p.gl(0),o.h("b6")) -o=o.h("w.E") -while(p.k()){s=p.d -if(s==null)s=o.a(s) -r=$.pC().j(0,A.a4(s.l)) -r.toString -q.push(new A.ah(r,A.a4(s.n)))}return q}, -pW(a){var s,r,q,p,o=A.f([],t.W) -for(s=a.length,r=0;r"))) -while(i.k()){l=i.gm() -if(J.aj(l.name,a)){q=!0 -s=1 -break A}}q=!1 -s=1 -break -case 8:k=n.open(a,1) -k.onupgradeneeded=A.bj(new A.nZ(g,k)) -s=10 -return A.c(A.jm(k,t.m),$async$e3) -case 10:j=c -if(g.a==null)g.a=!0 -j.close() -s=g.a===!1?11:12 -break -case 11:s=13 -return A.c(A.jm(n.deleteDatabase(a),t.X),$async$e3) -case 13:case 12:p=2 -s=6 -break -case 4:p=3 -f=o.pop() -s=6 -break -case 3:s=2 -break -case 6:i=g.a -q=i===!0 -s=1 -break -case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$e3,r)}, -o2(a){var s=0,r=A.k(t.H),q -var $async$o2=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:q=v.G -s="indexedDB" in q?2:3 -break -case 2:s=4 -return A.c(A.jm(A.a7(q.indexedDB).deleteDatabase(a),t.X),$async$o2) -case 4:case 3:return A.i(null,r)}}) -return A.j($async$o2,r)}, -iZ(){var s=null -return A.xV()}, -xV(){var s=0,r=A.k(t.A),q,p=2,o=[],n,m,l,k,j,i,h -var $async$iZ=A.l(function(a,b){if(a===1){o.push(b) -s=p}for(;;)switch(s){case 0:j=null -i=A.px() -if(i==null){q=null -s=1 -break}m=t.m -s=3 -return A.c(A.V(i.getDirectory(),m),$async$iZ) -case 3:n=b -p=5 -l=j -if(l==null)l={} -s=8 -return A.c(A.V(n.getDirectoryHandle("drift_db",l),m),$async$iZ) -case 8:m=b -q=m -s=1 -break -p=2 -s=7 -break -case 5:p=4 -h=o.pop() -q=null -s=1 -break -s=7 -break -case 4:s=2 -break -case 7:case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$iZ,r)}, -e5(){var s=0,r=A.k(t.q),q,p=2,o=[],n=[],m,l,k,j,i,h,g,f -var $async$e5=A.l(function(a,b){if(a===1){o.push(b) -s=p}for(;;)switch(s){case 0:s=3 -return A.c(A.iZ(),$async$e5) -case 3:g=b -if(g==null){q=B.y -s=1 -break}j=t.cO -if(!(v.G.Symbol.asyncIterator in g))A.D(A.K("Target object does not implement the async iterable interface",null)) -m=new A.fb(new A.of(),new A.e8(g,j),j.h("fb")) -l=A.f([],t.s) -j=new A.dO(A.cW(m,"stream",t.K)) -p=4 -i=t.m -case 7:s=9 -return A.c(j.k(),$async$e5) -case 9:if(!b){s=8 -break}k=j.gm() -s=J.aj(k.kind,"directory")?10:11 -break -case 10:p=13 -s=16 -return A.c(A.V(k.getFileHandle("database"),i),$async$e5) -case 16:J.oq(l,k.name) -p=4 -s=15 -break -case 13:p=12 -f=o.pop() -s=15 -break -case 12:s=4 -break -case 15:case 11:s=7 -break -case 8:n.push(6) -s=5 -break -case 4:n=[2] -case 5:p=2 -s=17 -return A.c(j.I(),$async$e5) -case 17:s=n.pop() -break -case 6:q=l -s=1 -break -case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$e5,r)}, -fE(a){return A.xt(a)}, -xt(a){var s=0,r=A.k(t.H),q,p=2,o=[],n,m,l,k,j -var $async$fE=A.l(function(b,c){if(b===1){o.push(c) -s=p}for(;;)switch(s){case 0:k=A.px() -if(k==null){s=1 -break}m=t.m -s=3 -return A.c(A.V(k.getDirectory(),m),$async$fE) -case 3:n=c -p=5 -s=8 -return A.c(A.V(n.getDirectoryHandle("drift_db"),m),$async$fE) -case 8:n=c -s=9 -return A.c(A.V(n.removeEntry(a,{recursive:!0}),t.X),$async$fE) -case 9:p=2 -s=7 -break -case 5:p=4 -j=o.pop() -s=7 -break -case 4:s=2 -break -case 7:case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$fE,r)}, -jm(a,b){var s=new A.m($.n,b.h("m<0>")),r=new A.Z(s,b.h("Z<0>")) -A.aL(a,"success",new A.jp(r,a,b),!1) -A.aL(a,"error",new A.jq(r,a),!1) -A.aL(a,"blocked",new A.jr(r,a),!1) -return s}, -u1(a,b,c){var s=$.n,r=new A.m(s,t.D),q=new A.Z(r,t.F),p={},o=t.X -A.q0(A.V(a.request(b,p,A.nP(s.cY(new A.j4(q,c),t.m))),o),new A.j5(q),null,o,t.K) -return r}, -o_:function o_(){}, -nZ:function nZ(a,b){this.a=a -this.b=b}, -of:function of(){}, -h3:function h3(a,b){this.a=a -this.b=b}, -k2:function k2(a,b){this.a=a -this.b=b}, -k_:function k_(a){this.a=a}, -jZ:function jZ(a){this.a=a}, -k0:function k0(a,b,c){this.a=a -this.b=b -this.c=c}, -k1:function k1(a,b,c){this.a=a -this.b=b -this.c=c}, -ms:function ms(a,b){this.a=a -this.b=b}, -dm:function dm(a,b,c){var _=this -_.a=a -_.b=b -_.c=0 -_.d=c}, -kR:function kR(a){this.a=a}, -lK:function lK(a,b){this.a=a -this.b=b}, -jp:function jp(a,b,c){this.a=a -this.b=b -this.c=c}, -jq:function jq(a,b){this.a=a -this.b=b}, -jr:function jr(a,b){this.a=a -this.b=b}, -j4:function j4(a,b){this.a=a -this.b=b}, -j5:function j5(a){this.a=a}, -l0:function l0(a,b){this.a=a -this.b=null -this.c=b}, -l5:function l5(a){this.a=a}, -l1:function l1(a,b){this.a=a -this.b=b}, -l4:function l4(a,b,c){this.a=a -this.b=b -this.c=c}, -l2:function l2(a){this.a=a}, -l3:function l3(a,b,c){this.a=a -this.b=b -this.c=c}, -cd:function cd(a,b){this.a=a -this.b=b}, -bP:function bP(a,b){this.a=a -this.b=b}, -i2:function i2(a,b,c,d,e){var _=this -_.e=a -_.f=null -_.r=b -_.w=c -_.x=d -_.a=e -_.b=0 -_.d=_.c=!1}, -iR:function iR(a,b,c,d,e,f,g){var _=this -_.Q=a -_.as=b -_.at=c -_.b=null -_.d=_.c=!1 -_.e=d -_.f=e -_.r=f -_.x=g -_.y=$ -_.a=!1}, -pS(a){return new A.fV(a,".")}, -pg(a){return a}, -rI(a,b){var s,r,q,p,o,n,m,l -for(s=b.length,r=1;r=1;s=q){q=s-1 -if(b[q]!=null)break}p=new A.aD("") -o=a+"(" -p.a=o -n=A.O(b) -m=n.h("cF<1>") -l=new A.cF(b,0,s,m) -l.hY(b,0,s,n.c) -m=o+new A.E(l,new A.nX(),m.h("E")).az(0,", ") -p.a=m -p.a=m+("): part "+(r-1)+" was null, but part "+r+" was not.") -throw A.b(A.K(p.i(0),null))}}, -fV:function fV(a,b){this.a=a -this.b=b}, -jv:function jv(){}, -jw:function jw(){}, -nX:function nX(){}, -kv:function kv(){}, -di(a,b){var s,r,q,p,o,n=b.hG(a) -b.aZ(a) -if(n!=null)a=B.a.K(a,n.length) -s=t.s -r=A.f([],s) -q=A.f([],s) -s=a.length -if(s!==0&&b.aw(a.charCodeAt(0))){q.push(a[0]) -p=1}else{q.push("") -p=0}for(o=p;o"))}, -og:function og(){}, -jx:function jx(){}, -hH:function hH(a,b,c){this.d=a -this.a=b -this.c=c}, -bs:function bs(a,b){this.a=a -this.b=b}, -n8:function n8(a){this.a=a -this.b=-1}, -iE:function iE(){}, -iF:function iF(){}, -iH:function iH(){}, -iI:function iI(){}, -kH:function kH(a,b){this.a=a -this.b=b}, -d3:function d3(){}, -cz:function cz(a){this.a=a}, -cb(a){return new A.aJ(a)}, -pL(a,b){var s,r,q,p -if(b==null)b=$.fF() -for(s=a.length,r=a.$flags|0,q=0;q")),r=new A.Z(s,b.h("Z<0>")) -A.aL(a,"success",new A.jn(r,a,b),!1) -A.aL(a,"error",new A.jo(r,a),!1) -return s}, -ud(a,b){var s=new A.m($.n,b.h("m<0>")),r=new A.Z(s,b.h("Z<0>")) -A.aL(a,"success",new A.js(r,a,b),!1) -A.aL(a,"error",new A.jt(r,a),!1) -A.aL(a,"blocked",new A.ju(r),!1) -return s}, -cM:function cM(a,b){var _=this -_.c=_.b=_.a=null -_.d=a -_.$ti=b}, -mt:function mt(a,b){this.a=a -this.b=b}, -mu:function mu(a,b){this.a=a -this.b=b}, -jn:function jn(a,b,c){this.a=a -this.b=b -this.c=c}, -jo:function jo(a,b){this.a=a -this.b=b}, -js:function js(a,b,c){this.a=a -this.b=b -this.c=c}, -jt:function jt(a,b){this.a=a -this.b=b}, -ju:function ju(a){this.a=a}, -lQ:function lQ(a){this.a=a}, -lR:function lR(a){this.a=a}, -lT(a,b,c){var s=0,r=A.k(t.ab),q,p,o -var $async$lT=A.l(function(d,e){if(d===1)return A.h(e,r) -for(;;)switch(s){case 0:p=v.G -o=A -s=3 -return A.c(A.V(p.fetch(new p.URL(a,A.a7(p.location).href),null),t.m),$async$lT) -case 3:q=o.lS(e,c) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$lT,r)}, -lS(a,b){var s=0,r=A.k(t.ab),q,p,o,n,m -var $async$lS=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:p=new A.fW(A.ap(t.S,t.b9)) -o=A -n=A -m=A -s=3 -return A.c(new A.lQ(p).d9(a),$async$lS) -case 3:q=new o.i4(new n.lU(m.vd(d,p))) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$lS,r)}, -i4:function i4(a){this.a=a}, -dy:function dy(a,b,c,d){var _=this -_.d=a -_.e=b -_.b=c -_.a=d}, -i3:function i3(a,b){this.a=a -this.b=b -this.c=0}, -qt(a){var s=J.aj(a.byteLength,8) -if(!s)throw A.b(A.K("Must be 8 in length",null)) -return new A.kQ(A.hi(v.G.Int32Array,a,null,null,t.ha))}, -qb(a){var s=v.G -return new A.bD(a,new s.DataView(a,65536,2048),A.hi(s.Uint8Array,a,null,null,t.Z))}, -uH(a){return B.h}, -uI(a){return new A.R(a.bp(0),a.bp(8),a.bp(16))}, -uJ(a){return new A.aX(B.j.d_(new Uint8Array(A.fA(A.oP(a.a,28,a.b.getInt32(24))))),a.bp(0),a.bp(8),a.bp(16))}, -kQ:function kQ(a){this.b=a}, -bD:function bD(a,b,c){this.a=a -this.b=b -this.c=c}, -ad:function ad(a,b,c,d,e){var _=this -_.c=a -_.d=b -_.a=c -_.b=d -_.$ti=e}, -bC:function bC(){}, -b4:function b4(){}, -R:function R(a,b,c){this.a=a -this.b=b -this.c=c}, -aX:function aX(a,b,c,d){var _=this -_.d=a -_.a=b -_.b=c -_.c=d}, -i1(a){var s=0,r=A.k(t.ei),q,p,o,n,m,l -var $async$i1=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:n=t.m -s=3 -return A.c(A.V(A.pw().getDirectory(),n),$async$i1) -case 3:m=c -l=A.pu(a.root) -p=J.a0(l.a),o=new A.cI(p,l.b) -case 4:if(!o.k()){s=5 -break}s=6 -return A.c(A.V(m.getDirectoryHandle(p.gm(),{create:!0}),n),$async$i1) -case 6:m=c -s=4 -break -case 5:n=t.cT -q=new A.eO(A.qt(a.synchronizationBuffer),A.qb(a.communicationBuffer),m,A.ap(t.S,n),A.oI(n)) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$i1,r)}, -iD:function iD(a,b,c){this.a=a -this.b=b -this.c=c}, -eO:function eO(a,b,c,d,e){var _=this -_.a=a -_.b=b -_.c=c -_.d=0 -_.e=!1 -_.f=d -_.r=e}, -dK:function dK(a,b,c,d,e,f,g){var _=this -_.a=a -_.b=b -_.c=c -_.d=d -_.e=e -_.f=f -_.r=g -_.w=!1 -_.x=null}, -vt(a){var s=new A.f8(a,new A.Z(new A.m($.n,t.D),t.F),a.objectStore("files"),a.objectStore("blocks")) -s.i_(a) -return s}, -hd(a,b){var s=0,r=A.k(t.bd),q,p,o,n,m,l -var $async$hd=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:p=t.N -o=new A.j9(a) -n=A.oC(null) -m=$.fF() -l=new A.d7(o,n,new A.cB(t.au),A.oI(p),A.ap(p,t.S),m,"indexeddb") -l.r=!1 -s=3 -return A.c(o.da(),$async$hd) -case 3:s=4 -return A.c(l.bS(),$async$hd) -case 4:q=l -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$hd,r)}, -j9:function j9(a){this.a=null -this.b=a}, -jc:function jc(a){this.a=a}, -jb:function jb(a,b,c){this.a=a -this.b=b -this.c=c}, -ja:function ja(a){this.a=a}, -f8:function f8(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=!1 -_.d=c -_.e=d}, -mY:function mY(a){this.a=a}, -mZ:function mZ(a){this.a=a}, -mX:function mX(a){this.a=a}, -n_:function n_(a,b,c){this.a=a -this.b=b -this.c=c}, -n1:function n1(a,b){this.a=a -this.b=b}, -n0:function n0(a,b){this.a=a -this.b=b}, -mD:function mD(a,b,c){this.a=a -this.b=b -this.c=c}, -mE:function mE(a,b){this.a=a -this.b=b}, -iz:function iz(a,b){this.a=a -this.b=b}, -d7:function d7(a,b,c,d,e,f,g){var _=this -_.d=a -_.f=_.e=!1 -_.r=!0 -_.w=b -_.x=c -_.y=d -_.z=e -_.b=f -_.a=g}, -kp:function kp(a,b,c){this.a=a -this.b=b -this.c=c}, -kq:function kq(){}, -ko:function ko(a,b){this.a=a -this.b=b}, -is:function is(a,b,c){this.a=a -this.b=b -this.c=c}, -mW:function mW(a,b){this.a=a -this.b=b}, -av:function av(){}, -f5:function f5(a,b){var _=this -_.w=a -_.d=b -_.c=_.b=_.a=null}, -eZ:function eZ(a,b,c){var _=this -_.w=a -_.x=b -_.d=c -_.c=_.b=_.a=null}, -dC:function dC(a,b,c){var _=this -_.w=a -_.x=b -_.d=c -_.c=_.b=_.a=null}, -dU:function dU(a,b,c,d,e){var _=this -_.w=a -_.x=b -_.y=c -_.z=d -_.d=e -_.c=_.b=_.a=null}, -hJ(a,b){var s=0,r=A.k(t.e1),q,p,o,n,m,l,k,j -var $async$hJ=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:j=A.pw() -if(j==null)throw A.b(A.cb(1)) -p=t.m -s=3 -return A.c(A.V(j.getDirectory(),p),$async$hJ) -case 3:o=d -n=A.pu(a),m=J.a0(n.a),n=new A.cI(m,n.b),l=null -case 4:if(!n.k()){s=6 -break}s=7 -return A.c(A.V(o.getDirectoryHandle(m.gm(),{create:!0}),p),$async$hJ) -case 7:k=d -case 5:l=o,o=k -s=4 -break -case 6:q=new A.ah(l,o) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$hJ,r)}, -la(a){var s=0,r=A.k(t.m),q -var $async$la=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:s=3 -return A.c(A.hJ(a,!0),$async$la) -case 3:q=c.b -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$la,r)}, -l8(a){var s=0,r=A.k(t.gW),q,p -var $async$l8=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:if(A.pw()==null)throw A.b(A.cb(1)) -p=A -s=3 -return A.c(A.la(a),$async$l8) -case 3:q=p.l7(c,!1,"simple-opfs") -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$l8,r)}, -l7(a,b,c){var s=0,r=A.k(t.gW),q,p,o,n -var $async$l7=A.l(function(d,e){if(d===1)return A.h(e,r) -for(;;)switch(s){case 0:p=A.oC(null) -o=$.fF() -n=new A.dq(p,o,c) -s=3 -return A.c(n.bB(a,!1),$async$l7) -case 3:q=n -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$l7,r)}, -d6:function d6(a,b,c){this.c=a -this.a=b -this.b=c}, -dq:function dq(a,b,c){var _=this -_.d=null -_.e=a -_.b=b -_.a=c}, -l9:function l9(a,b){this.a=a -this.b=b}, -iJ:function iJ(a,b,c){var _=this -_.a=a -_.b=b -_.c=c -_.d=0}, -n5:function n5(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -vd(a,b){var s=A.a7(a.exports.memory) -b.b!==$&&A.j_() -b.b=s -s=new A.lF(s,b,a.exports) -s.hZ(a,b) -return s}, -oW(a,b){var s,r=A.bF(a.buffer,b,null) -for(s=0;r[s]!==0;)++s -return s}, -ce(a,b,c){var s=a.buffer -return B.j.d_(A.bF(s,b,c==null?A.oW(a,b):c))}, -oV(a,b,c){var s -if(b===0)return null -s=a.buffer -return B.j.d_(A.bF(s,b,c==null?A.oW(a,b):c))}, -qL(a,b,c){var s=new Uint8Array(c) -B.e.b3(s,0,A.bF(a.buffer,b,c)) -return s}, -lF:function lF(a,b,c){var _=this -_.b=a -_.c=b -_.d=c -_.w=_.r=null}, -lG:function lG(a){this.a=a}, -lH:function lH(a){this.a=a}, -lI:function lI(a){this.a=a}, -lJ:function lJ(a){this.a=a}, -u7(a){var s,r,q=u.q -if(a.length===0)return new A.bn(A.aO(A.f([],t.J),t.a)) -s=$.pH() -if(B.a.G(a,s)){s=B.a.bk(a,s) -r=A.O(s) -return new A.bn(A.aO(new A.aG(new A.aK(s,new A.jd(),r.h("aK<1>")),A.y9(),r.h("aG<1,a2>")),t.a))}if(!B.a.G(a,q))return new A.bn(A.aO(A.f([A.qD(a)],t.J),t.a)) -return new A.bn(A.aO(new A.E(A.f(a.split(q),t.s),A.y8(),t.fe),t.a))}, -bn:function bn(a){this.a=a}, -jd:function jd(){}, -ji:function ji(){}, -jh:function jh(){}, -jf:function jf(){}, -jg:function jg(a){this.a=a}, -je:function je(a){this.a=a}, -us(a){return A.q_(a)}, -q_(a){return A.h9(a,new A.kd(a))}, -ur(a){return A.uo(a)}, -uo(a){return A.h9(a,new A.kb(a))}, -ul(a){return A.h9(a,new A.k8(a))}, -up(a){return A.um(a)}, -um(a){return A.h9(a,new A.k9(a))}, -uq(a){return A.un(a)}, -un(a){return A.h9(a,new A.ka(a))}, -ha(a){if(B.a.G(a,$.t8()))return A.bu(a) -else if(B.a.G(a,$.t9()))return A.r7(a,!0) -else if(B.a.u(a,"/"))return A.r7(a,!1) -if(B.a.G(a,"\\"))return $.tS().hu(a) -return A.bu(a)}, -h9(a,b){var s,r -try{s=b.$0() -return s}catch(r){if(A.I(r) instanceof A.aF)return new A.bt(A.an(null,"unparsed",null,null),a) -else throw r}}, -N:function N(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, -kd:function kd(a){this.a=a}, -kb:function kb(a){this.a=a}, -kc:function kc(a){this.a=a}, -k8:function k8(a){this.a=a}, -k9:function k9(a){this.a=a}, -ka:function ka(a){this.a=a}, -hn:function hn(a){this.a=a -this.b=$}, -qC(a){if(t.a.b(a))return a -if(a instanceof A.bn)return a.ht() -return new A.hn(new A.lt(a))}, -qD(a){var s,r,q -try{if(a.length===0){r=A.qz(A.f([],t.e),null) -return r}if(B.a.G(a,$.tN())){r=A.v3(a) -return r}if(B.a.G(a,"\tat ")){r=A.v2(a) -return r}if(B.a.G(a,$.tB())||B.a.G(a,$.tz())){r=A.v1(a) -return r}if(B.a.G(a,u.q)){r=A.u7(a).ht() -return r}if(B.a.G(a,$.tE())){r=A.qA(a) -return r}r=A.qB(a) -return r}catch(q){r=A.I(q) -if(r instanceof A.aF){s=r -throw A.b(A.al(s.a+"\nStack trace:\n"+a,null,null))}else throw q}}, -v5(a){return A.qB(a)}, -qB(a){var s=A.aO(A.v6(a),t.B) -return new A.a2(s)}, -v6(a){var s,r=B.a.eQ(a),q=$.pH(),p=t.U,o=new A.aK(A.f(A.bl(r,q,"").split("\n"),t.s),new A.lu(),p) -if(!o.gq(0).k())return A.f([],t.e) -r=A.oS(o,o.gl(0)-1,p.h("e.E")) -r=A.hr(r,A.xz(),A.r(r).h("e.E"),t.B) -s=A.am(r,A.r(r).h("e.E")) -if(!B.a.el(o.gD(0),".da"))s.push(A.q_(o.gD(0))) -return s}, -v3(a){var s=t.cB,r=t.B -r=A.aO(A.hr(new A.eG(A.f(a.split("\n"),t.s),new A.ls(),s),A.rQ(),s.h("e.E"),r),r) -return new A.a2(r)}, -v2(a){var s=A.aO(new A.aG(new A.aK(A.f(a.split("\n"),t.s),new A.lr(),t.U),A.rQ(),t.M),t.B) -return new A.a2(s)}, -v1(a){var s=A.aO(new A.aG(new A.aK(A.f(B.a.eQ(a).split("\n"),t.s),new A.lp(),t.U),A.xx(),t.M),t.B) -return new A.a2(s)}, -v4(a){return A.qA(a)}, -qA(a){var s=a.length===0?A.f([],t.e):new A.aG(new A.aK(A.f(B.a.eQ(a).split("\n"),t.s),new A.lq(),t.U),A.xy(),t.M) -s=A.aO(s,t.B) -return new A.a2(s)}, -qz(a,b){var s=A.aO(a,t.B) -return new A.a2(s)}, -a2:function a2(a){this.a=a}, -lt:function lt(a){this.a=a}, -lu:function lu(){}, -ls:function ls(){}, -lr:function lr(){}, -lp:function lp(){}, -lq:function lq(){}, -lw:function lw(){}, -lv:function lv(a){this.a=a}, -bt:function bt(a,b){this.a=a -this.w=b}, -ed:function ed(a){var _=this -_.b=_.a=$ -_.c=null -_.d=!1 -_.$ti=a}, -eX:function eX(a,b,c){this.a=a -this.b=b -this.$ti=c}, -eW:function eW(a,b){this.b=a -this.a=b}, -q3(a,b,c,d){var s,r={} -r.a=a -s=new A.em(d.h("em<0>")) -s.hW(b,!0,r,d) -return s}, -em:function em(a){var _=this -_.b=_.a=$ -_.c=null -_.d=!1 -_.$ti=a}, -kn:function kn(a,b){this.a=a -this.b=b}, -km:function km(a){this.a=a}, -f7:function f7(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.e=_.d=!1 -_.r=_.f=null -_.w=d}, -hM:function hM(a){this.b=this.a=$ -this.$ti=a}, -eK:function eK(){}, -dt:function dt(){}, -it:function it(){}, -bh:function bh(a,b){this.a=a -this.b=b}, -aL(a,b,c,d){var s -if(c==null)s=null -else{s=A.rJ(new A.mA(c),t.m) -s=s==null?null:A.bj(s)}s=new A.il(a,b,s,!1) -s.e6() -return s}, -rJ(a,b){var s=$.n -if(s===B.d)return a -return s.eh(a,b)}, -ox:function ox(a,b){this.a=a -this.$ti=b}, -f2:function f2(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.$ti=d}, -il:function il(a,b,c,d){var _=this -_.a=0 -_.b=a -_.c=b -_.d=c -_.e=d}, -mA:function mA(a){this.a=a}, -mB:function mB(a){this.a=a}, -t3(a){return v.mangledGlobalNames[a]}, -t_(a){if(typeof dartPrint=="function"){dartPrint(a) -return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a) -return}if(typeof print=="function"){print(a) -return}throw"Unable to print message: "+String(a)}, -hk(a,b,c,d,e,f){var s -if(c==null)return a[b]() -else if(d==null)return a[b](c) -else if(e==null)return a[b](c,d) -else{s=a[b](c,d,e) -return s}}, -hi(a,b,c,d,e){var s=[b] -if(c!=null)s.push(c) -if(d!=null)s.push(d) -return e.a(A.rN(a,s))}, -pn(){var s,r,q,p,o=null -try{o=A.hY()}catch(s){if(t.g8.b(A.I(s))){r=$.nO -if(r!=null)return r -throw s}else throw s}if(J.aj(o,$.ro)){r=$.nO -r.toString -return r}$.ro=o -if($.pB()===$.fG())r=$.nO=o.hr(".").i(0) -else{q=o.eP() -p=q.length-1 -r=$.nO=p===0?q:B.a.p(q,0,p)}return r}, -rT(a){var s -if(!(a>=65&&a<=90))s=a>=97&&a<=122 -else s=!0 -return s}, -rP(a,b){var s,r,q=null,p=a.length,o=b+2 -if(p0)throw A.b(A.k5("BigInt value exceeds the range of 64 bits")) -return a}, -uU(a){var s,r=a.a,q=a.b,p=r.d,o=p.sqlite3_value_type(q) -A:{s=null -if(1===o){r=A.B(v.G.Number(p.sqlite3_value_int64(q))) -break A}if(2===o){r=p.sqlite3_value_double(q) -break A}if(3===o){o=p.sqlite3_value_bytes(q) -o=A.ce(r.b,p.sqlite3_value_text(q),o) -r=o -break A}if(4===o){o=p.sqlite3_value_bytes(q) -o=A.qL(r.b,p.sqlite3_value_blob(q),o) -r=o -break A}r=s -break A}return r}, -oB(a,b){var s,r -for(s=b,r=0;r<16;++r)s+=A.aR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012346789".charCodeAt(a.hj(61))) -return s.charCodeAt(0)==0?s:s}, -kP(a){var s=0,r=A.k(t.w),q -var $async$kP=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:s=3 -return A.c(A.V(a.arrayBuffer(),t.u),$async$kP) -case 3:q=c -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$kP,r)}, -oP(a,b,c){return A.hi(v.G.Uint8Array,a,b,c,t.Z)}, -u4(a,b){v.G.Atomics.notify(a,b,1/0)}, -pw(){var s=v.G.navigator -if("storage" in s)return s.storage -return null}, -oy(a,b,c){var s=a.read(b,c) -return s}, -oz(a,b,c){var s=a.write(b,c) -return s}, -pZ(a,b){return A.V(a.removeEntry(b,{recursive:!1}),t.X)}, -xL(){var s=v.G -if(A.oE(s,"DedicatedWorkerGlobalScope"))new A.jQ(s,new A.br(),new A.h3(A.ap(t.N,t.fE),null)).R() -else if(A.oE(s,"SharedWorkerGlobalScope"))new A.l0(s,new A.h3(A.ap(t.N,t.fE),null)).R()}},B={} -var w=[A,J,B] -var $={} -A.oG.prototype={} -J.hf.prototype={ -T(a,b){return a===b}, -gA(a){return A.eC(a)}, -i(a){return"Instance of '"+A.hF(a)+"'"}, -gS(a){return A.bS(A.pe(this))}} -J.hh.prototype={ -i(a){return String(a)}, -gA(a){return a?519018:218159}, -gS(a){return A.bS(t.y)}, -$iL:1, -$iJ:1} -J.er.prototype={ -T(a,b){return null==b}, -i(a){return"null"}, -gA(a){return 0}, -$iL:1, -$iG:1} -J.a1.prototype={$iy:1} -J.bZ.prototype={ -gA(a){return 0}, -i(a){return String(a)}} -J.hE.prototype={} -J.cH.prototype={} -J.aV.prototype={ -i(a){var s=a[$.t7()] -if(s==null)s=a[$.cZ()] -if(s==null)return this.hR(a) -return"JavaScript function for "+J.b3(s)}} -J.aN.prototype={ -gA(a){return 0}, -i(a){return String(a)}} -J.d9.prototype={ -gA(a){return 0}, -i(a){return String(a)}} -J.u.prototype={ -bw(a,b){return new A.ak(a,A.O(a).h("@<1>").H(b).h("ak<1,2>"))}, -v(a,b){a.$flags&1&&A.z(a,29) -a.push(b)}, -de(a,b){var s -a.$flags&1&&A.z(a,"removeAt",1) -s=a.length -if(b>=s)throw A.b(A.kO(b,null)) -return a.splice(b,1)[0]}, -d5(a,b,c){var s -a.$flags&1&&A.z(a,"insert",2) -s=a.length -if(b>s)throw A.b(A.kO(b,null)) -a.splice(b,0,c)}, -ew(a,b,c){var s,r -a.$flags&1&&A.z(a,"insertAll",2) -A.qs(b,0,a.length,"index") -if(!t.Q.b(c))c=J.j3(c) -s=J.aC(c) -a.length=a.length+s -r=b+s -this.N(a,r,a.length,a,b) -this.ad(a,b,r,c)}, -hn(a){a.$flags&1&&A.z(a,"removeLast",1) -if(a.length===0)throw A.b(A.iY(a,-1)) -return a.pop()}, -F(a,b){var s -a.$flags&1&&A.z(a,"remove",1) -for(s=0;s").H(c).h("E<1,2>"))}, -az(a,b){var s,r=A.b7(a.length,"",!1,t.N) -for(s=0;ss)throw A.b(A.X(b,0,s,"start",null)) -if(cs)throw A.b(A.X(c,b,s,"end",null)) -if(b===c)return A.f([],A.O(a)) -return A.f(a.slice(b,c),A.O(a))}, -cw(a,b,c){A.bd(b,c,a.length) -return A.bf(a,b,c,A.O(a).c)}, -gE(a){if(a.length>0)return a[0] -throw A.b(A.ax())}, -gD(a){var s=a.length -if(s>0)return a[s-1] -throw A.b(A.ax())}, -N(a,b,c,d,e){var s,r,q,p,o -a.$flags&2&&A.z(a,5) -A.bd(b,c,a.length) -s=c-b -if(s===0)return -A.ac(e,"skipCount") -if(t.j.b(d)){r=d -q=e}else{r=J.e6(d,e).aE(0,!1) -q=0}p=J.a5(r) -if(q+s>p.gl(r))throw A.b(A.q5()) -if(q=0;--o)a[b+o]=p.j(r,q+o) -else for(o=0;o0){a[0]=q -a[1]=r}return}p=0 -if(A.O(a).c.b(null))for(o=0;o0)this.jd(a,p)}, -hM(a){return this.hN(a,null)}, -jd(a,b){var s,r=a.length -for(;s=r-1,r>0;r=s)if(a[s]===null){a[s]=void 0;--b -if(b===0)break}}, -d7(a,b){var s,r=a.length,q=r-1 -if(q<0)return-1 -q=0;--s)if(J.aj(a[s],b))return s -return-1}, -gB(a){return a.length===0}, -i(a){return A.oD(a,"[","]")}, -aE(a,b){var s=A.f(a.slice(0),A.O(a)) -return s}, -cq(a){return this.aE(a,!0)}, -gq(a){return new J.fI(a,a.length,A.O(a).h("fI<1>"))}, -gA(a){return A.eC(a)}, -gl(a){return a.length}, -j(a,b){if(!(b>=0&&b=0&&b=p){r.d=null -return!1}r.d=q[s] -r.c=s+1 -return!0}} -J.d8.prototype={ -ah(a,b){var s -if(ab)return 1 -else if(a===b){if(a===0){s=this.geA(b) -if(this.geA(a)===s)return 0 -if(this.geA(a))return-1 -return 1}return 0}else if(isNaN(a)){if(isNaN(b))return 0 -return 1}else return-1}, -geA(a){return a===0?1/a<0:a<0}, -lk(a){var s -if(a>=-2147483648&&a<=2147483647)return a|0 -if(isFinite(a)){s=a<0?Math.ceil(a):Math.floor(a) -return s+0}throw A.b(A.a3(""+a+".toInt()"))}, -k_(a){var s,r -if(a>=0){if(a<=2147483647){s=a|0 -return a===s?s:s+1}}else if(a>=-2147483648)return a|0 -r=Math.ceil(a) -if(isFinite(r))return r -throw A.b(A.a3(""+a+".ceil()"))}, -i(a){if(a===0&&1/a<0)return"-0.0" -else return""+a}, -gA(a){var s,r,q,p,o=a|0 -if(a===o)return o&536870911 -s=Math.abs(a) -r=Math.log(s)/0.6931471805599453|0 -q=Math.pow(2,r) -p=s<1?s/q:q/s -return((p*9007199254740992|0)+(p*3542243181176521|0))*599197+r*1259&536870911}, -ac(a,b){var s=a%b -if(s===0)return 0 -if(s>0)return s -return s+b}, -f1(a,b){if((a|0)===a)if(b>=1||b<-1)return a/b|0 -return this.fP(a,b)}, -M(a,b){return(a|0)===a?a/b|0:this.fP(a,b)}, -fP(a,b){var s=a/b -if(s>=-2147483648&&s<=2147483647)return s|0 -if(s>0){if(s!==1/0)return Math.floor(s)}else if(s>-1/0)return Math.ceil(s) -throw A.b(A.a3("Result of truncating division is "+A.t(s)+": "+A.t(a)+" ~/ "+b))}, -aG(a,b){if(b<0)throw A.b(A.e2(b)) -return b>31?0:a<>>0}, -bj(a,b){var s -if(b<0)throw A.b(A.e2(b)) -if(a>0)s=this.e5(a,b) -else{s=b>31?31:b -s=a>>s>>>0}return s}, -L(a,b){var s -if(a>0)s=this.e5(a,b) -else{s=b>31?31:b -s=a>>s>>>0}return s}, -jt(a,b){if(0>b)throw A.b(A.e2(b)) -return this.e5(a,b)}, -e5(a,b){return b>31?0:a>>>b}, -gS(a){return A.bS(t.o)}, -$iF:1, -$ib2:1} -J.eq.prototype={ -gh0(a){var s,r=a<0?-a-1:a,q=r -for(s=32;q>=4294967296;){q=this.M(q,4294967296) -s+=32}return s-Math.clz32(q)}, -gS(a){return A.bS(t.S)}, -$iL:1, -$ia:1} -J.hj.prototype={ -gS(a){return A.bS(t.i)}, -$iL:1} -J.bY.prototype={ -cU(a,b,c){var s=b.length -if(c>s)throw A.b(A.X(c,0,s,null,null)) -return new A.iK(b,a,c)}, -ef(a,b){return this.cU(a,b,0)}, -hh(a,b,c){var s,r,q=null -if(c<0||c>b.length)throw A.b(A.X(c,0,b.length,q,q)) -s=a.length -if(c+s>b.length)return q -for(r=0;rr)return!1 -return b===this.K(a,r-s)}, -hq(a,b,c){A.qs(0,0,a.length,"startIndex") -return A.y4(a,b,c,0)}, -bk(a,b){var s -if(typeof b=="string")return A.f(a.split(b),t.s) -else{if(b instanceof A.cA){s=b.e -s=!(s==null?b.e=b.ii():s)}else s=!1 -if(s)return A.f(a.split(b.b),t.s) -else return this.iq(a,b)}}, -aO(a,b,c,d){var s=A.bd(b,c,a.length) -return A.py(a,b,s,d)}, -iq(a,b){var s,r,q,p,o,n,m=A.f([],t.s) -for(s=J.or(b,a),s=s.gq(s),r=0,q=1;s.k();){p=s.gm() -o=p.gcA() -n=p.gby() -q=n-o -if(q===0&&r===o)continue -m.push(this.p(a,r,o)) -r=n}if(r0)m.push(this.K(a,r)) -return m}, -C(a,b,c){var s -if(c<0||c>a.length)throw A.b(A.X(c,0,a.length,null,null)) -if(typeof b=="string"){s=c+b.length -if(s>a.length)return!1 -return b===a.substring(c,s)}return J.tY(b,a,c)!=null}, -u(a,b){return this.C(a,b,0)}, -p(a,b,c){return a.substring(b,A.bd(b,c,a.length))}, -K(a,b){return this.p(a,b,null)}, -eQ(a){var s,r,q,p=a.trim(),o=p.length -if(o===0)return p -if(p.charCodeAt(0)===133){s=J.uA(p,1) -if(s===o)return""}else s=0 -r=o-1 -q=p.charCodeAt(r)===133?J.uB(p,r):o -if(s===0&&q===o)return p -return p.substring(s,q)}, -bI(a,b){var s,r -if(0>=b)return"" -if(b===1||a.length===0)return a -if(b!==b>>>0)throw A.b(B.ar) -for(s=a,r="";;){if((b&1)===1)r=s+r -b=b>>>1 -if(b===0)break -s+=s}return r}, -l1(a,b,c){var s=b-a.length -if(s<=0)return a -return this.bI(c,s)+a}, -hk(a,b){var s=b-a.length -if(s<=0)return a -return a+this.bI(" ",s)}, -aY(a,b,c){var s -if(c<0||c>a.length)throw A.b(A.X(c,0,a.length,null,null)) -s=a.indexOf(b,c) -return s}, -kH(a,b){return this.aY(a,b,0)}, -hg(a,b,c){var s,r -if(c==null)c=a.length -else if(c<0||c>a.length)throw A.b(A.X(c,0,a.length,null,null)) -s=b.length -r=a.length -if(c+s>r)c=r-s -return a.lastIndexOf(b,c)}, -d7(a,b){return this.hg(a,b,null)}, -G(a,b){return A.y0(a,b,0)}, -ah(a,b){var s -if(a===b)s=0 -else s=a>6}r=r+((r&67108863)<<3)&536870911 -r^=r>>11 -return r+((r&16383)<<15)&536870911}, -gS(a){return A.bS(t.N)}, -gl(a){return a.length}, -j(a,b){if(!(b>=0&&b"))}, -gl(a){return J.aC(this.gaq())}, -gB(a){return J.os(this.gaq())}, -U(a,b){var s=A.r(this) -return A.ec(J.e6(this.gaq(),b),s.c,s.y[1])}, -aj(a,b){var s=A.r(this) -return A.ec(J.j2(this.gaq(),b),s.c,s.y[1])}, -J(a,b){return A.r(this).y[1].a(J.j0(this.gaq(),b))}, -gE(a){return A.r(this).y[1].a(J.j1(this.gaq()))}, -gD(a){return A.r(this).y[1].a(J.ot(this.gaq()))}, -i(a){return J.b3(this.gaq())}} -A.fR.prototype={ -k(){return this.a.k()}, -gm(){return this.$ti.y[1].a(this.a.gm())}} -A.cr.prototype={ -gaq(){return this.a}} -A.f0.prototype={$iq:1} -A.eV.prototype={ -j(a,b){return this.$ti.y[1].a(J.aM(this.a,b))}, -t(a,b,c){J.pI(this.a,b,this.$ti.c.a(c))}, -cw(a,b,c){var s=this.$ti -return A.ec(J.tX(this.a,b,c),s.c,s.y[1])}, -N(a,b,c,d,e){var s=this.$ti -J.tZ(this.a,b,c,A.ec(d,s.y[1],s.c),e)}, -ad(a,b,c,d){return this.N(0,b,c,d,0)}, -$iq:1, -$io:1} -A.ak.prototype={ -bw(a,b){return new A.ak(this.a,this.$ti.h("@<1>").H(b).h("ak<1,2>"))}, -gaq(){return this.a}} -A.da.prototype={ -i(a){return"LateInitializationError: "+this.a}} -A.fS.prototype={ -gl(a){return this.a.length}, -j(a,b){return this.a.charCodeAt(b)}} -A.oe.prototype={ -$0(){return A.b5(null,t.H)}, -$S:12} -A.kS.prototype={} -A.q.prototype={} -A.Q.prototype={ -gq(a){var s=this -return new A.b6(s,s.gl(s),A.r(s).h("b6"))}, -gB(a){return this.gl(this)===0}, -gE(a){if(this.gl(this)===0)throw A.b(A.ax()) -return this.J(0,0)}, -gD(a){var s=this -if(s.gl(s)===0)throw A.b(A.ax()) -return s.J(0,s.gl(s)-1)}, -az(a,b){var s,r,q,p=this,o=p.gl(p) -if(b.length!==0){if(o===0)return"" -s=A.t(p.J(0,0)) -if(o!==p.gl(p))throw A.b(A.ao(p)) -for(r=s,q=1;q").H(c).h("E<1,2>"))}, -kE(a,b,c){var s,r,q=this,p=q.gl(q) -for(s=b,r=0;rs)throw A.b(A.X(r,0,s,"start",null))}}, -gix(){var s=J.aC(this.a),r=this.c -if(r==null||r>s)return s -return r}, -gjy(){var s=J.aC(this.a),r=this.b -if(r>s)return s -return r}, -gl(a){var s,r=J.aC(this.a),q=this.b -if(q>=r)return 0 -s=this.c -if(s==null||s>=r)return r-q -return s-q}, -J(a,b){var s=this,r=s.gjy()+b -if(b<0||r>=s.gix())throw A.b(A.hc(b,s.gl(0),s,null,"index")) -return J.j0(s.a,r)}, -U(a,b){var s,r,q=this -A.ac(b,"count") -s=q.b+b -r=q.c -if(r!=null&&s>=r)return new A.cy(q.$ti.h("cy<1>")) -return A.bf(q.a,s,r,q.$ti.c)}, -aj(a,b){var s,r,q,p=this -A.ac(b,"count") -s=p.c -r=p.b -q=r+b -if(s==null)return A.bf(p.a,r,q,p.$ti.c) -else{if(s=o){r.d=null -return!1}r.d=p.J(q,s);++r.c -return!0}} -A.aG.prototype={ -gq(a){var s=this.a -return new A.dc(s.gq(s),this.b,A.r(this).h("dc<1,2>"))}, -gl(a){var s=this.a -return s.gl(s)}, -gB(a){var s=this.a -return s.gB(s)}, -gE(a){var s=this.a -return this.b.$1(s.gE(s))}, -gD(a){var s=this.a -return this.b.$1(s.gD(s))}, -J(a,b){var s=this.a -return this.b.$1(s.J(s,b))}} -A.cx.prototype={$iq:1} -A.dc.prototype={ -k(){var s=this,r=s.b -if(r.k()){s.a=s.c.$1(r.gm()) -return!0}s.a=null -return!1}, -gm(){var s=this.a -return s==null?this.$ti.y[1].a(s):s}} -A.E.prototype={ -gl(a){return J.aC(this.a)}, -J(a,b){return this.b.$1(J.j0(this.a,b))}} -A.aK.prototype={ -gq(a){return new A.cI(J.a0(this.a),this.b)}, -bb(a,b,c){return new A.aG(this,b,this.$ti.h("@<1>").H(c).h("aG<1,2>"))}} -A.cI.prototype={ -k(){var s,r -for(s=this.a,r=this.b;s.k();)if(r.$1(s.gm()))return!0 -return!1}, -gm(){return this.a.gm()}} -A.ek.prototype={ -gq(a){return new A.h7(J.a0(this.a),this.b,B.H,this.$ti.h("h7<1,2>"))}} -A.h7.prototype={ -gm(){var s=this.d -return s==null?this.$ti.y[1].a(s):s}, -k(){var s,r,q=this,p=q.c -if(p==null)return!1 -for(s=q.a,r=q.b;!p.k();){q.d=null -if(s.k()){q.c=null -p=J.a0(r.$1(s.gm())) -q.c=p}else return!1}q.d=q.c.gm() -return!0}} -A.cG.prototype={ -gq(a){var s=this.a -return new A.hP(s.gq(s),this.b,A.r(this).h("hP<1>"))}} -A.ei.prototype={ -gl(a){var s=this.a,r=s.gl(s) -s=this.b -if(r>s)return s -return r}, -$iq:1} -A.hP.prototype={ -k(){if(--this.b>=0)return this.a.k() -this.b=-1 -return!1}, -gm(){if(this.b<0){this.$ti.c.a(null) -return null}return this.a.gm()}} -A.bK.prototype={ -U(a,b){A.bU(b,"count") -A.ac(b,"count") -return new A.bK(this.a,this.b+b,A.r(this).h("bK<1>"))}, -gq(a){var s=this.a -return new A.hK(s.gq(s),this.b)}} -A.d5.prototype={ -gl(a){var s=this.a,r=s.gl(s)-this.b -if(r>=0)return r -return 0}, -U(a,b){A.bU(b,"count") -A.ac(b,"count") -return new A.d5(this.a,this.b+b,this.$ti)}, -$iq:1} -A.hK.prototype={ -k(){var s,r -for(s=this.a,r=0;r"))}, -U(a,b){A.ac(b,"count") -return this}, -aj(a,b){A.ac(b,"count") -return this}} -A.h4.prototype={ -k(){return!1}, -gm(){throw A.b(A.ax())}} -A.eP.prototype={ -gq(a){return new A.i6(J.a0(this.a),this.$ti.h("i6<1>"))}} -A.i6.prototype={ -k(){var s,r -for(s=this.a,r=this.$ti.c;s.k();)if(r.b(s.gm()))return!0 -return!1}, -gm(){return this.$ti.c.a(this.a.gm())}} -A.bz.prototype={ -gl(a){return J.aC(this.a)}, -gB(a){return J.os(this.a)}, -gE(a){return new A.ah(this.b,J.j1(this.a))}, -J(a,b){return new A.ah(b+this.b,J.j0(this.a,b))}, -aj(a,b){A.bU(b,"count") -A.ac(b,"count") -return new A.bz(J.j2(this.a,b),this.b,A.r(this).h("bz<1>"))}, -U(a,b){A.bU(b,"count") -A.ac(b,"count") -return new A.bz(J.e6(this.a,b),b+this.b,A.r(this).h("bz<1>"))}, -gq(a){return new A.eo(J.a0(this.a),this.b)}} -A.cw.prototype={ -gD(a){var s,r=this.a,q=J.a5(r),p=q.gl(r) -if(p<=0)throw A.b(A.ax()) -s=q.gD(r) -if(p!==q.gl(r))throw A.b(A.ao(this)) -return new A.ah(p-1+this.b,s)}, -aj(a,b){A.bU(b,"count") -A.ac(b,"count") -return new A.cw(J.j2(this.a,b),this.b,this.$ti)}, -U(a,b){A.bU(b,"count") -A.ac(b,"count") -return new A.cw(J.e6(this.a,b),this.b+b,this.$ti)}, -$iq:1} -A.eo.prototype={ -k(){if(++this.c>=0&&this.a.k())return!0 -this.c=-2 -return!1}, -gm(){var s=this.c -return s>=0?new A.ah(this.b+s,this.a.gm()):A.D(A.ax())}} -A.el.prototype={} -A.hT.prototype={ -t(a,b,c){throw A.b(A.a3("Cannot modify an unmodifiable list"))}, -N(a,b,c,d,e){throw A.b(A.a3("Cannot modify an unmodifiable list"))}, -ad(a,b,c,d){return this.N(0,b,c,d,0)}} -A.du.prototype={} -A.eE.prototype={ -gl(a){return J.aC(this.a)}, -J(a,b){var s=this.a,r=J.a5(s) -return r.J(s,r.gl(s)-1-b)}} -A.hO.prototype={ -gA(a){var s=this._hashCode -if(s!=null)return s -s=664597*B.a.gA(this.a)&536870911 -this._hashCode=s -return s}, -i(a){return'Symbol("'+this.a+'")'}, -T(a,b){if(b==null)return!1 -return b instanceof A.hO&&this.a===b.a}} -A.fy.prototype={} -A.ah.prototype={$r:"+(1,2)",$s:1} -A.cS.prototype={$r:"+file,outFlags(1,2)",$s:2} -A.iC.prototype={$r:"+result,resultCode(1,2)",$s:3} -A.ee.prototype={ -i(a){return A.oJ(this)}, -t(a,b,c){A.ue()}, -gd1(){return new A.dR(this.kC(),A.r(this).h("dR>"))}, -kC(){var s=this -return function(){var r=0,q=1,p=[],o,n,m -return function $async$gd1(a,b,c){if(b===1){p.push(c) -r=q}for(;;)switch(r){case 0:o=s.gX(),o=o.gq(o),n=A.r(s).h("aP<1,2>") -case 2:if(!o.k()){r=3 -break}m=o.gm() -r=4 -return a.b=new A.aP(m,s.j(0,m),n),1 -case 4:r=2 -break -case 3:return 0 -case 1:return a.c=p.at(-1),3}}}}, -$iaq:1} -A.cu.prototype={ -gl(a){return this.b.length}, -gfs(){var s=this.$keys -if(s==null){s=Object.keys(this.a) -this.$keys=s}return s}, -a_(a){if(typeof a!="string")return!1 -if("__proto__"===a)return!1 -return this.a.hasOwnProperty(a)}, -j(a,b){if(!this.a_(b))return null -return this.b[this.a[b]]}, -av(a,b){var s,r,q=this.gfs(),p=this.b -for(s=q.length,r=0;r"))}, -gbH(){return new A.cQ(this.b,this.$ti.h("cQ<2>"))}} -A.cQ.prototype={ -gl(a){return this.a.length}, -gB(a){return 0===this.a.length}, -gq(a){var s=this.a -return new A.iv(s,s.length,this.$ti.h("iv<1>"))}} -A.iv.prototype={ -gm(){var s=this.d -return s==null?this.$ti.c.a(s):s}, -k(){var s=this,r=s.c -if(r>=s.b){s.d=null -return!1}s.d=s.a[r] -s.c=r+1 -return!0}} -A.kr.prototype={ -T(a,b){if(b==null)return!1 -return b instanceof A.ep&&this.a.T(0,b.a)&&A.pp(this)===A.pp(b)}, -gA(a){return A.ez(this.a,A.pp(this),B.f,B.f)}, -i(a){var s=B.c.az([A.bS(this.$ti.c)],", ") -return this.a.i(0)+" with "+("<"+s+">")}} -A.ep.prototype={ -$2(a,b){return this.a.$1$2(a,b,this.$ti.y[0])}, -$4(a,b,c,d){return this.a.$1$4(a,b,c,d,this.$ti.y[0])}, -$S(){return A.xH(A.o0(this.a),this.$ti)}} -A.eF.prototype={} -A.ly.prototype={ -aA(a){var s,r,q=this,p=new RegExp(q.a).exec(a) -if(p==null)return null -s=Object.create(null) -r=q.b -if(r!==-1)s.arguments=p[r+1] -r=q.c -if(r!==-1)s.argumentsExpr=p[r+1] -r=q.d -if(r!==-1)s.expr=p[r+1] -r=q.e -if(r!==-1)s.method=p[r+1] -r=q.f -if(r!==-1)s.receiver=p[r+1] -return s}} -A.ey.prototype={ -i(a){return"Null check operator used on a null value"}} -A.hl.prototype={ -i(a){var s,r=this,q="NoSuchMethodError: method not found: '",p=r.b -if(p==null)return"NoSuchMethodError: "+r.a -s=r.c -if(s==null)return q+p+"' ("+r.a+")" -return q+p+"' on '"+s+"' ("+r.a+")"}} -A.hS.prototype={ -i(a){var s=this.a -return s.length===0?"Error":"Error: "+s}} -A.hB.prototype={ -i(a){return"Throw of null ('"+(this.a===null?"null":"undefined")+"' from JavaScript)"}, -$ia9:1} -A.ej.prototype={} -A.fl.prototype={ -i(a){var s,r=this.b -if(r!=null)return r -r=this.a -s=r!==null&&typeof r==="object"?r.stack:null -return this.b=s==null?"":s}, -$iT:1} -A.cs.prototype={ -i(a){var s=this.constructor,r=s==null?null:s.name -return"Closure '"+A.t4(r==null?"unknown":r)+"'"}, -glZ(){return this}, -$C:"$1", -$R:1, -$D:null} -A.jj.prototype={$C:"$0",$R:0} -A.jk.prototype={$C:"$2",$R:2} -A.lo.prototype={} -A.le.prototype={ -i(a){var s=this.$static_name -if(s==null)return"Closure of unknown static method" -return"Closure '"+A.t4(s)+"'"}} -A.ea.prototype={ -T(a,b){if(b==null)return!1 -if(this===b)return!0 -if(!(b instanceof A.ea))return!1 -return this.$_target===b.$_target&&this.a===b.a}, -gA(a){return(A.pt(this.a)^A.eC(this.$_target))>>>0}, -i(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.hF(this.a)+"'")}} -A.hI.prototype={ -i(a){return"RuntimeError: "+this.a}} -A.bA.prototype={ -gl(a){return this.a}, -gB(a){return this.a===0}, -gX(){return new A.bB(this,A.r(this).h("bB<1>"))}, -gbH(){return new A.et(this,A.r(this).h("et<2>"))}, -gd1(){return new A.es(this,A.r(this).h("es<1,2>"))}, -a_(a){var s,r -if(typeof a=="string"){s=this.b -if(s==null)return!1 -return s[a]!=null}else if(typeof a=="number"&&(a&0x3fffffff)===a){r=this.c -if(r==null)return!1 -return r[a]!=null}else return this.kI(a)}, -kI(a){var s=this.d -if(s==null)return!1 -return this.d6(this.f3(s,a),a)>=0}, -ag(a,b){b.av(0,new A.kx(this))}, -j(a,b){var s,r,q,p,o=null -if(typeof b=="string"){s=this.b -if(s==null)return o -r=s[b] -q=r==null?o:r.b -return q}else if(typeof b=="number"&&(b&0x3fffffff)===b){p=this.c -if(p==null)return o -r=p[b] -q=r==null?o:r.b -return q}else return this.kJ(b)}, -kJ(a){var s,r,q=this.d -if(q==null)return null -s=this.f3(q,a) -r=this.d6(s,a) -if(r<0)return null -return s[r].b}, -t(a,b,c){var s,r,q=this -if(typeof b=="string"){s=q.b -q.f2(s==null?q.b=q.dZ():s,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){r=q.c -q.f2(r==null?q.c=q.dZ():r,b,c)}else q.kL(b,c)}, -kL(a,b){var s,r,q,p=this,o=p.d -if(o==null)o=p.d=p.dZ() -s=p.ey(a) -r=o[s] -if(r==null)o[s]=[p.dv(a,b)] -else{q=p.d6(r,a) -if(q>=0)r[q].b=b -else r.push(p.dv(a,b))}}, -hl(a,b){var s,r,q=this -if(q.a_(a)){s=q.j(0,a) -return s==null?A.r(q).y[1].a(s):s}r=b.$0() -q.t(0,a,r) -return r}, -F(a,b){var s=this -if(typeof b=="string")return s.f4(s.b,b) -else if(typeof b=="number"&&(b&0x3fffffff)===b)return s.f4(s.c,b) -else return s.kK(b)}, -kK(a){var s,r,q,p,o=this,n=o.d -if(n==null)return null -s=o.ey(a) -r=n[s] -q=o.d6(r,a) -if(q<0)return null -p=r.splice(q,1)[0] -o.f5(p) -if(r.length===0)delete n[s] -return p.b}, -c4(a){var s=this -if(s.a>0){s.b=s.c=s.d=s.e=s.f=null -s.a=0 -s.du()}}, -av(a,b){var s=this,r=s.e,q=s.r -while(r!=null){b.$2(r.a,r.b) -if(q!==s.r)throw A.b(A.ao(s)) -r=r.c}}, -f2(a,b,c){var s=a[b] -if(s==null)a[b]=this.dv(b,c) -else s.b=c}, -f4(a,b){var s -if(a==null)return null -s=a[b] -if(s==null)return null -this.f5(s) -delete a[b] -return s.b}, -du(){this.r=this.r+1&1073741823}, -dv(a,b){var s,r=this,q=new A.kA(a,b) -if(r.e==null)r.e=r.f=q -else{s=r.f -s.toString -q.d=s -r.f=s.c=q}++r.a -r.du() -return q}, -f5(a){var s=this,r=a.d,q=a.c -if(r==null)s.e=q -else r.c=q -if(q==null)s.f=r -else q.d=r;--s.a -s.du()}, -ey(a){return J.aE(a)&1073741823}, -f3(a,b){return a[this.ey(b)]}, -d6(a,b){var s,r -if(a==null)return-1 -s=a.length -for(r=0;r"]=s -delete s[""] -return s}} -A.kx.prototype={ -$2(a,b){this.a.t(0,a,b)}, -$S(){return A.r(this.a).h("~(1,2)")}} -A.kA.prototype={} -A.bB.prototype={ -gl(a){return this.a.a}, -gB(a){return this.a.a===0}, -gq(a){var s=this.a -return new A.hp(s,s.r,s.e)}} -A.hp.prototype={ -gm(){return this.d}, -k(){var s,r=this,q=r.a -if(r.b!==q.r)throw A.b(A.ao(q)) -s=r.c -if(s==null){r.d=null -return!1}else{r.d=s.a -r.c=s.c -return!0}}} -A.et.prototype={ -gl(a){return this.a.a}, -gB(a){return this.a.a===0}, -gq(a){var s=this.a -return new A.db(s,s.r,s.e)}} -A.db.prototype={ -gm(){return this.d}, -k(){var s,r=this,q=r.a -if(r.b!==q.r)throw A.b(A.ao(q)) -s=r.c -if(s==null){r.d=null -return!1}else{r.d=s.b -r.c=s.c -return!0}}} -A.es.prototype={ -gl(a){return this.a.a}, -gB(a){return this.a.a===0}, -gq(a){var s=this.a -return new A.ho(s,s.r,s.e,this.$ti.h("ho<1,2>"))}} -A.ho.prototype={ -gm(){var s=this.d -s.toString -return s}, -k(){var s,r=this,q=r.a -if(r.b!==q.r)throw A.b(A.ao(q)) -s=r.c -if(s==null){r.d=null -return!1}else{r.d=new A.aP(s.a,s.b,r.$ti.h("aP<1,2>")) -r.c=s.c -return!0}}} -A.o8.prototype={ -$1(a){return this.a(a)}, -$S:60} -A.o9.prototype={ -$2(a,b){return this.a(a,b)}, -$S:51} -A.oa.prototype={ -$1(a){return this.a(a)}, -$S:52} -A.fh.prototype={ -i(a){return this.fT(!1)}, -fT(a){var s,r,q,p,o,n=this.iz(),m=this.fo(),l=(a?"Record ":"")+"(" -for(s=n.length,r="",q=0;q0;){--q;--s -k[q]=r[s]}}return A.aO(k,t.K)}} -A.iB.prototype={ -fo(){return[this.a,this.b]}, -T(a,b){if(b==null)return!1 -return b instanceof A.iB&&this.$s===b.$s&&J.aj(this.a,b.a)&&J.aj(this.b,b.b)}, -gA(a){return A.ez(this.$s,this.a,this.b,B.f)}} -A.cA.prototype={ -i(a){return"RegExp/"+this.a+"/"+this.b.flags}, -gfv(){var s=this,r=s.c -if(r!=null)return r -r=s.b -return s.c=A.oF(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,"g")}, -giP(){var s=this,r=s.d -if(r!=null)return r -r=s.b -return s.d=A.oF(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,"y")}, -ii(){var s,r=this.a -if(!B.a.G(r,"("))return!1 -s=this.b.unicode?"u":"" -return new RegExp("(?:)|"+r,s).exec("").length>1}, -a9(a){var s=this.b.exec(a) -if(s==null)return null -return new A.dJ(s)}, -cU(a,b,c){var s=b.length -if(c>s)throw A.b(A.X(c,0,s,null,null)) -return new A.i7(this,b,c)}, -ef(a,b){return this.cU(0,b,0)}, -fk(a,b){var s,r=this.gfv() -r.lastIndex=b -s=r.exec(a) -if(s==null)return null -return new A.dJ(s)}, -iy(a,b){var s,r=this.giP() -r.lastIndex=b -s=r.exec(a) -if(s==null)return null -return new A.dJ(s)}, -hh(a,b,c){if(c<0||c>b.length)throw A.b(A.X(c,0,b.length,null,null)) -return this.iy(b,c)}} -A.dJ.prototype={ -gcA(){return this.b.index}, -gby(){var s=this.b -return s.index+s[0].length}, -j(a,b){return this.b[b]}, -aM(a){var s,r=this.b.groups -if(r!=null){s=r[a] -if(s!=null||a in r)return s}throw A.b(A.ae(a,"name","Not a capture group name"))}, -$ieu:1, -$ihG:1} -A.i7.prototype={ -gq(a){return new A.ma(this.a,this.b,this.c)}} -A.ma.prototype={ -gm(){var s=this.d -return s==null?t.cz.a(s):s}, -k(){var s,r,q,p,o,n,m=this,l=m.b -if(l==null)return!1 -s=m.c -r=l.length -if(s<=r){q=m.a -p=q.fk(l,s) -if(p!=null){m.d=p -o=p.gby() -if(p.b.index===o){s=!1 -if(q.b.unicode){q=m.c -n=q+1 -if(n=55296&&r<=56319){s=l.charCodeAt(n) -s=s>=56320&&s<=57343}}}o=(s?o+1:o)+1}m.c=o -return!0}}m.b=m.d=null -return!1}} -A.ds.prototype={ -gby(){return this.a+this.c.length}, -j(a,b){if(b!==0)throw A.b(A.kO(b,null)) -return this.c}, -$ieu:1, -gcA(){return this.a}} -A.iK.prototype={ -gq(a){return new A.ni(this.a,this.b,this.c)}, -gE(a){var s=this.b,r=this.a.indexOf(s,this.c) -if(r>=0)return new A.ds(r,s) -throw A.b(A.ax())}} -A.ni.prototype={ -k(){var s,r,q=this,p=q.c,o=q.b,n=o.length,m=q.a,l=m.length -if(p+n>l){q.d=null -return!1}s=m.indexOf(o,p) -if(s<0){q.c=l+1 -q.d=null -return!1}r=s+n -q.d=new A.ds(s,o) -q.c=r===q.c?r+1:r -return!0}, -gm(){var s=this.d -s.toString -return s}} -A.mq.prototype={ -af(){var s=this.b -if(s===this)throw A.b(A.qa(this.a)) -return s}} -A.de.prototype={ -gS(a){return B.aY}, -fZ(a,b,c){A.fz(a,b,c) -return c==null?new Uint8Array(a,b):new Uint8Array(a,b,c)}, -jW(a,b,c){var s -A.fz(a,b,c) -s=new DataView(a,b) -return s}, -fY(a){return this.jW(a,0,null)}, -$iL:1, -$icq:1} -A.dd.prototype={$idd:1} -A.ew.prototype={ -gaX(a){if(((a.$flags|0)&2)!==0)return new A.iQ(a.buffer) -else return a.buffer}, -iL(a,b,c,d){var s=A.X(b,0,c,d,null) -throw A.b(s)}, -fb(a,b,c,d){if(b>>>0!==b||b>c)this.iL(a,b,c,d)}} -A.iQ.prototype={ -fZ(a,b,c){var s=A.bF(this.a,b,c) -s.$flags=3 -return s}, -fY(a){var s=A.qc(this.a,0,null) -s.$flags=3 -return s}, -$icq:1} -A.ev.prototype={ -gS(a){return B.aZ}, -$iL:1, -$iou:1} -A.dg.prototype={ -gl(a){return a.length}, -fM(a,b,c,d,e){var s,r,q=a.length -this.fb(a,b,q,"start") -this.fb(a,c,q,"end") -if(b>c)throw A.b(A.X(b,0,c,null,null)) -s=c-b -if(e<0)throw A.b(A.K(e,null)) -r=d.length -if(r-e0){s=Date.now()-r.c -if(s>(p+1)*o)p=B.b.f1(s,o)}q.c=p -r.d.$1(q)}, -$S:3} -A.i8.prototype={ -O(a){var s,r=this -if(a==null)a=r.$ti.c.a(a) -if(!r.b)r.a.b4(a) -else{s=r.a -if(r.$ti.h("C<1>").b(a))s.fa(a) -else s.bM(a)}}, -bx(a,b){var s=this.a -if(this.b)s.V(new A.W(a,b)) -else s.aR(new A.W(a,b))}} -A.nJ.prototype={ -$1(a){return this.a.$2(0,a)}, -$S:18} -A.nK.prototype={ -$2(a,b){this.a.$2(1,new A.ej(a,b))}, -$S:71} -A.nY.prototype={ -$2(a,b){this.a(a,b)}, -$S:126} -A.iL.prototype={ -gm(){return this.b}, -jf(a,b){var s,r,q -a=a -b=b -s=this.a -for(;;)try{r=s(this,a,b) -return r}catch(q){b=q -a=1}}, -k(){var s,r,q,p,o=this,n=null,m=0 -for(;;){s=o.d -if(s!=null)try{if(s.k()){o.b=s.gm() -return!0}else o.d=null}catch(r){n=r -m=1 -o.d=null}q=o.jf(m,n) -if(1===q)return!0 -if(0===q){o.b=null -p=o.e -if(p==null||p.length===0){o.a=A.r0 -return!1}o.a=p.pop() -m=0 -n=null -continue}if(2===q){m=0 -n=null -continue}if(3===q){n=o.c -o.c=null -p=o.e -if(p==null||p.length===0){o.b=null -o.a=A.r0 -throw n -return!1}o.a=p.pop() -m=1 -continue}throw A.b(A.A("sync*"))}return!1}, -m0(a){var s,r,q=this -if(a instanceof A.dR){s=a.a() -r=q.e -if(r==null)r=q.e=[] -r.push(q.a) -q.a=s -return 2}else{q.d=J.a0(a) -return 2}}} -A.dR.prototype={ -gq(a){return new A.iL(this.a())}} -A.W.prototype={ -i(a){return A.t(this.a)}, -$iM:1, -gaP(){return this.b}} -A.eU.prototype={} -A.cL.prototype={ -an(){}, -ao(){}} -A.cK.prototype={ -gbO(){return this.c<4}, -fH(a){var s=a.CW,r=a.ch -if(s==null)this.d=r -else s.ch=r -if(r==null)this.e=s -else r.CW=s -a.CW=a -a.ch=a}, -fN(a,b,c,d){var s,r,q,p,o,n,m,l,k,j=this -if((j.c&4)!==0){s=$.n -r=new A.f_(s) -A.pv(r.gfw()) -if(c!=null)r.c=s.aB(c,t.H) -return r}s=A.r(j) -r=$.n -q=d?1:0 -p=b!=null?32:0 -o=A.ie(r,a,s.c) -n=A.ig(r,b) -m=c==null?A.rL():c -l=new A.cL(j,o,n,r.aB(m,t.H),r,q|p,s.h("cL<1>")) -l.CW=l -l.ch=l -l.ay=j.c&1 -k=j.e -j.e=l -l.ch=null -l.CW=k -if(k==null)j.d=l -else k.ch=l -if(j.d===l)A.iW(j.a) -return l}, -fB(a){var s,r=this -A.r(r).h("cL<1>").a(a) -if(a.ch===a)return null -s=a.ay -if((s&2)!==0)a.ay=s|4 -else{r.fH(a) -if((r.c&2)===0&&r.d==null)r.dB()}return null}, -fC(a){}, -fD(a){}, -bK(){if((this.c&4)!==0)return new A.aI("Cannot add new events after calling close") -return new A.aI("Cannot add new events while doing an addStream")}, -v(a,b){if(!this.gbO())throw A.b(this.bK()) -this.b6(b)}, -a2(a,b){var s -if(!this.gbO())throw A.b(this.bK()) -s=A.nR(a,b) -this.b8(s.a,s.b)}, -n(){var s,r,q=this -if((q.c&4)!==0){s=q.r -s.toString -return s}if(!q.gbO())throw A.b(q.bK()) -q.c|=4 -r=q.r -if(r==null)r=q.r=new A.m($.n,t.D) -q.b7() -return r}, -dP(a){var s,r,q,p=this,o=p.c -if((o&2)!==0)throw A.b(A.A(u.o)) -s=p.d -if(s==null)return -r=o&1 -p.c=o^3 -while(s!=null){o=s.ay -if((o&1)===r){s.ay=o|2 -a.$1(s) -o=s.ay^=1 -q=s.ch -if((o&4)!==0)p.fH(s) -s.ay&=4294967293 -s=q}else s=s.ch}p.c&=4294967293 -if(p.d==null)p.dB()}, -dB(){if((this.c&4)!==0){var s=this.r -if((s.a&30)===0)s.b4(null)}A.iW(this.b)}, -$iaf:1} -A.fo.prototype={ -gbO(){return A.cK.prototype.gbO.call(this)&&(this.c&2)===0}, -bK(){if((this.c&2)!==0)return new A.aI(u.o) -return this.hT()}, -b6(a){var s=this,r=s.d -if(r==null)return -if(r===s.e){s.c|=2 -r.aQ(a) -s.c&=4294967293 -if(s.d==null)s.dB() -return}s.dP(new A.nj(s,a))}, -b8(a,b){if(this.d==null)return -this.dP(new A.nl(this,a,b))}, -b7(){var s=this -if(s.d!=null)s.dP(new A.nk(s)) -else s.r.b4(null)}} -A.nj.prototype={ -$1(a){a.aQ(this.b)}, -$S(){return this.a.$ti.h("~(ag<1>)")}} -A.nl.prototype={ -$1(a){a.a7(this.b,this.c)}, -$S(){return this.a.$ti.h("~(ag<1>)")}} -A.nk.prototype={ -$1(a){a.bm()}, -$S(){return this.a.$ti.h("~(ag<1>)")}} -A.kj.prototype={ -$0(){this.c.a(null) -this.b.b5(null)}, -$S:0} -A.kl.prototype={ -$2(a,b){var s=this,r=s.a,q=--r.b -if(r.a!=null){r.a=null -r.d=a -r.c=b -if(q===0||s.c)s.d.V(new A.W(a,b))}else if(q===0&&!s.c){q=r.d -q.toString -r=r.c -r.toString -s.d.V(new A.W(q,r))}}, -$S:7} -A.kk.prototype={ -$1(a){var s,r,q,p,o,n,m=this,l=m.a,k=--l.b,j=l.a -if(j!=null){J.pI(j,m.b,a) -if(J.aj(k,0)){l=m.d -s=A.f([],l.h("u<0>")) -for(q=j,p=q.length,o=0;o")) -for(r=m.b,q=r.length,p=0;p")) -for(n=r.length,p=0;p1 -if(r)s="("+s+" errors)" -else s="" -return q+s+": "+A.t(p.a)}, -gaP(){var s=this.c -s=s==null?null:s.b -return s==null?A.M.prototype.gaP.call(this):s}} -A.f6.prototype={ -jD(a){this.a.b0(new A.mH(this,a),new A.mI(this,a),t.P)}} -A.mH.prototype={ -$1(a){this.a.b=a -this.b.$1(0)}, -$S(){return this.a.$ti.h("G(1)")}} -A.mI.prototype={ -$2(a,b){this.a.c=new A.W(a,b) -this.b.$1(1)}, -$S:22} -A.mG.prototype={ -$1(a){var s=this.a,r=s.a+=a -if(++s.b===this.b.length)this.c.$1(r)}, -$S:5} -A.dB.prototype={ -bx(a,b){if((this.a.a&30)!==0)throw A.b(A.A("Future already completed")) -this.V(A.nR(a,b))}, -a3(a){return this.bx(a,null)}} -A.a6.prototype={ -O(a){var s=this.a -if((s.a&30)!==0)throw A.b(A.A("Future already completed")) -s.b4(a)}, -ai(){return this.O(null)}, -V(a){this.a.aR(a)}} -A.Z.prototype={ -O(a){var s=this.a -if((s.a&30)!==0)throw A.b(A.A("Future already completed")) -s.b5(a)}, -ai(){return this.O(null)}, -V(a){this.a.V(a)}} -A.bv.prototype={ -kV(a){if((this.c&15)!==6)return!0 -return this.b.b.co(this.d,a.a,t.y,t.K)}, -kG(a){var s,r=this.e,q=null,p=t.z,o=t.K,n=a.a,m=this.b.b -if(t._.b(r))q=m.eN(r,n,a.b,p,o,t.l) -else q=m.co(r,n,p,o) -try{p=q -return p}catch(s){if(t.eK.b(A.I(s))){if((this.c&1)!==0)throw A.b(A.K("The error handler of Future.then must return a value of the returned future's type","onError")) -throw A.b(A.K("The error handler of Future.catchError must return a value of the future's type","onError"))}else throw s}}} -A.m.prototype={ -b0(a,b,c){var s,r,q=$.n -if(q===B.d){if(b!=null&&!t._.b(b)&&!t.bI.b(b))throw A.b(A.ae(b,"onError",u.c))}else{a=q.bD(a,c.h("0/"),this.$ti.c) -if(b!=null)b=A.wO(b,q)}s=new A.m($.n,c.h("m<0>")) -r=b==null?1:3 -this.bL(new A.bv(s,r,a,b,this.$ti.h("@<1>").H(c).h("bv<1,2>"))) -return s}, -bG(a,b){return this.b0(a,null,b)}, -fR(a,b,c){var s=new A.m($.n,c.h("m<0>")) -this.bL(new A.bv(s,19,a,b,this.$ti.h("@<1>").H(c).h("bv<1,2>"))) -return s}, -ak(a){var s=this.$ti,r=$.n,q=new A.m(r,s) -if(r!==B.d)a=r.aB(a,t.z) -this.bL(new A.bv(q,8,a,null,s.h("bv<1,1>"))) -return q}, -jr(a){this.a=this.a&1|16 -this.c=a}, -cE(a){this.a=a.a&30|this.a&1 -this.c=a.c}, -bL(a){var s=this,r=s.a -if(r<=3){a.a=s.c -s.c=a}else{if((r&4)!==0){r=s.c -if((r.a&24)===0){r.bL(a) -return}s.cE(r)}s.b.b2(new A.mJ(s,a))}}, -fz(a){var s,r,q,p,o,n=this,m={} -m.a=a -if(a==null)return -s=n.a -if(s<=3){r=n.c -n.c=a -if(r!=null){q=a.a -for(p=a;q!=null;p=q,q=o)o=q.a -p.a=r}}else{if((s&4)!==0){s=n.c -if((s.a&24)===0){s.fz(a) -return}n.cE(s)}m.a=n.cL(a) -n.b.b2(new A.mO(m,n))}}, -bT(){var s=this.c -this.c=null -return this.cL(s)}, -cL(a){var s,r,q -for(s=a,r=null;s!=null;r=s,s=q){q=s.a -s.a=r}return r}, -b5(a){var s,r=this -if(r.$ti.h("C<1>").b(a))A.mM(a,r,!0) -else{s=r.bT() -r.a=8 -r.c=a -A.cN(r,s)}}, -bM(a){var s=this,r=s.bT() -s.a=8 -s.c=a -A.cN(s,r)}, -ig(a){var s,r,q,p=this -if((a.a&16)!==0){s=p.b -r=a.b -s=!(s===r||s.gaK()===r.gaK())}else s=!1 -if(s)return -q=p.bT() -p.cE(a) -A.cN(p,q)}, -V(a){var s=this.bT() -this.jr(a) -A.cN(this,s)}, -ie(a,b){this.V(new A.W(a,b))}, -b4(a){if(this.$ti.h("C<1>").b(a)){this.fa(a) -return}this.f9(a)}, -f9(a){this.a^=2 -this.b.b2(new A.mL(this,a))}, -fa(a){A.mM(a,this,!1) -return}, -aR(a){this.a^=2 -this.b.b2(new A.mK(this,a))}, -$iC:1} -A.mJ.prototype={ -$0(){A.cN(this.a,this.b)}, -$S:0} -A.mO.prototype={ -$0(){A.cN(this.b,this.a.a)}, -$S:0} -A.mN.prototype={ -$0(){A.mM(this.a.a,this.b,!0)}, -$S:0} -A.mL.prototype={ -$0(){this.a.bM(this.b)}, -$S:0} -A.mK.prototype={ -$0(){this.a.V(this.b)}, -$S:0} -A.mR.prototype={ -$0(){var s,r,q,p,o,n,m,l,k=this,j=null -try{q=k.a.a -j=q.b.b.bd(q.d,t.z)}catch(p){s=A.I(p) -r=A.a8(p) -if(k.c&&k.b.a.c.a===s){q=k.a -q.c=k.b.a.c}else{q=s -o=r -if(o==null)o=A.fM(q) -n=k.a -n.c=new A.W(q,o) -q=n}q.b=!0 -return}if(j instanceof A.m&&(j.a&24)!==0){if((j.a&16)!==0){q=k.a -q.c=j.c -q.b=!0}return}if(j instanceof A.m){m=k.b.a -l=new A.m(m.b,m.$ti) -j.b0(new A.mS(l,m),new A.mT(l),t.H) -q=k.a -q.c=l -q.b=!1}}, -$S:0} -A.mS.prototype={ -$1(a){this.a.ig(this.b)}, -$S:39} -A.mT.prototype={ -$2(a,b){this.a.V(new A.W(a,b))}, -$S:22} -A.mQ.prototype={ -$0(){var s,r,q,p,o,n -try{q=this.a -p=q.a -o=p.$ti -q.c=p.b.b.co(p.d,this.b,o.h("2/"),o.c)}catch(n){s=A.I(n) -r=A.a8(n) -q=s -p=r -if(p==null)p=A.fM(q) -o=this.a -o.c=new A.W(q,p) -o.b=!0}}, -$S:0} -A.mP.prototype={ -$0(){var s,r,q,p,o,n,m,l=this -try{s=l.a.a.c -p=l.b -if(p.a.kV(s)&&p.a.e!=null){p.c=p.a.kG(s) -p.b=!1}}catch(o){r=A.I(o) -q=A.a8(o) -p=l.a.a.c -if(p.a===r){n=l.b -n.c=p -p=n}else{p=r -n=q -if(n==null)n=A.fM(p) -m=l.b -m.c=new A.W(p,n) -p=m}p.b=!0}}, -$S:0} -A.i9.prototype={} -A.Y.prototype={ -gl(a){var s={},r=new A.m($.n,t.gR) -s.a=0 -this.P(new A.ll(s,this),!0,new A.lm(s,r),r.gdG()) -return r}, -gE(a){var s=new A.m($.n,A.r(this).h("m")),r=this.P(null,!0,new A.lj(s),s.gdG()) -r.ce(new A.lk(this,r,s)) -return s}, -eo(a,b){var s=new A.m($.n,A.r(this).h("m")),r=this.P(null,!0,new A.lh(null,s),s.gdG()) -r.ce(new A.li(this,b,r,s)) -return s}} -A.ll.prototype={ -$1(a){++this.a.a}, -$S(){return A.r(this.b).h("~(Y.T)")}} -A.lm.prototype={ -$0(){this.b.b5(this.a.a)}, -$S:0} -A.lj.prototype={ -$0(){var s,r=A.ld(),q=new A.aI("No element") -A.eD(q,r) -s=A.dY(q,r) -if(s==null)s=new A.W(q,r) -this.a.V(s)}, -$S:0} -A.lk.prototype={ -$1(a){A.rn(this.b,this.c,a)}, -$S(){return A.r(this.a).h("~(Y.T)")}} -A.lh.prototype={ -$0(){var s,r=A.ld(),q=new A.aI("No element") -A.eD(q,r) -s=A.dY(q,r) -if(s==null)s=new A.W(q,r) -this.b.V(s)}, -$S:0} -A.li.prototype={ -$1(a){var s=this.c,r=this.d -A.wU(new A.lf(this.b,a),new A.lg(s,r,a),A.wf(s,r))}, -$S(){return A.r(this.a).h("~(Y.T)")}} -A.lf.prototype={ -$0(){return this.a.$1(this.b)}, -$S:28} -A.lg.prototype={ -$1(a){if(a)A.rn(this.a,this.b,this.c)}, -$S:81} -A.hN.prototype={} -A.cT.prototype={ -gj1(){if((this.b&8)===0)return this.a -return this.a.ge9()}, -dM(){var s,r=this -if((r.b&8)===0){s=r.a -return s==null?r.a=new A.fg():s}s=r.a.ge9() -return s}, -gaV(){var s=this.a -return(this.b&8)!==0?s.ge9():s}, -dz(){if((this.b&4)!==0)return new A.aI("Cannot add event after closing") -return new A.aI("Cannot add event while adding a stream")}, -fh(){var s=this.c -if(s==null)s=this.c=(this.b&2)!==0?$.co():new A.m($.n,t.D) -return s}, -v(a,b){var s=this,r=s.b -if(r>=4)throw A.b(s.dz()) -if((r&1)!==0)s.b6(b) -else if((r&3)===0)s.dM().v(0,new A.dD(b))}, -a2(a,b){var s,r,q=this -if(q.b>=4)throw A.b(q.dz()) -s=A.nR(a,b) -a=s.a -b=s.b -r=q.b -if((r&1)!==0)q.b8(a,b) -else if((r&3)===0)q.dM().v(0,new A.eY(a,b))}, -jU(a){return this.a2(a,null)}, -n(){var s=this,r=s.b -if((r&4)!==0)return s.fh() -if(r>=4)throw A.b(s.dz()) -r=s.b=r|4 -if((r&1)!==0)s.b7() -else if((r&3)===0)s.dM().v(0,B.w) -return s.fh()}, -fN(a,b,c,d){var s,r,q,p=this -if((p.b&3)!==0)throw A.b(A.A("Stream has already been listened to.")) -s=A.vq(p,a,b,c,d,A.r(p).c) -r=p.gj1() -if(((p.b|=1)&8)!==0){q=p.a -q.se9(s) -q.bc()}else p.a=s -s.js(r) -s.dQ(new A.ng(p)) -return s}, -fB(a){var s,r,q,p,o,n,m,l=this,k=null -if((l.b&8)!==0)k=l.a.I() -l.a=null -l.b=l.b&4294967286|2 -s=l.r -if(s!=null)if(k==null)try{r=s.$0() -if(r instanceof A.m)k=r}catch(o){q=A.I(o) -p=A.a8(o) -n=new A.m($.n,t.D) -n.aR(new A.W(q,p)) -k=n}else k=k.ak(s) -m=new A.nf(l) -if(k!=null)k=k.ak(m) -else m.$0() -return k}, -fC(a){if((this.b&8)!==0)this.a.bC() -A.iW(this.e)}, -fD(a){if((this.b&8)!==0)this.a.bc() -A.iW(this.f)}, -$iaf:1} -A.ng.prototype={ -$0(){A.iW(this.a.d)}, -$S:0} -A.nf.prototype={ -$0(){var s=this.a.c -if(s!=null&&(s.a&30)===0)s.b4(null)}, -$S:0} -A.iM.prototype={ -b6(a){this.gaV().aQ(a)}, -b8(a,b){this.gaV().a7(a,b)}, -b7(){this.gaV().bm()}} -A.ia.prototype={ -b6(a){this.gaV().bl(new A.dD(a))}, -b8(a,b){this.gaV().bl(new A.eY(a,b))}, -b7(){this.gaV().bl(B.w)}} -A.dA.prototype={} -A.dS.prototype={} -A.au.prototype={ -gA(a){return(A.eC(this.a)^892482866)>>>0}, -T(a,b){if(b==null)return!1 -if(this===b)return!0 -return b instanceof A.au&&b.a===this.a}} -A.cg.prototype={ -cJ(){return this.w.fB(this)}, -an(){this.w.fC(this)}, -ao(){this.w.fD(this)}} -A.dP.prototype={ -v(a,b){this.a.v(0,b)}, -a2(a,b){this.a.a2(a,b)}, -n(){return this.a.n()}, -$iaf:1} -A.ag.prototype={ -js(a){var s=this -if(a==null)return -s.r=a -if(a.c!=null){s.e=(s.e|128)>>>0 -a.cz(s)}}, -ce(a){this.a=A.ie(this.d,a,A.r(this).h("ag.T"))}, -eI(a){var s=this -s.e=(s.e&4294967263)>>>0 -s.b=A.ig(s.d,a)}, -bC(){var s,r,q=this,p=q.e -if((p&8)!==0)return -s=(p+256|4)>>>0 -q.e=s -if(p<256){r=q.r -if(r!=null)if(r.a===1)r.a=3}if((p&4)===0&&(s&64)===0)q.dQ(q.gbP())}, -bc(){var s=this,r=s.e -if((r&8)!==0)return -if(r>=256){r=s.e=r-256 -if(r<256)if((r&128)!==0&&s.r.c!=null)s.r.cz(s) -else{r=(r&4294967291)>>>0 -s.e=r -if((r&64)===0)s.dQ(s.gbQ())}}}, -I(){var s=this,r=(s.e&4294967279)>>>0 -s.e=r -if((r&8)===0)s.dC() -r=s.f -return r==null?$.co():r}, -dC(){var s,r=this,q=r.e=(r.e|8)>>>0 -if((q&128)!==0){s=r.r -if(s.a===1)s.a=3}if((q&64)===0)r.r=null -r.f=r.cJ()}, -aQ(a){var s=this.e -if((s&8)!==0)return -if(s<64)this.b6(a) -else this.bl(new A.dD(a))}, -a7(a,b){var s -if(t.C.b(a))A.eD(a,b) -s=this.e -if((s&8)!==0)return -if(s<64)this.b8(a,b) -else this.bl(new A.eY(a,b))}, -bm(){var s=this,r=s.e -if((r&8)!==0)return -r=(r|2)>>>0 -s.e=r -if(r<64)s.b7() -else s.bl(B.w)}, -an(){}, -ao(){}, -cJ(){return null}, -bl(a){var s,r=this,q=r.r -if(q==null)q=r.r=new A.fg() -q.v(0,a) -s=r.e -if((s&128)===0){s=(s|128)>>>0 -r.e=s -if(s<256)q.cz(r)}}, -b6(a){var s=this,r=s.e -s.e=(r|64)>>>0 -s.d.cp(s.a,a,A.r(s).h("ag.T")) -s.e=(s.e&4294967231)>>>0 -s.dD((r&4)!==0)}, -b8(a,b){var s,r=this,q=r.e,p=new A.mp(r,a,b) -if((q&1)!==0){r.e=(q|16)>>>0 -r.dC() -s=r.f -if(s!=null&&s!==$.co())s.ak(p) -else p.$0()}else{p.$0() -r.dD((q&4)!==0)}}, -b7(){var s,r=this,q=new A.mo(r) -r.dC() -r.e=(r.e|16)>>>0 -s=r.f -if(s!=null&&s!==$.co())s.ak(q) -else q.$0()}, -dQ(a){var s=this,r=s.e -s.e=(r|64)>>>0 -a.$0() -s.e=(s.e&4294967231)>>>0 -s.dD((r&4)!==0)}, -dD(a){var s,r,q=this,p=q.e -if((p&128)!==0&&q.r.c==null){p=q.e=(p&4294967167)>>>0 -s=!1 -if((p&4)!==0)if(p<256){s=q.r -s=s==null?null:s.c==null -s=s!==!1}if(s){p=(p&4294967291)>>>0 -q.e=p}}for(;;a=r){if((p&8)!==0){q.r=null -return}r=(p&4)!==0 -if(a===r)break -q.e=(p^64)>>>0 -if(r)q.an() -else q.ao() -p=(q.e&4294967231)>>>0 -q.e=p}if((p&128)!==0&&p<256)q.r.cz(q)}} -A.mp.prototype={ -$0(){var s,r,q,p=this.a,o=p.e -if((o&8)!==0&&(o&16)===0)return -p.e=(o|64)>>>0 -s=p.b -o=this.b -r=t.K -q=p.d -if(t.da.b(s))q.hs(s,o,this.c,r,t.l) -else q.cp(s,o,r) -p.e=(p.e&4294967231)>>>0}, -$S:0} -A.mo.prototype={ -$0(){var s=this.a,r=s.e -if((r&16)===0)return -s.e=(r|74)>>>0 -s.d.cn(s.c) -s.e=(s.e&4294967231)>>>0}, -$S:0} -A.dN.prototype={ -P(a,b,c,d){return this.a.fN(a,d,c,b===!0)}, -b_(a,b,c){return this.P(a,null,b,c)}, -kP(a){return this.P(a,null,null,null)}, -eD(a,b){return this.P(a,null,b,null)}} -A.ij.prototype={ -gcd(){return this.a}, -scd(a){return this.a=a}} -A.dD.prototype={ -eL(a){a.b6(this.b)}} -A.eY.prototype={ -eL(a){a.b8(this.b,this.c)}} -A.my.prototype={ -eL(a){a.b7()}, -gcd(){return null}, -scd(a){throw A.b(A.A("No events after a done."))}} -A.fg.prototype={ -cz(a){var s=this,r=s.a -if(r===1)return -if(r>=1){s.a=1 -return}A.pv(new A.n6(s,a)) -s.a=1}, -v(a,b){var s=this,r=s.c -if(r==null)s.b=s.c=b -else{r.scd(b) -s.c=b}}} -A.n6.prototype={ -$0(){var s,r,q=this.a,p=q.a -q.a=0 -if(p===3)return -s=q.b -r=s.gcd() -q.b=r -if(r==null)q.c=null -s.eL(this.b)}, -$S:0} -A.f_.prototype={ -ce(a){}, -eI(a){}, -bC(){var s=this.a -if(s>=0)this.a=s+2}, -bc(){var s=this,r=s.a-2 -if(r<0)return -if(r===0){s.a=1 -A.pv(s.gfw())}else s.a=r}, -I(){this.a=-1 -this.c=null -return $.co()}, -iY(){var s,r=this,q=r.a-1 -if(q===0){r.a=-1 -s=r.c -if(s!=null){r.c=null -r.b.cn(s)}}else r.a=q}} -A.dO.prototype={ -gm(){if(this.c)return this.b -return null}, -k(){var s,r=this,q=r.a -if(q!=null){if(r.c){s=new A.m($.n,t.k) -r.b=s -r.c=!1 -q.bc() -return s}throw A.b(A.A("Already waiting for next."))}return r.iK()}, -iK(){var s,r,q=this,p=q.b -if(p!=null){s=new A.m($.n,t.k) -q.b=s -r=p.P(q.giS(),!0,q.giU(),q.giW()) -if(q.b!=null)q.a=r -return s}return $.ta()}, -I(){var s=this,r=s.a,q=s.b -s.b=null -if(r!=null){s.a=null -if(!s.c)q.b4(!1) -else s.c=!1 -return r.I()}return $.co()}, -iT(a){var s,r,q=this -if(q.a==null)return -s=q.b -q.b=a -q.c=!0 -s.b5(!0) -if(q.c){r=q.a -if(r!=null)r.bC()}}, -iX(a,b){var s=this,r=s.a,q=s.b -s.b=s.a=null -if(r!=null)q.V(new A.W(a,b)) -else q.aR(new A.W(a,b))}, -iV(){var s=this,r=s.a,q=s.b -s.b=s.a=null -if(r!=null)q.bM(!1) -else q.f9(!1)}} -A.nM.prototype={ -$0(){return this.a.V(this.b)}, -$S:0} -A.nL.prototype={ -$2(a,b){A.we(this.a,this.b,new A.W(a,b))}, -$S:7} -A.nN.prototype={ -$0(){return this.a.b5(this.b)}, -$S:0} -A.f4.prototype={ -P(a,b,c,d){var s=this.$ti,r=$.n,q=b===!0?1:0,p=d!=null?32:0,o=A.ie(r,a,s.y[1]),n=A.ig(r,d) -s=new A.dE(this,o,n,r.aB(c,t.H),r,q|p,s.h("dE<1,2>")) -s.x=this.a.b_(s.gdR(),s.gdT(),s.gdV()) -return s}, -b_(a,b,c){return this.P(a,null,b,c)}} -A.dE.prototype={ -aQ(a){if((this.e&2)!==0)return -this.dt(a)}, -a7(a,b){if((this.e&2)!==0)return -this.f_(a,b)}, -an(){var s=this.x -if(s!=null)s.bC()}, -ao(){var s=this.x -if(s!=null)s.bc()}, -cJ(){var s=this.x -if(s!=null){this.x=null -return s.I()}return null}, -dS(a){this.w.iE(a,this)}, -dW(a,b){this.a7(a,b)}, -dU(){this.bm()}} -A.fb.prototype={ -iE(a,b){var s,r,q,p,o,n,m=null -try{m=this.b.$1(a)}catch(q){s=A.I(q) -r=A.a8(q) -p=s -o=r -n=A.dY(p,o) -if(n!=null){p=n.a -o=n.b}b.a7(p,o) -return}b.aQ(m)}} -A.f1.prototype={ -v(a,b){var s=this.a -if((s.e&2)!==0)A.D(A.A("Stream is already closed")) -s.dt(b)}, -a2(a,b){this.a.a7(a,b)}, -n(){var s=this.a -if((s.e&2)!==0)A.D(A.A("Stream is already closed")) -s.f0()}, -$iaf:1} -A.dL.prototype={ -aQ(a){if((this.e&2)!==0)throw A.b(A.A("Stream is already closed")) -this.dt(a)}, -a7(a,b){if((this.e&2)!==0)throw A.b(A.A("Stream is already closed")) -this.f_(a,b)}, -bm(){if((this.e&2)!==0)throw A.b(A.A("Stream is already closed")) -this.f0()}, -an(){var s=this.x -if(s!=null)s.bC()}, -ao(){var s=this.x -if(s!=null)s.bc()}, -cJ(){var s=this.x -if(s!=null){this.x=null -return s.I()}return null}, -dS(a){var s,r,q,p -try{q=this.w -q===$&&A.x() -q.v(0,a)}catch(p){s=A.I(p) -r=A.a8(p) -this.a7(s,r)}}, -dW(a,b){var s,r,q,p -try{q=this.w -q===$&&A.x() -q.a2(a,b)}catch(p){s=A.I(p) -r=A.a8(p) -if(s===a)this.a7(a,b) -else this.a7(s,r)}}, -dU(){var s,r,q,p -try{this.x=null -q=this.w -q===$&&A.x() -q.n()}catch(p){s=A.I(p) -r=A.a8(p) -this.a7(s,r)}}} -A.fn.prototype={ -eg(a){return new A.eT(this.a,a,this.$ti.h("eT<1,2>"))}} -A.eT.prototype={ -P(a,b,c,d){var s=this.$ti,r=$.n,q=b===!0?1:0,p=d!=null?32:0,o=A.ie(r,a,s.y[1]),n=A.ig(r,d),m=new A.dL(o,n,r.aB(c,t.H),r,q|p,s.h("dL<1,2>")) -m.w=this.a.$1(new A.f1(m)) -m.x=this.b.b_(m.gdR(),m.gdT(),m.gdV()) -return m}, -b_(a,b,c){return this.P(a,null,b,c)}} -A.dF.prototype={ -v(a,b){var s=this.d -if(s==null)throw A.b(A.A("Sink is closed")) -this.$ti.y[1].a(b) -s.a.aQ(b)}, -a2(a,b){var s=this.d -if(s==null)throw A.b(A.A("Sink is closed")) -s.a2(a,b)}, -n(){var s=this.d -if(s==null)return -this.d=null -this.c.$1(s)}, -$iaf:1} -A.dM.prototype={ -eg(a){return this.hU(a)}} -A.nh.prototype={ -$1(a){var s=this -return new A.dF(s.a,s.b,s.c,a,s.e.h("@<0>").H(s.d).h("dF<1,2>"))}, -$S(){return this.e.h("@<0>").H(this.d).h("dF<1,2>(af<2>)")}} -A.nG.prototype={} -A.nI.prototype={} -A.nH.prototype={} -A.nE.prototype={} -A.nF.prototype={} -A.nD.prototype={} -A.nA.prototype={} -A.iU.prototype={} -A.nz.prototype={} -A.ny.prototype={} -A.nC.prototype={} -A.nB.prototype={} -A.iT.prototype={ -kF(a,b,c,d,e){return this.b.$5(a,b,c,d,e)}} -A.iV.prototype={} -A.iS.prototype={ -bR(a,b,c){var s,r,q,p,o,n,m=this.gdX(),l=m.a -if(l===B.d){A.fD(b,c) -return}o=l.geJ() -o.toString -s=o -r=$.n -try{$.n=s -m.kF(l,l.ga8(),a,b,c) -$.n=r}catch(n){q=A.I(n) -p=A.a8(n) -$.n=r -o=b===q?c:p -s.bR(l,q,o)}}, -$iv:1} -A.ih.prototype={ -gf8(){var s=this.ax -return s==null?this.ax=new A.dV(this):s}, -ga8(){return this.ay.gf8()}, -gaK(){return this.as.a}, -cn(a){var s,r,q -try{this.bd(a,t.H)}catch(q){s=A.I(q) -r=A.a8(q) -this.bR(this,s,r)}}, -cp(a,b,c){var s,r,q -try{this.co(a,b,t.H,c)}catch(q){s=A.I(q) -r=A.a8(q) -this.bR(this,s,r)}}, -hs(a,b,c,d,e){var s,r,q -try{this.eN(a,b,c,t.H,d,e)}catch(q){s=A.I(q) -r=A.a8(q) -this.bR(this,s,r)}}, -cY(a,b){return new A.mw(this,this.aB(a,b),b)}, -c3(a){return new A.mv(this,this.aB(a,t.H))}, -eh(a,b){return new A.mx(this,this.bD(a,t.H,b),b)}, -j(a,b){var s,r,q=this.at -if(q===B.E)return null -s=q.b -r=s.j(0,b) -return r!=null||s.a_(b)?r:this.j7(q,b)}, -j7(a,b){var s,r,q -for(s=a,r=null;;){s=s.a.geJ().ged() -if(s===B.E)break -q=s.b -r=q.j(0,b) -if(r!=null||q.a_(b)){a.b.t(0,b,r) -break}}return r}, -c8(a,b){this.bR(this,a,b)}, -hb(a,b){var s=this.Q,r=s.a -return s.b.$5(r,r.ga8(),this,a,b)}, -bd(a,b){var s=this.a,r=s.a -return s.b.$1$4(r,r.ga8(),this,a,b)}, -co(a,b,c,d){var s=this.b,r=s.a -return s.b.$2$5(r,r.ga8(),this,a,b,c,d)}, -eN(a,b,c,d,e,f){var s=this.c,r=s.a -return s.b.$3$6(r,r.ga8(),this,a,b,c,d,e,f)}, -aB(a,b){var s=this.d,r=s.a -return s.b.$1$4(r,r.ga8(),this,a,b)}, -bD(a,b,c){var s=this.e,r=s.a -return s.b.$2$4(r,r.ga8(),this,a,b,c)}, -cj(a,b,c,d){var s=this.f,r=s.a -return s.b.$3$4(r,r.ga8(),this,a,b,c,d)}, -h7(a,b){var s=this.r,r=s.a -if(r===B.d)return null -return s.b.$5(r,r.ga8(),this,a,b)}, -b2(a){var s=this.w,r=s.a -return s.b.$4(r,r.ga8(),this,a)}, -ej(a,b){var s=this.x,r=s.a -return s.b.$5(r,r.ga8(),this,a,b)}, -gfJ(){return this.a}, -gfL(){return this.b}, -gfK(){return this.c}, -gfF(){return this.d}, -gfG(){return this.e}, -gfE(){return this.f}, -gfj(){return this.r}, -ge4(){return this.w}, -gfe(){return this.x}, -gfd(){return this.y}, -gfA(){return this.z}, -gfm(){return this.Q}, -gdX(){return this.as}, -ged(){return this.at}, -geJ(){return this.ay}} -A.mw.prototype={ -$0(){return this.a.bd(this.b,this.c)}, -$S(){return this.c.h("0()")}} -A.mv.prototype={ -$0(){return this.a.cn(this.b)}, -$S:0} -A.mx.prototype={ -$1(a){return this.a.cp(this.b,a,this.c)}, -$S(){return this.c.h("~(0)")}} -A.iG.prototype={ -gfJ(){return B.bu}, -gfL(){return B.bt}, -gfK(){return B.bs}, -gfF(){return B.bq}, -gfG(){return B.br}, -gfE(){return B.bp}, -gfj(){return B.bl}, -ge4(){return B.bv}, -gfe(){return B.bk}, -gfd(){return B.as}, -gfA(){return B.bo}, -gfm(){return B.bm}, -gdX(){return B.bn}, -ged(){return B.E}, -geJ(){return null}, -gf8(){var s=$.n9 -return s==null?$.n9=new A.dV(this):s}, -ga8(){var s=$.n9 -return s==null?$.n9=new A.dV(this):s}, -gaK(){return this}, -cn(a){var s,r,q -try{if(B.d===$.n){a.$0() -return}A.nT(null,null,this,a)}catch(q){s=A.I(q) -r=A.a8(q) -A.fD(s,r)}}, -cp(a,b){var s,r,q -try{if(B.d===$.n){a.$1(b) -return}A.nU(null,null,this,a,b)}catch(q){s=A.I(q) -r=A.a8(q) -A.fD(s,r)}}, -hs(a,b,c){var s,r,q -try{if(B.d===$.n){a.$2(b,c) -return}A.ph(null,null,this,a,b,c)}catch(q){s=A.I(q) -r=A.a8(q) -A.fD(s,r)}}, -cY(a,b){return new A.nb(this,a,b)}, -c3(a){return new A.na(this,a)}, -eh(a,b){return new A.nc(this,a,b)}, -j(a,b){return null}, -c8(a,b){A.fD(a,b)}, -hb(a,b){return A.rA(null,null,this,a,b)}, -bd(a){if($.n===B.d)return a.$0() -return A.nT(null,null,this,a)}, -co(a,b){if($.n===B.d)return a.$1(b) -return A.nU(null,null,this,a,b)}, -eN(a,b,c){if($.n===B.d)return a.$2(b,c) -return A.ph(null,null,this,a,b,c)}, -aB(a){return a}, -bD(a){return a}, -cj(a){return a}, -h7(a,b){return null}, -b2(a){A.nV(null,null,this,a)}, -ej(a,b){return A.oT(a,b)}} -A.nb.prototype={ -$0(){return this.a.bd(this.b,this.c)}, -$S(){return this.c.h("0()")}} -A.na.prototype={ -$0(){return this.a.cn(this.b)}, -$S:0} -A.nc.prototype={ -$1(a){return this.a.cp(this.b,a,this.c)}, -$S(){return this.c.h("~(0)")}} -A.dV.prototype={$iU:1} -A.nS.prototype={ -$0(){A.pY(this.a,this.b)}, -$S:0} -A.eQ.prototype={} -A.cO.prototype={ -gl(a){return this.a}, -gB(a){return this.a===0}, -gX(){return new A.cP(this,A.r(this).h("cP<1>"))}, -gbH(){var s=A.r(this) -return A.hr(new A.cP(this,s.h("cP<1>")),new A.mV(this),s.c,s.y[1])}, -a_(a){var s,r -if(typeof a=="string"&&a!=="__proto__"){s=this.b -return s==null?!1:s[a]!=null}else if(typeof a=="number"&&(a&1073741823)===a){r=this.c -return r==null?!1:r[a]!=null}else return this.il(a)}, -il(a){var s=this.d -if(s==null)return!1 -return this.aS(this.fn(s,a),a)>=0}, -ag(a,b){b.av(0,new A.mU(this))}, -j(a,b){var s,r,q -if(typeof b=="string"&&b!=="__proto__"){s=this.b -r=s==null?null:A.qW(s,b) -return r}else if(typeof b=="number"&&(b&1073741823)===b){q=this.c -r=q==null?null:A.qW(q,b) -return r}else return this.iC(b)}, -iC(a){var s,r,q=this.d -if(q==null)return null -s=this.fn(q,a) -r=this.aS(s,a) -return r<0?null:s[r+1]}, -t(a,b,c){var s,r,q=this -if(typeof b=="string"&&b!=="__proto__"){s=q.b -q.f7(s==null?q.b=A.p2():s,b,c)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c -q.f7(r==null?q.c=A.p2():r,b,c)}else q.jq(b,c)}, -jq(a,b){var s,r,q,p=this,o=p.d -if(o==null)o=p.d=A.p2() -s=p.dH(a) -r=o[s] -if(r==null){A.p3(o,s,[a,b]);++p.a -p.e=null}else{q=p.aS(r,a) -if(q>=0)r[q+1]=b -else{r.push(a,b);++p.a -p.e=null}}}, -av(a,b){var s,r,q,p,o,n=this,m=n.fc() -for(s=m.length,r=A.r(n).y[1],q=0;q"))}} -A.iq.prototype={ -gm(){var s=this.d -return s==null?this.$ti.c.a(s):s}, -k(){var s=this,r=s.b,q=s.c,p=s.a -if(r!==p.e)throw A.b(A.ao(p)) -else if(q>=r.length){s.d=null -return!1}else{s.d=r[q] -s.c=q+1 -return!0}}} -A.f9.prototype={ -gq(a){var s=this,r=new A.dI(s,s.r,s.$ti.h("dI<1>")) -r.c=s.e -return r}, -gl(a){return this.a}, -gB(a){return this.a===0}, -G(a,b){var s,r -if(b!=="__proto__"){s=this.b -if(s==null)return!1 -return s[b]!=null}else{r=this.ik(b) -return r}}, -ik(a){var s=this.d -if(s==null)return!1 -return this.aS(s[B.a.gA(a)&1073741823],a)>=0}, -gE(a){var s=this.e -if(s==null)throw A.b(A.A("No elements")) -return s.a}, -gD(a){var s=this.f -if(s==null)throw A.b(A.A("No elements")) -return s.a}, -v(a,b){var s,r,q=this -if(typeof b=="string"&&b!=="__proto__"){s=q.b -return q.f6(s==null?q.b=A.p4():s,b)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c -return q.f6(r==null?q.c=A.p4():r,b)}else return q.i3(b)}, -i3(a){var s,r,q=this,p=q.d -if(p==null)p=q.d=A.p4() -s=J.aE(a)&1073741823 -r=p[s] -if(r==null)p[s]=[q.e_(a)] -else{if(q.aS(r,a)>=0)return!1 -r.push(q.e_(a))}return!0}, -F(a,b){var s -if(typeof b=="string"&&b!=="__proto__")return this.jc(this.b,b) -else{s=this.jb(b) -return s}}, -jb(a){var s,r,q,p,o=this.d -if(o==null)return!1 -s=J.aE(a)&1073741823 -r=o[s] -q=this.aS(r,a) -if(q<0)return!1 -p=r.splice(q,1)[0] -if(0===r.length)delete o[s] -this.fV(p) -return!0}, -f6(a,b){if(a[b]!=null)return!1 -a[b]=this.e_(b) -return!0}, -jc(a,b){var s -if(a==null)return!1 -s=a[b] -if(s==null)return!1 -this.fV(s) -delete a[b] -return!0}, -fu(){this.r=this.r+1&1073741823}, -e_(a){var s,r=this,q=new A.n4(a) -if(r.e==null)r.e=r.f=q -else{s=r.f -s.toString -q.c=s -r.f=s.b=q}++r.a -r.fu() -return q}, -fV(a){var s=this,r=a.c,q=a.b -if(r==null)s.e=q -else r.b=q -if(q==null)s.f=r -else q.c=r;--s.a -s.fu()}, -aS(a,b){var s,r -if(a==null)return-1 -s=a.length -for(r=0;r"))}, -gl(a){return this.b}, -c4(a){var s,r,q,p=this;++p.a -if(p.b===0)return -s=p.c -s.toString -r=s -do{q=r.b -q.toString -r.b=r.c=r.a=null -if(q!==s){r=q -continue}else break}while(!0) -p.c=null -p.b=0}, -gE(a){var s -if(this.b===0)throw A.b(A.A("No such element")) -s=this.c -s.toString -return s}, -gD(a){var s -if(this.b===0)throw A.b(A.A("No such element")) -s=this.c.c -s.toString -return s}, -gB(a){return this.b===0}, -cF(a,b,c){var s,r,q=this -if(b.a!=null)throw A.b(A.A("LinkedListEntry is already in a LinkedList"));++q.a -b.a=q -s=q.b -if(s===0){b.b=b -q.c=b.c=b -q.b=s+1 -return}r=a.c -r.toString -b.c=r -b.b=a -a.c=r.b=b -q.b=s+1}, -e7(a){var s,r,q=this;++q.a -s=a.b -s.c=a.c -a.c.b=s -r=--q.b -a.a=a.b=a.c=null -if(r===0)q.c=null -else if(a===q.c)q.c=s}} -A.ix.prototype={ -gm(){var s=this.c -return s==null?this.$ti.c.a(s):s}, -k(){var s=this,r=s.a -if(s.b!==r.a)throw A.b(A.ao(s)) -if(r.b!==0)r=s.e&&s.d===r.gE(0) -else r=!0 -if(r){s.c=null -return!1}s.e=!0 -r=s.d -s.c=r -s.d=r.b -return!0}} -A.az.prototype={ -gcg(){var s=this.a -if(s==null||this===s.gE(0))return null -return this.c}} -A.w.prototype={ -gq(a){return new A.b6(a,this.gl(a),A.aU(a).h("b6"))}, -J(a,b){return this.j(a,b)}, -gB(a){return this.gl(a)===0}, -gE(a){if(this.gl(a)===0)throw A.b(A.ax()) -return this.j(a,0)}, -gD(a){if(this.gl(a)===0)throw A.b(A.ax()) -return this.j(a,this.gl(a)-1)}, -bb(a,b,c){return new A.E(a,b,A.aU(a).h("@").H(c).h("E<1,2>"))}, -U(a,b){return A.bf(a,b,null,A.aU(a).h("w.E"))}, -aj(a,b){return A.bf(a,0,A.cW(b,"count",t.S),A.aU(a).h("w.E"))}, -aE(a,b){var s,r,q,p,o=this -if(o.gB(a)){s=J.q7(0,A.aU(a).h("w.E")) -return s}r=o.j(a,0) -q=A.b7(o.gl(a),r,!0,A.aU(a).h("w.E")) -for(p=1;p").H(b).h("ak<1,2>"))}, -a0(a,b,c){var s,r=this.gl(a) -A.bd(b,c,r) -s=A.am(this.cw(a,b,c),A.aU(a).h("w.E")) -return s}, -cw(a,b,c){A.bd(b,c,this.gl(a)) -return A.bf(a,b,c,A.aU(a).h("w.E"))}, -en(a,b,c,d){var s -A.bd(b,c,this.gl(a)) -for(s=b;sp.gl(q))throw A.b(A.q5()) -if(r=0;--o)this.t(a,b+o,p.j(q,r+o)) -else for(o=0;o"))}, -gl(a){return J.aC(this.gX())}, -gB(a){return J.os(this.gX())}, -gbH(){return new A.fa(this,A.r(this).h("fa"))}, -i(a){return A.oJ(this)}, -$iaq:1} -A.kE.prototype={ -$1(a){var s=this.a,r=s.j(0,a) -if(r==null)r=A.r(s).h("S.V").a(r) -return new A.aP(a,r,A.r(s).h("aP"))}, -$S(){return A.r(this.a).h("aP(S.K)")}} -A.kF.prototype={ -$2(a,b){var s,r=this.a -if(!r.a)this.b.a+=", " -r.a=!1 -r=this.b -s=A.t(a) -r.a=(r.a+=s)+": " -s=A.t(b) -r.a+=s}, -$S:47} -A.fa.prototype={ -gl(a){var s=this.a -return s.gl(s)}, -gB(a){var s=this.a -return s.gB(s)}, -gE(a){var s=this.a -s=s.j(0,J.j1(s.gX())) -return s==null?this.$ti.y[1].a(s):s}, -gD(a){var s=this.a -s=s.j(0,J.ot(s.gX())) -return s==null?this.$ti.y[1].a(s):s}, -gq(a){var s=this.a -return new A.iy(J.a0(s.gX()),s,this.$ti.h("iy<1,2>"))}} -A.iy.prototype={ -k(){var s=this,r=s.a -if(r.k()){s.c=s.b.j(0,r.gm()) -return!0}s.c=null -return!1}, -gm(){var s=this.c -return s==null?this.$ti.y[1].a(s):s}} -A.dp.prototype={ -gB(a){return this.a===0}, -bb(a,b,c){return new A.cx(this,b,this.$ti.h("@<1>").H(c).h("cx<1,2>"))}, -i(a){return A.oD(this,"{","}")}, -aj(a,b){return A.oS(this,b,this.$ti.c)}, -U(a,b){return A.qv(this,b,this.$ti.c)}, -gE(a){var s,r=A.iw(this,this.r,this.$ti.c) -if(!r.k())throw A.b(A.ax()) -s=r.d -return s==null?r.$ti.c.a(s):s}, -gD(a){var s,r,q=A.iw(this,this.r,this.$ti.c) -if(!q.k())throw A.b(A.ax()) -s=q.$ti.c -do{r=q.d -if(r==null)r=s.a(r)}while(q.k()) -return r}, -J(a,b){var s,r,q,p=this -A.ac(b,"index") -s=A.iw(p,p.r,p.$ti.c) -for(r=b;s.k();){if(r===0){q=s.d -return q==null?s.$ti.c.a(q):q}--r}throw A.b(A.hc(b,b-r,p,null,"index"))}, -$iq:1, -$ie:1} -A.fj.prototype={} -A.nv.prototype={ -$0(){var s,r -try{s=new TextDecoder("utf-8",{fatal:true}) -return s}catch(r){}return null}, -$S:27} -A.nu.prototype={ -$0(){var s,r -try{s=new TextDecoder("utf-8",{fatal:false}) -return s}catch(r){}return null}, -$S:27} -A.fJ.prototype={ -kB(a){return B.ae.a4(a)}} -A.iP.prototype={ -a4(a){var s,r,q,p=A.bd(0,null,a.length),o=new Uint8Array(p) -for(s=~this.a,r=0;r=0){g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(f) -if(g===k)continue -k=g}else{if(f===-1){if(o<0){e=p==null?null:p.a.length -if(e==null)e=0 -o=e+(r-q) -n=r}++m -if(k===61)continue}k=g}if(f!==-2){if(p==null){p=new A.aD("") -e=p}else e=p -e.a+=B.a.p(a0,q,r) -d=A.aR(k) -e.a+=d -q=l -continue}}throw A.b(A.al("Invalid base64 data",a0,r))}if(p!=null){e=B.a.p(a0,q,a2) -e=p.a+=e -d=e.length -if(o>=0)A.pK(a0,n,a2,o,m,d) -else{c=B.b.ac(d-1,4)+1 -if(c===1)throw A.b(A.al(a,a0,a2)) -while(c<4){e+="=" -p.a=e;++c}}e=p.a -return B.a.aO(a0,a1,a2,e.charCodeAt(0)==0?e:e)}b=a2-a1 -if(o>=0)A.pK(a0,n,a2,o,m,b) -else{c=B.b.ac(b,4) -if(c===1)throw A.b(A.al(a,a0,a2)) -if(c>1)a0=B.a.aO(a0,a2,a2,c===2?"==":"=")}return a0}} -A.fO.prototype={} -A.ct.prototype={} -A.cv.prototype={} -A.h5.prototype={} -A.hZ.prototype={ -d_(a){return new A.fx(!1).dI(a,0,null,!0)}} -A.i_.prototype={ -a4(a){var s,r,q=A.bd(0,null,a.length) -if(q===0)return new Uint8Array(0) -s=new Uint8Array(q*3) -r=new A.nw(s) -if(r.iB(a,0,q)!==q)r.ea() -return B.e.a0(s,0,r.b)}} -A.nw.prototype={ -ea(){var s=this,r=s.c,q=s.b,p=s.b=q+1 -r.$flags&2&&A.z(r) -r[q]=239 -q=s.b=p+1 -r[p]=191 -s.b=q+1 -r[q]=189}, -jG(a,b){var s,r,q,p,o=this -if((b&64512)===56320){s=65536+((a&1023)<<10)|b&1023 -r=o.c -q=o.b -p=o.b=q+1 -r.$flags&2&&A.z(r) -r[q]=s>>>18|240 -q=o.b=p+1 -r[p]=s>>>12&63|128 -p=o.b=q+1 -r[q]=s>>>6&63|128 -o.b=p+1 -r[p]=s&63|128 -return!0}else{o.ea() -return!1}}, -iB(a,b,c){var s,r,q,p,o,n,m,l,k=this -if(b!==c&&(a.charCodeAt(c-1)&64512)===55296)--c -for(s=k.c,r=s.$flags|0,q=s.length,p=b;p=q)break -k.b=n+1 -r&2&&A.z(s) -s[n]=o}else{n=o&64512 -if(n===55296){if(k.b+4>q)break -m=p+1 -if(k.jG(o,a.charCodeAt(m)))p=m}else if(n===56320){if(k.b+3>q)break -k.ea()}else if(o<=2047){n=k.b -l=n+1 -if(l>=q)break -k.b=l -r&2&&A.z(s) -s[n]=o>>>6|192 -k.b=l+1 -s[l]=o&63|128}else{n=k.b -if(n+2>=q)break -l=k.b=n+1 -r&2&&A.z(s) -s[n]=o>>>12|224 -n=k.b=l+1 -s[l]=o>>>6&63|128 -k.b=n+1 -s[n]=o&63|128}}}return p}} -A.fx.prototype={ -dI(a,b,c,d){var s,r,q,p,o,n,m=this,l=A.bd(b,c,J.aC(a)) -if(b===l)return"" -if(a instanceof Uint8Array){s=a -r=s -q=0}else{r=A.w_(a,b,l) -l-=b -q=b -b=0}if(d&&l-b>=15){p=m.a -o=A.vZ(p,r,b,l) -if(o!=null){if(!p)return o -if(o.indexOf("\ufffd")<0)return o}}o=m.dK(r,b,l,d) -p=m.b -if((p&1)!==0){n=A.w0(p) -m.b=0 -throw A.b(A.al(n,a,q+m.c))}return o}, -dK(a,b,c,d){var s,r,q=this -if(c-b>1000){s=B.b.M(b+c,2) -r=q.dK(a,b,s,!1) -if((q.b&1)!==0)return r -return r+q.dK(a,s,c,d)}return q.k9(a,b,c,d)}, -k9(a,b,c,d){var s,r,q,p,o,n,m,l=this,k=65533,j=l.b,i=l.c,h=new A.aD(""),g=b+1,f=a[b] -A:for(s=l.a;;){for(;;g=p){r="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE".charCodeAt(f)&31 -i=j<=32?f&61694>>>r:(f&63|i<<6)>>>0 -j=" \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA".charCodeAt(j+r) -if(j===0){q=A.aR(i) -h.a+=q -if(g===c)break A -break}else if((j&1)!==0){if(s)switch(j){case 69:case 67:q=A.aR(k) -h.a+=q -break -case 65:q=A.aR(k) -h.a+=q;--g -break -default:q=A.aR(k) -h.a=(h.a+=q)+q -break}else{l.b=j -l.c=g-1 -return""}j=0}if(g===c)break A -p=g+1 -f=a[g]}p=g+1 -f=a[g] -if(f<128){for(;;){if(!(p=128){o=n-1 -p=n -break}p=n}if(o-g<20)for(m=g;m32)if(s){s=A.aR(k) -h.a+=s}else{l.b=77 -l.c=c -return""}l.b=j -l.c=i -s=h.a -return s.charCodeAt(0)==0?s:s}} -A.aa.prototype={ -al(a){var s,r,q=this,p=q.c -if(p===0)return q -s=!q.a -r=q.b -p=A.aS(p,r) -return new A.aa(p===0?!1:s,r,p)}, -iv(a){var s,r,q,p,o,n,m=this.c -if(m===0)return $.bb() -s=m+a -r=this.b -q=new Uint16Array(s) -for(p=m-1;p>=0;--p)q[p+a]=r[p] -o=this.a -n=A.aS(s,q) -return new A.aa(n===0?!1:o,q,n)}, -iw(a){var s,r,q,p,o,n,m,l=this,k=l.c -if(k===0)return $.bb() -s=k-a -if(s<=0)return l.a?$.pF():$.bb() -r=l.b -q=new Uint16Array(s) -for(p=a;p>>0!==0)return l.cB(0,$.d_()) -for(k=0;k=0)return q.cD(b,r) -return b.cD(q,!r)}, -cB(a,b){var s,r,q=this,p=q.c -if(p===0)return b.al(0) -s=b.c -if(s===0)return q -r=q.a -if(r!==b.a)return q.dw(b,r) -if(A.ml(q.b,p,b.b,s)>=0)return q.cD(b,r) -return b.cD(q,!r)}, -bI(a,b){var s,r,q,p,o,n,m,l=this.c,k=b.c -if(l===0||k===0)return $.bb() -s=l+k -r=this.b -q=b.b -p=new Uint16Array(s) -for(o=0;o0?p.al(0):p}, -ja(a){var s,r,q,p=this -if(p.c0)q=q.bj(0,$.oZ.af()) -return p.a&&q.c>0?q.al(0):q}, -fg(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c=this,b=c.c -if(b===$.qQ&&a.c===$.qS&&c.b===$.qP&&a.b===$.qR)return -s=a.b -r=a.c -q=16-B.b.gh0(s[r-1]) -if(q>0){p=new Uint16Array(r+5) -o=A.qO(s,r,q,p) -n=new Uint16Array(b+5) -m=A.qO(c.b,b,q,n)}else{n=A.p_(c.b,0,b,b+2) -o=r -p=s -m=b}l=p[o-1] -k=m-o -j=new Uint16Array(m) -i=A.p0(p,o,k,j) -h=m+1 -g=n.$flags|0 -if(A.ml(n,m,j,i)>=0){g&2&&A.z(n) -n[m]=1 -A.id(n,h,j,i,n)}else{g&2&&A.z(n) -n[m]=0}f=new Uint16Array(o+2) -f[o]=1 -A.id(f,o+1,p,o,f) -e=m-1 -while(k>0){d=A.vl(l,n,e);--k -A.qU(d,f,0,n,k,o) -if(n[e]1){q=$.pE() -if(q.c===0)A.D(B.ai) -p=r.ja(q).i(0) -s.push(p) -o=p.length -if(o===1)s.push("000") -if(o===2)s.push("00") -if(o===3)s.push("0") -r=r.iu(q)}s.push(B.b.i(r.b[0])) -if(m)s.push("-") -return new A.eE(s,t.bJ).c9(0)}} -A.mm.prototype={ -$2(a,b){a=a+b&536870911 -a=a+((a&524287)<<10)&536870911 -return a^a>>>6}, -$S:41} -A.mn.prototype={ -$1(a){a=a+((a&67108863)<<3)&536870911 -a^=a>>>11 -return a+((a&16383)<<15)&536870911}, -$S:40} -A.io.prototype={ -h_(a,b,c){var s=this.a -if(s!=null)s.register(a,b,c)}, -h5(a){var s=this.a -if(s!=null)s.unregister(a)}} -A.ef.prototype={ -T(a,b){if(b==null)return!1 -return b instanceof A.ef&&this.a===b.a&&this.b===b.b&&this.c===b.c}, -gA(a){return A.ez(this.a,this.b,B.f,B.f)}, -ah(a,b){var s=B.b.ah(this.a,b.a) -if(s!==0)return s -return B.b.ah(this.b,b.b)}, -i(a){var s=this,r=A.uf(A.qm(s)),q=A.fY(A.qk(s)),p=A.fY(A.qh(s)),o=A.fY(A.qi(s)),n=A.fY(A.qj(s)),m=A.fY(A.ql(s)),l=A.pT(A.uO(s)),k=s.b,j=k===0?"":A.pT(k) -k=r+"-"+q -if(s.c)return k+"-"+p+" "+o+":"+n+":"+m+"."+l+j+"Z" -else return k+"-"+p+" "+o+":"+n+":"+m+"."+l+j}} -A.by.prototype={ -T(a,b){if(b==null)return!1 -return b instanceof A.by&&this.a===b.a}, -gA(a){return B.b.gA(this.a)}, -ah(a,b){return B.b.ah(this.a,b.a)}, -i(a){var s,r,q,p,o,n=this.a,m=B.b.M(n,36e8),l=n%36e8 -if(n<0){m=0-m -n=0-l -s="-"}else{n=l -s=""}r=B.b.M(n,6e7) -n%=6e7 -q=r<10?"0":"" -p=B.b.M(n,1e6) -o=p<10?"0":"" -return s+m+":"+q+r+":"+o+p+"."+B.a.l1(B.b.i(n%1e6),6,"0")}} -A.mz.prototype={ -i(a){return this.ae()}} -A.M.prototype={ -gaP(){return A.uN(this)}} -A.fL.prototype={ -i(a){var s=this.a -if(s!=null)return"Assertion failed: "+A.h6(s) -return"Assertion failed"}} -A.bM.prototype={} -A.bc.prototype={ -gdO(){return"Invalid argument"+(!this.a?"(s)":"")}, -gdN(){return""}, -i(a){var s=this,r=s.c,q=r==null?"":" ("+r+")",p=s.d,o=p==null?"":": "+A.t(p),n=s.gdO()+q+o -if(!s.a)return n -return n+s.gdN()+": "+A.h6(s.gez())}, -gez(){return this.b}} -A.dk.prototype={ -gez(){return this.b}, -gdO(){return"RangeError"}, -gdN(){var s,r=this.e,q=this.f -if(r==null)s=q!=null?": Not less than or equal to "+A.t(q):"" -else if(q==null)s=": Not greater than or equal to "+A.t(r) -else if(q>r)s=": Not in inclusive range "+A.t(r)+".."+A.t(q) -else s=qe.length -else s=!1 -if(s)f=null -if(f==null){if(e.length>78)e=B.a.p(e,0,75)+"..." -return g+"\n"+e}for(r=1,q=0,p=!1,o=0;o1?g+(" (at line "+r+", character "+(f-q+1)+")\n"):g+(" (at character "+(f+1)+")\n") -m=e.length -for(o=f;o78){k="..." -if(f-q<75){j=q+75 -i=q}else{if(m-f<75){i=m-75 -j=m -k=""}else{i=f-36 -j=f+36}l="..."}}else{j=m -i=q -k=""}return g+l+B.a.p(e,i,j)+k+"\n"+B.a.bI(" ",f-i+l.length)+"^\n"}else return f!=null?g+(" (at offset "+A.t(f)+")"):g}, -$ia9:1} -A.he.prototype={ -gaP(){return null}, -i(a){return"IntegerDivisionByZeroException"}, -$iM:1, -$ia9:1} -A.e.prototype={ -bw(a,b){return A.ec(this,A.r(this).h("e.E"),b)}, -bb(a,b,c){return A.hr(this,b,A.r(this).h("e.E"),c)}, -aE(a,b){var s=A.r(this).h("e.E") -if(b)s=A.am(this,s) -else{s=A.am(this,s) -s.$flags=1 -s=s}return s}, -cq(a){return this.aE(0,!0)}, -gl(a){var s,r=this.gq(this) -for(s=0;r.k();)++s -return s}, -gB(a){return!this.gq(this).k()}, -aj(a,b){return A.oS(this,b,A.r(this).h("e.E"))}, -U(a,b){return A.qv(this,b,A.r(this).h("e.E"))}, -gE(a){var s=this.gq(this) -if(!s.k())throw A.b(A.ax()) -return s.gm()}, -gD(a){var s,r=this.gq(this) -if(!r.k())throw A.b(A.ax()) -do s=r.gm() -while(r.k()) -return s}, -J(a,b){var s,r -A.ac(b,"index") -s=this.gq(this) -for(r=b;s.k();){if(r===0)return s.gm();--r}throw A.b(A.hc(b,b-r,this,null,"index"))}, -i(a){return A.ux(this,"(",")")}} -A.aP.prototype={ -i(a){return"MapEntry("+A.t(this.a)+": "+A.t(this.b)+")"}} -A.G.prototype={ -gA(a){return A.d.prototype.gA.call(this,0)}, -i(a){return"null"}} -A.d.prototype={$id:1, -T(a,b){return this===b}, -gA(a){return A.eC(this)}, -i(a){return"Instance of '"+A.hF(this)+"'"}, -gS(a){return A.xB(this)}, -toString(){return this.i(this)}} -A.dQ.prototype={ -i(a){return this.a}, -$iT:1} -A.aD.prototype={ -gl(a){return this.a.length}, -i(a){var s=this.a -return s.charCodeAt(0)==0?s:s}} -A.lD.prototype={ -$2(a,b){throw A.b(A.al("Illegal IPv6 address, "+a,this.a,b))}, -$S:54} -A.fu.prototype={ -gfQ(){var s,r,q,p,o=this,n=o.w -if(n===$){s=o.a -r=s.length!==0?s+":":"" -q=o.c -p=q==null -if(!p||s==="file"){s=r+"//" -r=o.b -if(r.length!==0)s=s+r+"@" -if(!p)s+=q -r=o.d -if(r!=null)s=s+":"+A.t(r)}else s=r -s+=o.e -r=o.f -if(r!=null)s=s+"?"+r -r=o.r -if(r!=null)s=s+"#"+r -n=o.w=s.charCodeAt(0)==0?s:s}return n}, -gl2(){var s,r,q=this,p=q.x -if(p===$){s=q.e -if(s.length!==0&&s.charCodeAt(0)===47)s=B.a.K(s,1) -r=s.length===0?B.y:A.aO(new A.E(A.f(s.split("/"),t.s),A.xq(),t.do),t.N) -q.x!==$&&A.pA() -p=q.x=r}return p}, -gA(a){var s,r=this,q=r.y -if(q===$){s=B.a.gA(r.gfQ()) -r.y!==$&&A.pA() -r.y=s -q=s}return q}, -geS(){return this.b}, -gba(){var s=this.c -if(s==null)return"" -if(B.a.u(s,"[")&&!B.a.C(s,"v",1))return B.a.p(s,1,s.length-1) -return s}, -gcf(){var s=this.d -return s==null?A.r8(this.a):s}, -gci(){var s=this.f -return s==null?"":s}, -gd3(){var s=this.r -return s==null?"":s}, -kM(a){var s=this.a -if(a.length!==s.length)return!1 -return A.wg(a,s,0)>=0}, -hp(a){var s,r,q,p,o,n,m,l=this -a=A.nt(a,0,a.length) -s=a==="file" -r=l.b -q=l.d -if(a!==l.a)q=A.ns(q,a) -p=l.c -if(!(p!=null))p=r.length!==0||q!=null||s?"":null -o=l.e -if(!s)n=p!=null&&o.length!==0 -else n=!0 -if(n&&!B.a.u(o,"/"))o="/"+o -m=o -return A.fv(a,r,p,q,m,l.f,l.r)}, -ft(a,b){var s,r,q,p,o,n,m -for(s=0,r=0;B.a.C(b,"../",r);){r+=3;++s}q=B.a.d7(a,"/") -for(;;){if(!(q>0&&s>0))break -p=B.a.hg(a,"/",q-1) -if(p<0)break -o=q-p -n=o!==2 -m=!1 -if(!n||o===3)if(a.charCodeAt(p+1)===46)n=!n||a.charCodeAt(p+2)===46 -else n=m -else n=m -if(n)break;--s -q=p}return B.a.aO(a,q+1,null,B.a.K(b,r-3*s))}, -hr(a){return this.cl(A.bu(a))}, -cl(a){var s,r,q,p,o,n,m,l,k,j,i,h=this -if(a.gW().length!==0)return a -else{s=h.a -if(a.ger()){r=a.hp(s) -return r}else{q=h.b -p=h.c -o=h.d -n=h.e -if(a.ghc())m=a.gd4()?a.gci():h.f -else{l=A.vX(h,n) -if(l>0){k=B.a.p(n,0,l) -n=a.geq()?k+A.cU(a.gaa()):k+A.cU(h.ft(B.a.K(n,k.length),a.gaa()))}else if(a.geq())n=A.cU(a.gaa()) -else if(n.length===0)if(p==null)n=s.length===0?a.gaa():A.cU(a.gaa()) -else n=A.cU("/"+a.gaa()) -else{j=h.ft(n,a.gaa()) -r=s.length===0 -if(!r||p!=null||B.a.u(n,"/"))n=A.cU(j) -else n=A.p9(j,!r||p!=null)}m=a.gd4()?a.gci():null}}}i=a.ges()?a.gd3():null -return A.fv(s,q,p,o,n,m,i)}, -ger(){return this.c!=null}, -gd4(){return this.f!=null}, -ges(){return this.r!=null}, -ghc(){return this.e.length===0}, -geq(){return B.a.u(this.e,"/")}, -eP(){var s,r=this,q=r.a -if(q!==""&&q!=="file")throw A.b(A.a3("Cannot extract a file path from a "+q+" URI")) -q=r.f -if((q==null?"":q)!=="")throw A.b(A.a3(u.y)) -q=r.r -if((q==null?"":q)!=="")throw A.b(A.a3(u.l)) -if(r.c!=null&&r.gba()!=="")A.D(A.a3(u.j)) -s=r.gl2() -A.vP(s,!1) -q=A.oQ(B.a.u(r.e,"/")?"/":"",s,"/") -q=q.charCodeAt(0)==0?q:q -return q}, -i(a){return this.gfQ()}, -T(a,b){var s,r,q,p=this -if(b==null)return!1 -if(p===b)return!0 -s=!1 -if(t.dD.b(b))if(p.a===b.gW())if(p.c!=null===b.ger())if(p.b===b.geS())if(p.gba()===b.gba())if(p.gcf()===b.gcf())if(p.e===b.gaa()){r=p.f -q=r==null -if(!q===b.gd4()){if(q)r="" -if(r===b.gci()){r=p.r -q=r==null -if(!q===b.ges()){s=q?"":r -s=s===b.gd3()}}}}return s}, -$ihV:1, -gW(){return this.a}, -gaa(){return this.e}} -A.nr.prototype={ -$1(a){return A.vY(64,a,B.j,!1)}, -$S:6} -A.hW.prototype={ -geR(){var s,r,q,p,o=this,n=null,m=o.c -if(m==null){m=o.a -s=o.b[0]+1 -r=B.a.aY(m,"?",s) -q=m.length -if(r>=0){p=A.fw(m,r+1,q,256,!1,!1) -q=r}else p=n -m=o.c=new A.ii("data","",n,n,A.fw(m,s,q,128,!1,!1),p,n)}return m}, -i(a){var s=this.a -return this.b[0]===-1?"data:"+s:s}} -A.b8.prototype={ -ger(){return this.c>0}, -geu(){return this.c>0&&this.d+1r?B.a.p(this.a,r,s-1):""}, -gba(){var s=this.c -return s>0?B.a.p(this.a,s,this.d):""}, -gcf(){var s,r=this -if(r.geu())return A.bk(B.a.p(r.a,r.d+1,r.e),null) -s=r.b -if(s===4&&B.a.u(r.a,"http"))return 80 -if(s===5&&B.a.u(r.a,"https"))return 443 -return 0}, -gaa(){return B.a.p(this.a,this.e,this.f)}, -gci(){var s=this.f,r=this.r -return s=q.length)return s -return new A.b8(B.a.p(q,0,r),s.b,s.c,s.d,s.e,s.f,r,s.w)}, -hp(a){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=null -a=A.nt(a,0,a.length) -s=!(h.b===a.length&&B.a.u(h.a,a)) -r=a==="file" -q=h.c -p=q>0?B.a.p(h.a,h.b+3,q):"" -o=h.geu()?h.gcf():g -if(s)o=A.ns(o,a) -q=h.c -if(q>0)n=B.a.p(h.a,q,h.d) -else n=p.length!==0||o!=null||r?"":g -q=h.a -m=h.f -l=B.a.p(q,h.e,m) -if(!r)k=n!=null&&l.length!==0 -else k=!0 -if(k&&!B.a.u(l,"/"))l="/"+l -k=h.r -j=m0)return b -s=b.c -if(s>0){r=a.b -if(r<=0)return b -q=r===4 -if(q&&B.a.u(a.a,"file"))p=b.e!==b.f -else if(q&&B.a.u(a.a,"http"))p=!b.fq("80") -else p=!(r===5&&B.a.u(a.a,"https"))||!b.fq("443") -if(p){o=r+1 -return new A.b8(B.a.p(a.a,0,o)+B.a.K(b.a,c+1),r,s+o,b.d+o,b.e+o,b.f+o,b.r+o,a.w)}else return this.fS().cl(b)}n=b.e -c=b.f -if(n===c){s=b.r -if(c0?l:m -o=k-n -return new A.b8(B.a.p(a.a,0,k)+B.a.K(s,n),a.b,a.c,a.d,m,c+o,b.r+o,a.w)}j=a.e -i=a.f -if(j===i&&a.c>0){while(B.a.C(s,"../",n))n+=3 -o=j-n+1 -return new A.b8(B.a.p(a.a,0,j)+"/"+B.a.K(s,n),a.b,a.c,a.d,j,c+o,b.r+o,a.w)}h=a.a -l=A.r_(this) -if(l>=0)g=l -else for(g=j;B.a.C(h,"../",g);)g+=3 -f=0 -for(;;){e=n+3 -if(!(e<=c&&B.a.C(s,"../",n)))break;++f -n=e}for(d="";i>g;){--i -if(h.charCodeAt(i)===47){if(f===0){d="/" -break}--f -d="/"}}if(i===g&&a.b<=0&&!B.a.C(h,"/",j)){n-=f*3 -d=""}o=i-n+d.length -return new A.b8(B.a.p(h,0,i)+d+B.a.K(s,n),a.b,a.c,a.d,j,c+o,b.r+o,a.w)}, -eP(){var s,r=this,q=r.b -if(q>=0){s=!(q===4&&B.a.u(r.a,"file")) -q=s}else q=!1 -if(q)throw A.b(A.a3("Cannot extract a file path from a "+r.gW()+" URI")) -q=r.f -s=r.a -if(q0?s.gba():r,n=s.geu()?s.gcf():r,m=s.a,l=s.f,k=B.a.p(m,s.e,l),j=s.r -l=l4294967296)throw A.b(new A.dk(k,k,!1,k,k,"max must be in range 0 < max \u2264 2^32, was "+a)) -if(a>255)if(a>65535)s=a>16777215?4:3 -else s=2 -else s=1 -r=this.a -r.$flags&2&&A.z(r,11) -r.setUint32(0,0,!1) -q=4-s -p=A.B(Math.pow(256,s)) -for(o=a-1,n=(a&o)===0;;){crypto.getRandomValues(J.d0(B.aJ.gaX(r),q,s)) -m=r.getUint32(0,!1) -if(n)return(m&o)>>>0 -l=m%a -if(m-l+a>>0)&2147483647 -r^=r>>>6}r=r+(r<<3>>>0)&2147483647 -r^=r>>>11 -return r+(r<<15>>>0)&2147483647}} -A.hz.prototype={} -A.hU.prototype={} -A.eh.prototype={ -hV(a,b,c){var s=this.a.a -s===$&&A.x() -s.eD(this.giG(),new A.jV(this))}, -hi(){return this.d++}, -n(){var s=0,r=A.k(t.H),q,p=this,o -var $async$n=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:if(p.r||(p.w.a.a&30)!==0){s=1 -break}p.r=!0 -o=p.a.b -o===$&&A.x() -o.n() -s=3 -return A.c(p.w.a,$async$n) -case 3:case 1:return A.i(q,r)}}) -return A.j($async$n,r)}, -iH(a){var s,r=this -if(r.c){a.toString -a=B.G.ek(a)}if(a instanceof A.bg){s=r.e.F(0,a.a) -if(s!=null)s.a.O(a.b)}else if(a instanceof A.bp){s=r.e.F(0,a.a) -if(s!=null)s.h2(new A.h2(a.b),a.c)}else if(a instanceof A.as)r.f.v(0,a) -else if(a instanceof A.bx){s=r.e.F(0,a.a) -if(s!=null)s.h1(B.v)}}, -bt(a){var s,r,q=this -if(q.r||(q.w.a.a&30)!==0)throw A.b(A.A("Tried to send "+a.i(0)+" over isolate channel, but the connection was closed!")) -s=q.a.b -s===$&&A.x() -r=q.c?B.G.ds(a):a -s.a.v(0,r)}, -l7(a,b,c){var s,r=this -if(r.r||(r.w.a.a&30)!==0)return -s=a.a -if(b instanceof A.eb)r.bt(new A.bx(s)) -else r.bt(new A.bp(s,b,c))}, -hJ(a){var s=this.f -new A.au(s,A.r(s).h("au<1>")).kP(new A.jW(this,a))}} -A.jV.prototype={ -$0(){var s,r,q -for(s=this.a,r=s.e,q=new A.db(r,r.r,r.e);q.k();)q.d.h1(B.ah) -r.c4(0) -s.w.ai()}, -$S:0} -A.jW.prototype={ -$1(a){return this.hz(a)}, -hz(a){var s=0,r=A.k(t.H),q,p=2,o=[],n=this,m,l,k,j,i,h -var $async$$1=A.l(function(b,c){if(b===1){o.push(c) -s=p}for(;;)switch(s){case 0:i=null -p=4 -k=n.b.$1(a) -s=7 -return A.c(t.cG.b(k)?k:A.ch(k,t.O),$async$$1) -case 7:i=c -p=2 -s=6 -break -case 4:p=3 -h=o.pop() -m=A.I(h) -l=A.a8(h) -k=n.a.l7(a,m,l) -q=k -s=1 -break -s=6 -break -case 3:s=2 -break -case 6:k=n.a -if(!(k.r||(k.w.a.a&30)!==0))k.bt(new A.bg(a.a,i)) -case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$$1,r)}, -$S:73} -A.iA.prototype={ -h2(a,b){var s -if(b==null)s=this.b -else{s=A.f([],t.J) -if(b instanceof A.bn)B.c.ag(s,b.a) -else s.push(A.qC(b)) -s.push(A.qC(this.b)) -s=new A.bn(A.aO(s,t.a))}this.a.bx(a,s)}, -h1(a){return this.h2(a,null)}} -A.fU.prototype={ -i(a){return"Channel was closed before receiving a response"}, -$ia9:1} -A.h2.prototype={ -i(a){return J.b3(this.a)}, -$ia9:1} -A.h1.prototype={ -ds(a){var s,r -if(a instanceof A.as)return[0,a.a,this.h6(a.b)] -else if(a instanceof A.bp){s=J.b3(a.b) -r=a.c -r=r==null?null:r.i(0) -return[2,a.a,s,r]}else if(a instanceof A.bg)return[1,a.a,this.h6(a.b)] -else if(a instanceof A.bx)return A.f([3,a.a],t.t) -else return null}, -ek(a){var s,r,q,p -if(!t.j.b(a))throw A.b(B.au) -s=J.a5(a) -r=A.B(s.j(a,0)) -q=A.B(s.j(a,1)) -switch(r){case 0:return new A.as(q,t.ah.a(this.h4(s.j(a,2)))) -case 2:p=A.rm(s.j(a,3)) -s=s.j(a,2) -if(s==null)s=A.pc(s) -return new A.bp(q,s,p!=null?new A.dQ(p):null) -case 1:return new A.bg(q,t.O.a(this.h4(s.j(a,2)))) -case 3:return new A.bx(q)}throw A.b(B.at)}, -h6(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f -if(a==null)return a -if(a instanceof A.dh)return a.a -else if(a instanceof A.bX){s=a.a -r=a.b -q=[] -for(p=a.c,o=p.length,n=0;n")),g=g.h("Q.E");s.k();){a8=s.d -h.push(this.dJ(a8==null?g.a(a8):a8))}m.push(new A.d2(i,h))}f=J.ot(a7.a) -A:{if(f==null){s=a6 -break A}A.B(f) -s=f -break A}return new A.bq(new A.e9(n,m),s) -case 5:return new A.c5(B.Q[q.$1(1)],p.$1(2)) -case 6:return new A.bW(q.$1(1),p.$1(2)) -case 13:s.toString -return new A.c6(A.ow(B.O,A.a4(J.aM(s,1)))) -case 7:return new A.c4(new A.eA(p.$1(1),q.$1(2)),q.$1(3)) -case 8:e=A.f([],t.be) -s=t.j -k=1 -for(;;){l=a7.a -l.toString -if(!(k")).eo(0,new A.kW(r))}, -kj(a,b){var s,r,q -for(s=this.z,s=A.iw(s,s.r,s.$ti.c),r=s.$ti.c;s.k();){q=s.d -if(q==null)q=r.a(q) -if(q!==b)q.bt(new A.as(q.d++,a))}}} -A.kY.prototype={ -$1(a){var s=this.a -s.ib() -s.as.n()}, -$S:75} -A.kZ.prototype={ -$1(a){return this.a.iJ(this.b,a)}, -$S:77} -A.l_.prototype={ -$1(a){return this.a.z.F(0,this.b)}, -$S:24} -A.kU.prototype={ -$0(){var s=this.b -return this.a.aI(s.a,s.b,s.c,s.d)}, -$S:82} -A.kV.prototype={ -$0(){return this.a.r.F(0,this.b.a)}, -$S:84} -A.kX.prototype={ -$0(){var s,r=this.b -if(r==null)return this.a.w.length===0 -else{s=this.a.w -return s.length!==0&&B.c.gE(s)===r}}, -$S:28} -A.kW.prototype={ -$1(a){return this.a.$0()}, -$S:24} -A.fi.prototype={ -cV(a,b){return this.jY(a,b)}, -jY(a,b){var s=0,r=A.k(t.H),q=1,p=[],o=[],n=this,m,l,k,j,i -var $async$cV=A.l(function(c,d){if(c===1){p.push(d) -s=q}for(;;)switch(s){case 0:j=n.a -i=j.e0(a,!0) -q=2 -m=n.b -l=m.hi() -k=new A.m($.n,t.D) -m.e.t(0,l,new A.iA(new A.a6(k,t.h),A.ld())) -m.bt(new A.as(l,new A.c4(b,i))) -s=5 -return A.c(k,$async$cV) -case 5:o.push(4) -s=3 -break -case 2:o=[1] -case 3:q=1 -j.cK(i) -s=o.pop() -break -case 4:return A.i(null,r) -case 1:return A.h(p.at(-1),r)}}) -return A.j($async$cV,r)}} -A.i5.prototype={ -ds(a1){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=this,a0=null -A:{if(a1 instanceof A.as){s=new A.ah(0,{i:a1.a,p:a.jn(a1.b)}) -break A}if(a1 instanceof A.bg){s=new A.ah(1,{i:a1.a,p:a.jo(a1.b)}) -break A}r=a1 instanceof A.bp -q=a0 -p=a0 -o=!1 -n=a0 -m=a0 -s=!1 -if(r){l=a1.a -q=a1.b -o=q instanceof A.c9 -if(o){t.f_.a(q) -p=a1.c -s=a.a.c>=4 -m=p -n=q}k=l}else{k=a0 -l=k}if(s){s=m==null?a0:m.i(0) -j=n.a -i=n.b -if(i==null)i=a0 -h=n.c -g=n.e -if(g==null)g=a0 -f=n.f -if(f==null)f=a0 -e=n.r -B:{if(e==null){d=a0 -break B}d=[] -for(c=e.length,b=0;b") -s=A.am(new A.E(s,new A.m_(),q),q.h("Q.E")) -s=new A.bG(s) -break A}s=A.D(A.K("Unknown request tag "+r,m))}return s}, -jo(a){var s,r -A:{s=null -if(a==null)break A -if(a instanceof A.aQ){r=a.a -s=A.bR(r)?r:A.B(r) -break A}if(a instanceof A.bJ){s=this.jp(a) -break A}}return s}, -jp(a){var s,r,q,p=a.a,o=J.a5(p) -if(o.gB(p)){p=v.G -return{c:new p.Array(),r:new p.Array()}}else{s=J.d1(o.gE(p).gX(),new A.m5(),t.N).cq(0) -r=A.f([],t.fk) -for(p=o.gq(p);p.k();){q=[] -for(o=J.a0(p.gm().gbH());o.k();)q.push(this.cN(o.gm())) -r.push(q)}return{c:s,r:r}}}, -it(a){var s,r,q,p,o,n,m,l,k,j -if(a==null)return null -else if(typeof a==="boolean")return new A.aQ(A.bi(a)) -else if(typeof a==="number")return new A.aQ(A.B(A.a_(a))) -else{A.a7(a) -s=a.c -s=t.q.b(s)?s:new A.ak(s,A.O(s).h("ak<1,p>")) -r=t.N -s=J.d1(s,new A.m3(),r) -q=A.am(s,s.$ti.h("Q.E")) -p=A.f([],t.d) -s=a.r -s=J.a0(t.e9.b(s)?s:new A.ak(s,A.O(s).h("ak<1,u>"))) -o=t.X -while(s.k()){n=s.gm() -m=A.ap(r,o) -n=A.uw(n,0,o) -l=J.a0(n.a) -n=n.b -k=new A.eo(l,n) -while(k.k()){j=k.c -j=j>=0?new A.ah(n+j,l.gm()):A.D(A.ax()) -m.t(0,q[j.a],this.cM(j.b))}p.push(m)}return new A.bJ(p)}}, -cN(a){var s -A:{if(a==null){s=null -break A}if(A.bw(a)){s=a -break A}if(A.bR(a)){s=a -break A}if(typeof a=="string"){s=a -break A}if(typeof a=="number"){s=A.f([15,a],t.n) -break A}if(a instanceof A.aa){s=A.f([14,a.i(0)],t.f) -break A}if(t.I.b(a)){s=new Uint8Array(A.fA(a)) -break A}s=A.D(A.K("Unknown db value: "+A.t(a),null))}return s}, -cM(a){var s,r,q,p=null -if(a!=null)if(typeof a==="number")return A.B(A.a_(a)) -else if(typeof a==="boolean")return A.bi(a) -else if(typeof a==="string")return A.a4(a) -else if(A.oE(a,"Uint8Array"))return t.Z.a(a) -else{t.c.a(a) -s=a.length===2 -if(s){r=a[0] -q=a[1]}else{q=p -r=q}if(!s)throw A.b(A.A("Pattern matching error")) -if(r==14)return A.p1(A.a4(q),p) -else return A.a_(q)}else return p}, -ff(a){var s,r=a!=null?A.a4(a):null -A:{if(r!=null){s=new A.dQ(r) -break A}s=null -break A}return s}, -ip(a){var s,r,q,p,o=null,n=a.length>=8,m=o,l=o,k=o,j=o,i=o,h=o,g=o -if(n){s=a[0] -m=a[1] -l=a[2] -k=a[3] -j=a[4] -i=a[5] -h=a[6] -g=a[7]}else s=o -if(!n)throw A.b(A.A("Pattern matching error")) -s=A.B(A.a_(s)) -j=A.B(A.a_(j)) -A.a4(l) -n=k!=null?A.a4(k):o -r=h!=null?A.a4(h):o -if(g!=null){q=[] -t.c.a(g) -p=B.c.gq(g) -while(p.k())q.push(this.cM(p.gm()))}else q=o -p=i!=null?A.a4(i):o -return new A.bp(s,new A.c9(l,n,j,o,p,r,q),this.ff(m))}} -A.m6.prototype={ -$0(){var s=A.a7(this.a.a) -return new A.as(s.i,this.b.is(s.p))}, -$S:88} -A.m7.prototype={ -$0(){var s=A.a7(this.a.a) -return new A.bg(s.i,this.b.it(s.p))}, -$S:97} -A.m4.prototype={ -$1(a){return a}, -$S:6} -A.m0.prototype={ -$0(){var s,r,q,p,o,n,m=this.b,l=J.a5(m),k=t.c,j=k.a(l.j(m,1)),i=t.q.b(j)?j:new A.ak(j,A.O(j).h("ak<1,p>")) -i=J.d1(i,new A.m1(),t.N) -s=A.am(i,i.$ti.h("Q.E")) -i=l.gl(m) -r=A.f([],t.b) -for(i=l.U(m,2).aj(0,i-3),k=A.ec(i,i.$ti.h("e.E"),k),k=A.hr(k,new A.m2(),A.r(k).h("e.E"),t.ee),i=k.a,q=A.r(k),k=new A.dc(i.gq(i),k.b,q.h("dc<1,2>")),i=this.a.gjF(),q=q.y[1];k.k();){p=k.a -if(p==null)p=q.a(p) -o=J.a5(p) -n=A.B(A.a_(o.j(p,0))) -p=o.U(p,1) -o=p.$ti.h("E") -p=A.am(new A.E(p,i,o),o.h("Q.E")) -r.push(new A.d2(n,p))}m=l.j(m,l.gl(m)-1) -m=m==null?null:A.B(A.a_(m)) -return new A.bq(new A.e9(s,r),m)}, -$S:99} -A.m1.prototype={ -$1(a){return a}, -$S:6} -A.m2.prototype={ -$1(a){return a}, -$S:100} -A.m_.prototype={ -$1(a){var s,r,q -t.c.a(a) -s=a.length===2 -if(s){r=a[0] -q=a[1]}else{r=null -q=null}if(!s)throw A.b(A.A("Pattern matching error")) -A.a4(r) -return new A.bL(q==null?null:B.N[A.B(A.a_(q))],r)}, -$S:119} -A.m5.prototype={ -$1(a){return a}, -$S:6} -A.m3.prototype={ -$1(a){return a}, -$S:6} -A.dv.prototype={ -ae(){return"UpdateKind."+this.b}} -A.bL.prototype={ -gA(a){return A.ez(this.a,this.b,B.f,B.f)}, -T(a,b){if(b==null)return!1 -return b instanceof A.bL&&b.a==this.a&&b.b===this.b}, -i(a){return"TableUpdate("+this.b+", kind: "+A.t(this.a)+")"}} -A.oj.prototype={ -$0(){return this.a.a.a.O(A.oA(this.b,this.c))}, -$S:0} -A.bV.prototype={ -I(){var s,r -if(this.c)return -for(s=this.b,r=0;!1;++r)s[r].$0() -this.c=!0}} -A.eb.prototype={ -i(a){return"Operation was cancelled"}, -$ia9:1} -A.ar.prototype={ -n(){var s=0,r=A.k(t.H) -var $async$n=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:return A.i(null,r)}}) -return A.j($async$n,r)}} -A.e9.prototype={ -gA(a){return A.ez(B.m.hd(this.a),B.m.hd(this.b),B.f,B.f)}, -T(a,b){if(b==null)return!1 -return b instanceof A.e9&&B.m.em(b.a,this.a)&&B.m.em(b.b,this.b)}, -i(a){return"BatchedStatements("+A.t(this.a)+", "+A.t(this.b)+")"}} -A.d2.prototype={ -gA(a){return A.ez(this.a,B.m,B.f,B.f)}, -T(a,b){if(b==null)return!1 -return b instanceof A.d2&&b.a===this.a&&B.m.em(b.b,this.b)}, -i(a){return"ArgumentsForBatchedStatement("+this.a+", "+A.t(this.b)+")"}} -A.jM.prototype={} -A.kL.prototype={} -A.lx.prototype={} -A.kG.prototype={} -A.jP.prototype={} -A.hy.prototype={} -A.k3.prototype={} -A.ib.prototype={ -geB(){return!1}, -gca(){return!1}, -fO(a,b,c){if(this.geB()||this.b>0)return this.a.cC(new A.mf(b,a,c),c) -else return a.$0()}, -bu(a,b){return this.fO(a,!0,b)}, -cH(a,b){this.gca()}, -ab(a,b){return this.lh(a,b)}, -lh(a,b){var s=0,r=A.k(t.aS),q,p=this,o -var $async$ab=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:s=3 -return A.c(p.bu(new A.mk(p,a,b),t.aj),$async$ab) -case 3:o=d.gjX(0) -o=A.am(o,o.$ti.h("Q.E")) -q=o -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$ab,r)}, -cm(a,b){return this.bu(new A.mi(this,a,b),t.S)}, -aD(a,b){return this.bu(new A.mj(this,a,b),t.S)}, -a6(a,b){return this.bu(new A.mh(this,b,a),t.H)}, -ld(a){return this.a6(a,null)}, -aC(a){return this.bu(new A.mg(this,a),t.H)}, -cW(){return new A.f3(this,new A.a6(new A.m($.n,t.D),t.h),new A.br())}, -cX(){return this.aW(this)}} -A.mf.prototype={ -$0(){return this.hD(this.c)}, -hD(a){var s=0,r=A.k(a),q,p=this -var $async$$0=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:if(p.a)A.pk() -s=3 -return A.c(p.b.$0(),$async$$0) -case 3:q=c -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$$0,r)}, -$S(){return this.c.h("C<0>()")}} -A.mk.prototype={ -$0(){var s=this.a,r=this.b,q=this.c -s.cH(r,q) -return s.gaL().ab(r,q)}, -$S:120} -A.mi.prototype={ -$0(){var s=this.a,r=this.b,q=this.c -s.cH(r,q) -return s.gaL().df(r,q)}, -$S:25} -A.mj.prototype={ -$0(){var s=this.a,r=this.b,q=this.c -s.cH(r,q) -return s.gaL().aD(r,q)}, -$S:25} -A.mh.prototype={ -$0(){var s,r,q=this.b -if(q==null)q=B.o -s=this.a -r=this.c -s.cH(r,q) -return s.gaL().a6(r,q)}, -$S:12} -A.mg.prototype={ -$0(){var s=this.a -s.gca() -return s.gaL().aC(this.b)}, -$S:12} -A.iO.prototype={ -ia(){this.c=!0 -if(this.d)throw A.b(A.A("A transaction was used after being closed. Please check that you're awaiting all database operations inside a `transaction` block."))}, -aW(a){throw A.b(A.a3("Nested transactions aren't supported."))}, -gar(){return B.l}, -gca(){return!1}, -geB(){return!0}, -$ihQ:1} -A.fm.prototype={ -au(a){var s,r,q=this -q.ia() -s=q.z -if(s==null){s=q.z=new A.a6(new A.m($.n,t.k),t.co) -r=q.as;++r.b -r.fO(new A.nd(q),!1,t.P).ak(new A.ne(r))}return s.a}, -gaL(){return this.e.e}, -aW(a){var s=this.at+1 -return new A.fm(this.y,new A.a6(new A.m($.n,t.D),t.h),a,s,A.rr(s),A.rp(s),A.rq(s),this.e,new A.br())}, -bh(){var s=0,r=A.k(t.H),q,p=this -var $async$bh=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:if(!p.c){s=1 -break}s=3 -return A.c(p.a6(p.ay,B.o),$async$bh) -case 3:p.e3() -case 1:return A.i(q,r)}}) -return A.j($async$bh,r)}, -bE(){var s=0,r=A.k(t.H),q,p=2,o=[],n=[],m=this -var $async$bE=A.l(function(a,b){if(a===1){o.push(b) -s=p}for(;;)switch(s){case 0:if(!m.c){s=1 -break}p=3 -s=6 -return A.c(m.a6(m.ch,B.o),$async$bE) -case 6:n.push(5) -s=4 -break -case 3:n=[2] -case 4:p=2 -m.e3() -s=n.pop() -break -case 5:case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$bE,r)}, -e3(){var s=this -if(s.at===0)s.e.e.a=!1 -s.Q.ai() -s.d=!0}} -A.nd.prototype={ -$0(){var s=0,r=A.k(t.P),q=1,p=[],o=this,n,m,l,k,j -var $async$$0=A.l(function(a,b){if(a===1){p.push(b) -s=q}for(;;)switch(s){case 0:q=3 -A.pk() -l=o.a -s=6 -return A.c(l.ld(l.ax),$async$$0) -case 6:l.e.e.a=!0 -l.z.O(!0) -q=1 -s=5 -break -case 3:q=2 -j=p.pop() -n=A.I(j) -m=A.a8(j) -l=o.a -l.z.bx(n,m) -l.e3() -s=5 -break -case 2:s=1 -break -case 5:s=7 -return A.c(o.a.Q.a,$async$$0) -case 7:return A.i(null,r) -case 1:return A.h(p.at(-1),r)}}) -return A.j($async$$0,r)}, -$S:16} -A.ne.prototype={ -$0(){return this.a.b--}, -$S:43} -A.h_.prototype={ -gaL(){return this.e}, -gar(){return B.l}, -au(a){return this.x.cC(new A.jU(this,a),t.y)}, -bq(a){return this.ji(a)}, -ji(a){var s=0,r=A.k(t.H),q=this,p,o,n,m -var $async$bq=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:n=q.e -m=n.y -m===$&&A.x() -p=a.c -s=m instanceof A.hy?2:4 -break -case 2:o=p -s=3 -break -case 4:s=m instanceof A.fk?5:7 -break -case 5:s=8 -return A.c(A.b5(m.a.gln(),t.S),$async$bq) -case 8:o=c -s=6 -break -case 7:throw A.b(A.k5("Invalid delegate: "+n.i(0)+". The versionDelegate getter must not subclass DBVersionDelegate directly")) -case 6:case 3:if(o===0)o=null -s=9 -return A.c(a.cV(new A.ic(q,new A.br()),new A.eA(o,p)),$async$bq) -case 9:s=m instanceof A.fk&&o!==p?10:11 -break -case 10:m.a.h8("PRAGMA user_version = "+p+";") -s=12 -return A.c(A.b5(null,t.H),$async$bq) -case 12:case 11:return A.i(null,r)}}) -return A.j($async$bq,r)}, -aW(a){var s=$.n -return new A.fm(B.ap,new A.a6(new A.m(s,t.D),t.h),a,0,"BEGIN IMMEDIATE","COMMIT TRANSACTION","ROLLBACK TRANSACTION",this,new A.br())}, -n(){return this.x.cC(new A.jT(this),t.H)}, -gca(){return this.r}, -geB(){return this.w}} -A.jU.prototype={ -$0(){var s=0,r=A.k(t.y),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f,e -var $async$$0=A.l(function(a,b){if(a===1){o.push(b) -s=p}for(;;)switch(s){case 0:f=n.a -if(f.d){f=A.nR(new A.aI("Can't re-open a database after closing it. Please create a new database connection and open that instead."),null) -k=new A.m($.n,t.k) -k.aR(f) -q=k -s=1 -break}j=f.f -if(j!=null)A.pY(j.a,j.b) -k=f.e -i=t.y -h=A.b5(k.d,i) -s=3 -return A.c(t.bF.b(h)?h:A.ch(h,i),$async$$0) -case 3:if(b){q=f.c=!0 -s=1 -break}i=n.b -s=4 -return A.c(k.bA(i),$async$$0) -case 4:f.c=!0 -p=6 -s=9 -return A.c(f.bq(i),$async$$0) -case 9:q=!0 -s=1 -break -p=2 -s=8 -break -case 6:p=5 -e=o.pop() -m=A.I(e) -l=A.a8(e) -f.f=new A.ah(m,l) -throw e -s=8 -break -case 5:s=2 -break -case 8:case 1:return A.i(q,r) -case 2:return A.h(o.at(-1),r)}}) -return A.j($async$$0,r)}, -$S:44} -A.jT.prototype={ -$0(){var s=this.a -if(s.c&&!s.d){s.d=!0 -s.c=!1 -return s.e.n()}else return A.b5(null,t.H)}, -$S:12} -A.ic.prototype={ -aW(a){return this.e.aW(a)}, -au(a){this.c=!0 -return A.b5(!0,t.y)}, -gaL(){return this.e.e}, -gca(){return!1}, -gar(){return B.l}} -A.f3.prototype={ -gar(){return this.e.gar()}, -au(a){var s,r,q,p=this,o=p.f -if(o!=null)return o.a -else{p.c=!0 -s=new A.m($.n,t.k) -r=new A.a6(s,t.co) -p.f=r -q=p.e;++q.b -q.bu(new A.mC(p,r),t.P) -return s}}, -gaL(){return this.e.gaL()}, -aW(a){return this.e.aW(a)}, -n(){this.r.ai() -return A.b5(null,t.H)}} -A.mC.prototype={ -$0(){var s=0,r=A.k(t.P),q=this,p -var $async$$0=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:q.b.O(!0) -p=q.a -s=2 -return A.c(p.r.a,$async$$0) -case 2:--p.e.b -return A.i(null,r)}}) -return A.j($async$$0,r)}, -$S:16} -A.dj.prototype={ -gjX(a){var s=this.b -return new A.E(s,new A.kN(this),A.O(s).h("E<1,aq>"))}} -A.kN.prototype={ -$1(a){var s,r,q,p,o,n,m,l=A.ap(t.N,t.z) -for(s=this.a,r=s.a,q=r.length,s=s.c,p=J.a5(a),o=0;o")).gE(0)).n() -q.t(0,a,s)}return new A.ah(s,o.sqlite3_stmt_isexplain(r)===0)}} -A.fk.prototype={} -A.kK.prototype={ -kA(){var s,r,q,p -for(s=this.b,r=new A.db(s,s.r,s.e);r.k();){q=r.d -if(!q.r){q.r=!0 -if(!q.f){p=q.a -p.c.d.sqlite3_reset(p.b) -q.f=!0}q=q.a -p=q.c -p.d.sqlite3_finalize(q.b) -p=p.w -if(p!=null){p=p.a -if(p!=null)p.unregister(q.d)}}}s.c4(0)}} -A.k4.prototype={ -$1(a){return Date.now()}, -$S:46} -A.nW.prototype={ -$1(a){var s=a.j(0,0) -if(typeof s=="number")return this.a.$1(s) -else return null}, -$S:26} -A.hm.prototype={ -gir(){var s=this.a -s===$&&A.x() -return s}, -gar(){if(this.b){var s=this.a -s===$&&A.x() -s=B.l!==s.gar()}else s=!1 -if(s)throw A.b(A.k5("LazyDatabase created with "+B.l.i(0)+", but underlying database is "+this.gir().gar().i(0)+".")) -return B.l}, -i5(){var s,r,q=this -if(q.b)return A.b5(null,t.H) -else{s=q.d -if(s!=null)return s.a -else{s=new A.m($.n,t.D) -r=q.d=new A.a6(s,t.h) -A.oA(q.e,t.x).b0(new A.ky(q,r),r.gk6(),t.P) -return s}}}, -cW(){var s=this.a -s===$&&A.x() -return s.cW()}, -cX(){var s=this.a -s===$&&A.x() -return s.cX()}, -au(a){return this.i5().bG(new A.kz(this,a),t.y)}, -aC(a){var s=this.a -s===$&&A.x() -return s.aC(a)}, -a6(a,b){var s=this.a -s===$&&A.x() -return s.a6(a,b)}, -cm(a,b){var s=this.a -s===$&&A.x() -return s.cm(a,b)}, -aD(a,b){var s=this.a -s===$&&A.x() -return s.aD(a,b)}, -ab(a,b){var s=this.a -s===$&&A.x() -return s.ab(a,b)}, -n(){var s=0,r=A.k(t.H),q,p=this,o,n -var $async$n=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:s=p.b?3:5 -break -case 3:o=p.a -o===$&&A.x() -s=6 -return A.c(o.n(),$async$n) -case 6:q=b -s=1 -break -s=4 -break -case 5:n=p.d -s=n!=null?7:8 -break -case 7:s=9 -return A.c(n.a,$async$n) -case 9:o=p.a -o===$&&A.x() -s=10 -return A.c(o.n(),$async$n) -case 10:case 8:case 4:case 1:return A.i(q,r)}}) -return A.j($async$n,r)}} -A.ky.prototype={ -$1(a){var s=this.a -s.a!==$&&A.j_() -s.a=a -s.b=!0 -this.b.ai()}, -$S:48} -A.kz.prototype={ -$1(a){var s=this.a.a -s===$&&A.x() -return s.au(this.b)}, -$S:49} -A.br.prototype={ -cC(a,b){var s,r=this.a,q=new A.m($.n,t.D) -this.a=q -s=new A.kB(this,a,new A.a6(q,t.h),q,b) -if(r!=null)return r.bG(new A.kD(s,b),b) -else return s.$0()}} -A.kB.prototype={ -$0(){var s=this -return A.oA(s.b,s.e).ak(new A.kC(s.a,s.c,s.d))}, -$S(){return this.e.h("C<0>()")}} -A.kC.prototype={ -$0(){this.b.ai() -var s=this.a -if(s.a===this.c)s.a=null}, -$S:3} -A.kD.prototype={ -$1(a){return this.a.$0()}, -$S(){return this.b.h("C<0>(~)")}} -A.lX.prototype={ -$1(a){var s,r=this,q=a.data -if(r.a&&J.aj(q,"_disconnect")){s=r.b.a -s===$&&A.x() -s=s.a -s===$&&A.x() -s.n()}else{s=r.b.a -if(r.c){s===$&&A.x() -s=s.a -s===$&&A.x() -s.v(0,r.d.ek(t.c.a(q)))}else{s===$&&A.x() -s=s.a -s===$&&A.x() -s.v(0,A.rO(q))}}}, -$S:11} -A.lY.prototype={ -$1(a){var s=this.c -if(this.a)s.postMessage(this.b.ds(t.fJ.a(a))) -else s.postMessage(A.xJ(a))}, -$S:8} -A.lZ.prototype={ -$0(){if(this.a)this.b.postMessage("_disconnect") -this.b.close()}, -$S:0} -A.jQ.prototype={ -R(){A.aL(this.a,"message",new A.jS(this),!1)}, -am(a){return this.iI(a)}, -iI(a6){var s=0,r=A.k(t.H),q=1,p=[],o=this,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5 -var $async$am=A.l(function(a7,a8){if(a7===1){p.push(a8) -s=q}for(;;)switch(s){case 0:k=a6 instanceof A.dl -j=k?a6.a:null -s=k?3:4 -break -case 3:i={} -i.a=i.b=!1 -s=5 -return A.c(o.b.cC(new A.jR(i,o),t.P),$async$am) -case 5:h=o.c.a.j(0,j) -g=A.f([],t.L) -f=!1 -s=i.b?6:7 -break -case 6:a5=J -s=8 -return A.c(A.e5(),$async$am) -case 8:k=a5.a0(a8) -case 9:if(!k.k()){s=10 -break}e=k.gm() -g.push(new A.ah(B.D,e)) -if(e===j)f=!0 -s=9 -break -case 10:case 7:s=h!=null?11:13 -break -case 11:k=h.a -d=k===B.r||k===B.C -f=k===B.Y||k===B.Z -s=12 -break -case 13:a5=i.a -if(a5){s=14 -break}else a8=a5 -s=15 -break -case 14:s=16 -return A.c(A.e3(j),$async$am) -case 16:case 15:d=a8 -case 12:k=v.G -c="Worker" in k -e=i.b -b=i.a -new A.eg(c,e,"SharedArrayBuffer" in k,b,g,B.q,d,f).dq(o.a) -s=2 -break -case 4:if(a6 instanceof A.dn){o.c.eW(a6) -s=2 -break}k=a6 instanceof A.eJ -a=k?a6.a:null -s=k?17:18 -break -case 17:s=19 -return A.c(A.i1(a),$async$am) -case 19:a0=a8 -o.a.postMessage(!0) -s=20 -return A.c(a0.R(),$async$am) -case 20:s=2 -break -case 18:n=null -m=null -a1=a6 instanceof A.h0 -if(a1){a2=a6.a -n=a2.a -m=a2.b}s=a1?21:22 -break -case 21:q=24 -case 27:switch(n){case B.a_:s=29 -break -case B.D:s=30 -break -default:s=28 -break}break -case 29:s=31 -return A.c(A.o2(m),$async$am) -case 31:s=28 -break -case 30:s=32 -return A.c(A.fE(m),$async$am) -case 32:s=28 -break -case 28:a6.dq(o.a) -q=1 -s=26 -break -case 24:q=23 -a4=p.pop() -l=A.I(a4) -new A.dz(J.b3(l)).dq(o.a) -s=26 -break -case 23:s=1 -break -case 26:s=2 -break -case 22:s=2 -break -case 2:return A.i(null,r) -case 1:return A.h(p.at(-1),r)}}) -return A.j($async$am,r)}} -A.jS.prototype={ -$1(a){this.a.am(A.oU(A.a7(a.data)))}, -$S:1} -A.jR.prototype={ -$0(){var s=0,r=A.k(t.P),q=this,p,o,n,m,l -var $async$$0=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:o=q.b -n=o.d -m=q.a -s=n!=null?2:4 -break -case 2:m.b=n.b -m.a=n.a -s=3 -break -case 4:l=m -s=5 -return A.c(A.cl(),$async$$0) -case 5:l.b=b -s=6 -return A.c(A.iX(),$async$$0) -case 6:p=b -m.a=p -o.d=new A.lK(p,m.b) -case 3:return A.i(null,r)}}) -return A.j($async$$0,r)}, -$S:16} -A.cC.prototype={ -ae(){return"ProtocolVersion."+this.b}} -A.lM.prototype={ -dr(a){this.aF(new A.lP(a))}, -eV(a){this.aF(new A.lO(a))}, -dq(a){this.aF(new A.lN(a))}} -A.lP.prototype={ -$2(a,b){var s=b==null?B.x:b -this.a.postMessage(a,s)}, -$S:19} -A.lO.prototype={ -$2(a,b){var s=b==null?B.x:b -this.a.postMessage(a,s)}, -$S:19} -A.lN.prototype={ -$2(a,b){var s=b==null?B.x:b -this.a.postMessage(a,s)}, -$S:19} -A.jl.prototype={} -A.c7.prototype={ -aF(a){var s=this -A.dW(a,"SharedWorkerCompatibilityResult",A.f([s.e,s.f,s.r,s.c,s.d,A.pW(s.a),s.b.c],t.f),null)}} -A.l6.prototype={ -$1(a){return A.bi(J.aM(this.a,a))}, -$S:53} -A.dz.prototype={ -aF(a){A.dW(a,"Error",this.a,null)}, -i(a){return"Error in worker: "+this.a}, -$ia9:1} -A.dn.prototype={ -aF(a){var s,r,q=this,p={} -p.sqlite=q.a.i(0) -s=q.b -p.port=s -p.storage=q.c.b -p.database=q.d -r=q.e -p.initPort=r -p.migrations=q.r -p.new_serialization=q.w -p.v=q.f.c -s=A.f([s],t.W) -if(r!=null)s.push(r) -A.dW(a,"ServeDriftDatabase",p,s)}} -A.dl.prototype={ -aF(a){A.dW(a,"RequestCompatibilityCheck",this.a,null)}} -A.eg.prototype={ -aF(a){var s=this,r={} -r.supportsNestedWorkers=s.e -r.canAccessOpfs=s.f -r.supportsIndexedDb=s.w -r.supportsSharedArrayBuffers=s.r -r.indexedDbExists=s.c -r.opfsExists=s.d -r.existing=A.pW(s.a) -r.v=s.b.c -A.dW(a,"DedicatedWorkerCompatibilityResult",r,null)}} -A.eJ.prototype={ -aF(a){A.dW(a,"StartFileSystemServer",this.a,null)}} -A.h0.prototype={ -aF(a){var s=this.a -A.dW(a,"DeleteDatabase",A.f([s.a.b,s.b],t.s),null)}} -A.o_.prototype={ -$2(a,b){return null}, -$S:29} -A.nZ.prototype={ -$1(a){this.b.transaction.abort() -this.a.a=!1}, -$S:11} -A.of.prototype={ -$1(a){return A.a7(a[1])}, -$S:55} -A.h3.prototype={ -eW(a){var s=a.f.c,r=a.w -this.a.hl(a.d,new A.k2(this,a)).hH(A.ve(a.b,s>=1,s,r),!r)}, -aN(a,b,c,d,e){return this.l_(a,b,c,d,e)}, -l_(a,b,c,d,e){var s=0,r=A.k(t.x),q,p=this,o,n,m,l,k,j,i,h,g -var $async$aN=A.l(function(f,a0){if(f===1)return A.h(a0,r) -for(;;)switch(s){case 0:s=3 -return A.c(A.lT(d.i(0),null,null),$async$aN) -case 3:i=a0 -h=null -g=null -case 4:switch(e.a){case 0:s=6 -break -case 1:s=7 -break -case 3:s=8 -break -case 2:s=9 -break -case 4:s=10 -break -default:s=11 -break}break -case 6:s=12 -return A.c(A.l8("drift_db/"+a),$async$aN) -case 12:o=a0 -g=o.gc5() -s=5 -break -case 7:s=13 -return A.c(p.cG(a),$async$aN) -case 13:o=a0 -g=o.gc5() -s=5 -break -case 8:case 9:s=14 -return A.c(A.hd(a,!1),$async$aN) -case 14:o=a0 -g=o.gc5() -h=o -s=5 -break -case 10:o=A.oC(null) -s=5 -break -case 11:o=null -case 5:s=c!=null&&o.cr("/database",0)===0?15:16 -break -case 15:n=c.$0() -s=17 -return A.c(t.eY.b(n)?n:A.ch(n,t.aD),$async$aN) -case 17:m=a0 -if(m!=null){l=o.b1(new A.eH("/database"),4).a -l.bg(m,0) -l.cs()}n=h==null?null:h.aU(!1) -s=18 -return A.c(n instanceof A.m?n:A.ch(n,t.H),$async$aN) -case 18:case 16:i.he() -n=i.a -n=n.a -k=n.d.dart_sqlite3_register_vfs(n.c2(B.i.a4(o.a),1),o,1) -if(k===0)A.D(A.A("could not register vfs")) -n=$.tn() -n.a.set(o,k) -n=A.uD(t.N,t.eT) -j=new A.i2(new A.iR(i,"/database",h,p.b,!0,b,new A.kK(n)),!1,!0,new A.br(),new A.br()) -if(g!=null){q=A.u3(j,new A.ms(g,j)) -s=1 -break}else{q=j -s=1 -break}case 1:return A.i(q,r)}}) -return A.j($async$aN,r)}, -cG(a){return this.iN(a)}, -iN(a){var s=0,r=A.k(t.aT),q,p,o,n,m,l -var $async$cG=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:n=v.G -m=new n.SharedArrayBuffer(8) -l=A.hi(n.Int32Array,m,null,null,t.ha) -n.Atomics.store(l,0,-1) -l={clientVersion:2,root:"drift_db/"+a,synchronizationBuffer:m,communicationBuffer:new n.SharedArrayBuffer(67584)} -p=new n.Worker(A.hY().i(0)) -new A.eJ(l).dr(p) -s=3 -return A.c(new A.f2(p,"message",!1,t.fF).gE(0),$async$cG) -case 3:n=A.qt(l.synchronizationBuffer) -l=A.qb(l.communicationBuffer) -o=$.fF() -q=new A.dy(n,l,o,"dart-sqlite3-vfs") -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$cG,r)}} -A.k2.prototype={ -$0(){var s=this.b,r=s.e,q=r!=null?new A.k_(r):null,p=this.a,o=A.uW(new A.hm(new A.k0(p,s,q)),!1,!0),n=new A.m($.n,t.D),m=new A.dm(s.c,o,new A.Z(n,t.F)) -n.ak(new A.k1(p,s,m)) -return m}, -$S:56} -A.k_.prototype={ -$0(){var s=new A.m($.n,t.fX),r=this.a -r.postMessage(!0) -r.onmessage=A.bj(new A.jZ(new A.a6(s,t.fu))) -return s}, -$S:57} -A.jZ.prototype={ -$1(a){var s=t.dE.a(a.data),r=s==null?null:s -this.a.O(r)}, -$S:11} -A.k0.prototype={ -$0(){var s=this.b -return this.a.aN(s.d,s.r,this.c,s.a,s.c)}, -$S:58} -A.k1.prototype={ -$0(){this.a.a.F(0,this.b.d) -this.c.b.hK()}, -$S:3} -A.ms.prototype={ -c6(a){return this.k0(a)}, -k0(a){var s=0,r=A.k(t.H),q=this,p -var $async$c6=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:s=2 -return A.c(a.n(),$async$c6) -case 2:s=q.b===a?3:4 -break -case 3:p=q.a.$0() -s=5 -return A.c(p instanceof A.m?p:A.ch(p,t.H),$async$c6) -case 5:case 4:return A.i(null,r)}}) -return A.j($async$c6,r)}} -A.dm.prototype={ -hH(a,b){var s,r,q;++this.c -s=t.X -s=A.vC(new A.kR(this),s,s).gjZ().$1(a.ghP()) -r=a.$ti -q=new A.ed(r.h("ed<1>")) -q.b=new A.eW(q,a.ghL()) -q.a=new A.eX(s,q,r.h("eX<1>")) -this.b.hI(q,b)}} -A.kR.prototype={ -$1(a){var s=this.a -if(--s.c===0)s.d.ai() -a.a.bm()}, -$S:59} -A.lK.prototype={} -A.jp.prototype={ -$1(a){this.a.O(this.c.a(this.b.result))}, -$S:1} -A.jq.prototype={ -$1(a){var s=this.b.error -if(s==null)s=a -this.a.a3(s)}, -$S:1} -A.jr.prototype={ -$1(a){var s=this.b.error -if(s==null)s=a -this.a.a3(s)}, -$S:1} -A.j4.prototype={ -$0(){this.a.ai() -return A.uu(this.b.a)}, -$S:30} -A.j5.prototype={ -$2(a,b){var s -A.a7(a) -s=this.a -if(J.aj(a.name,"AbortError"))s.a3(B.v) -else s.a3(a) -return null}, -$S:29} -A.l0.prototype={ -R(){A.aL(this.a,"connect",new A.l5(this),!1)}, -dY(a){return this.iR(a)}, -iR(a){var s=0,r=A.k(t.H),q=this,p,o -var $async$dY=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:p=a.ports -o=J.aM(t.cl.b(p)?p:new A.ak(p,A.O(p).h("ak<1,y>")),0) -o.start() -A.aL(o,"message",new A.l1(q,o),!1) -return A.i(null,r)}}) -return A.j($async$dY,r)}, -cI(a,b){return this.iO(a,b)}, -iO(a,b){var s=0,r=A.k(t.H),q=1,p=[],o=this,n,m,l,k,j,i,h,g -var $async$cI=A.l(function(c,d){if(c===1){p.push(d) -s=q}for(;;)switch(s){case 0:q=3 -n=A.oU(A.a7(b.data)) -m=n -l=null -i=m instanceof A.dl -if(i)l=m.a -s=i?7:8 -break -case 7:s=9 -return A.c(o.bY(l),$async$cI) -case 9:k=d -k.eV(a) -s=6 -break -case 8:if(m instanceof A.dn&&B.r===m.c){o.c.eW(n) -s=6 -break}if(m instanceof A.dn){i=o.b -i.toString -n.dr(i) -s=6 -break}i=A.K("Unknown message",null) -throw A.b(i) -case 6:q=1 -s=5 -break -case 3:q=2 -g=p.pop() -j=A.I(g) -new A.dz(J.b3(j)).eV(a) -a.close() -s=5 -break -case 2:s=1 -break -case 5:return A.i(null,r) -case 1:return A.h(p.at(-1),r)}}) -return A.j($async$cI,r)}, -bY(a){return this.jx(a)}, -jx(a){var s=0,r=A.k(t.fL),q,p=this,o,n,m,l,k,j,i,h,g,f,e,d,c -var $async$bY=A.l(function(b,a0){if(b===1)return A.h(a0,r) -for(;;)switch(s){case 0:k=v.G -j="Worker" in k -s=3 -return A.c(A.iX(),$async$bY) -case 3:i=a0 -s=!j?4:6 -break -case 4:k=p.c.a.j(0,a) -if(k==null)o=null -else{k=k.a -k=k===B.r||k===B.C -o=k}h=A -g=!1 -f=!1 -e=i -d=B.z -c=B.q -s=o==null?7:9 -break -case 7:s=10 -return A.c(A.e3(a),$async$bY) -case 10:s=8 -break -case 9:a0=o -case 8:q=new h.c7(g,f,e,d,c,a0,!1) -s=1 -break -s=5 -break -case 6:n={} -m=p.b -if(m==null)m=p.b=new k.Worker(A.hY().i(0)) -new A.dl(a).dr(m) -k=new A.m($.n,t.a9) -n.a=n.b=null -l=new A.l4(n,new A.a6(k,t.bi),i) -n.b=A.aL(m,"message",new A.l2(l),!1) -n.a=A.aL(m,"error",new A.l3(p,l,m),!1) -q=k -s=1 -break -case 5:case 1:return A.i(q,r)}}) -return A.j($async$bY,r)}} -A.l5.prototype={ -$1(a){return this.a.dY(a)}, -$S:1} -A.l1.prototype={ -$1(a){return this.a.cI(this.b,a)}, -$S:1} -A.l4.prototype={ -$4(a,b,c,d){var s,r=this.b -if((r.a.a&30)===0){r.O(new A.c7(!0,a,this.c,d,B.q,c,b)) -r=this.a -s=r.b -if(s!=null)s.I() -r=r.a -if(r!=null)r.I()}}, -$S:61} -A.l2.prototype={ -$1(a){var s=t.ed.a(A.oU(A.a7(a.data))) -this.a.$4(s.f,s.d,s.c,s.a)}, -$S:1} -A.l3.prototype={ -$1(a){this.b.$4(!1,!1,!1,B.z) -this.c.terminate() -this.a.b=null}, -$S:1} -A.cd.prototype={ -ae(){return"WasmStorageImplementation."+this.b}} -A.bP.prototype={ -ae(){return"WebStorageApi."+this.b}} -A.i2.prototype={} -A.iR.prototype={ -l0(){var s=this.Q.bA(this.as) -return s}, -bo(){var s=0,r=A.k(t.H),q=this,p -var $async$bo=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:p=q.at -p=p==null?null:p.aU(!1) -s=2 -return A.c(p instanceof A.m?p:A.ch(p,t.H),$async$bo) -case 2:return A.i(null,r)}}) -return A.j($async$bo,r)}, -bs(a,b){return this.jl(a,b)}, -jl(a,b){var s=0,r=A.k(t.z),q=this -var $async$bs=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:q.lj(a,b) -s=!q.a?2:3 -break -case 2:s=4 -return A.c(q.bo(),$async$bs) -case 4:case 3:return A.i(null,r)}}) -return A.j($async$bs,r)}, -a6(a,b){return this.le(a,b)}, -le(a,b){var s=0,r=A.k(t.H),q=this -var $async$a6=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:s=2 -return A.c(q.bs(a,b),$async$a6) -case 2:return A.i(null,r)}}) -return A.j($async$a6,r)}, -aD(a,b){return this.lf(a,b)}, -lf(a,b){var s=0,r=A.k(t.S),q,p=this,o -var $async$aD=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:s=3 -return A.c(p.bs(a,b),$async$aD) -case 3:o=p.b.b -q=A.B(v.G.Number(o.a.d.sqlite3_last_insert_rowid(o.b))) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$aD,r)}, -df(a,b){return this.li(a,b)}, -li(a,b){var s=0,r=A.k(t.S),q,p=this,o -var $async$df=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:s=3 -return A.c(p.bs(a,b),$async$df) -case 3:o=p.b.b -q=o.a.d.sqlite3_changes(o.b) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$df,r)}, -aC(a){return this.lc(a)}, -lc(a){var s=0,r=A.k(t.H),q=this -var $async$aC=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:q.lb(a) -s=!q.a?2:3 -break -case 2:s=4 -return A.c(q.bo(),$async$aC) -case 4:case 3:return A.i(null,r)}}) -return A.j($async$aC,r)}, -n(){var s=0,r=A.k(t.H),q=this -var $async$n=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:s=2 -return A.c(q.hS(),$async$n) -case 2:q.b.n() -s=3 -return A.c(q.bo(),$async$n) -case 3:return A.i(null,r)}}) -return A.j($async$n,r)}} -A.fV.prototype={ -fW(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var s -A.rI("absolute",A.f([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o],t.d4)) -s=this.a -s=s.Y(a)>0&&!s.aZ(a) -if(s)return a -s=this.b -return this.hf(0,s==null?A.pn():s,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)}, -jS(a){var s=null -return this.fW(a,s,s,s,s,s,s,s,s,s,s,s,s,s,s)}, -hf(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var s=A.f([b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q],t.d4) -A.rI("join",s) -return this.kO(new A.eP(s,t.eJ))}, -kN(a,b,c){var s=null -return this.hf(0,b,c,s,s,s,s,s,s,s,s,s,s,s,s,s,s)}, -kO(a){var s,r,q,p,o,n,m,l,k -for(s=a.gq(0),r=new A.cI(s,new A.jv()),q=this.a,p=!1,o=!1,n="";r.k();){m=s.gm() -if(q.aZ(m)&&o){l=A.di(m,q) -k=n.charCodeAt(0)==0?n:n -n=B.a.p(k,0,q.bF(k,!0)) -l.b=n -if(q.cc(n))l.e[0]=q.gbi() -n=l.i(0)}else if(q.Y(m)>0){o=!q.aZ(m) -n=m}else{if(!(m.length!==0&&q.ei(m[0])))if(p)n+=q.gbi() -n+=m}p=q.cc(m)}return n.charCodeAt(0)==0?n:n}, -bk(a,b){var s=A.di(b,this.a),r=s.d,q=A.O(r).h("aK<1>") -r=A.am(new A.aK(r,new A.jw(),q),q.h("e.E")) -s.d=r -q=s.b -if(q!=null)B.c.d5(r,0,q) -return s.d}, -eH(a){var s -if(!this.iQ(a))return a -s=A.di(a,this.a) -s.eG() -return s.i(0)}, -iQ(a){var s,r,q,p,o,n,m,l=this.a,k=l.Y(a) -if(k!==0){if(l===$.fH())for(s=0;s0)return o.eH(a) -if(m.Y(a)<=0||m.aZ(a))a=o.jS(a) -if(m.Y(a)<=0&&m.Y(s)>0)throw A.b(A.qe(n+a+'" from "'+s+'".')) -r=A.di(s,m) -r.eG() -q=A.di(a,m) -q.eG() -l=r.d -if(l.length!==0&&l[0]===".")return q.i(0) -l=r.b -p=q.b -if(l!=p)l=l==null||p==null||!m.eK(l,p) -else l=!1 -if(l)return q.i(0) -for(;;){l=r.d -if(l.length!==0){p=q.d -l=p.length!==0&&m.eK(l[0],p[0])}else l=!1 -if(!l)break -B.c.de(r.d,0) -B.c.de(r.e,1) -B.c.de(q.d,0) -B.c.de(q.e,1)}l=r.d -p=l.length -if(p!==0&&l[0]==="..")throw A.b(A.qe(n+a+'" from "'+s+'".')) -l=t.N -B.c.ew(q.d,0,A.b7(p,"..",!1,l)) -p=q.e -p[0]="" -B.c.ew(p,1,A.b7(r.d.length,m.gbi(),!1,l)) -m=q.d -l=m.length -if(l===0)return"." -if(l>1&&B.c.gD(m)==="."){B.c.hn(q.d) -m=q.e -m.pop() -m.pop() -m.push("")}q.b="" -q.ho() -return q.i(0)}, -hu(a){var s,r=this.a -if(r.Y(a)<=0)return r.hm(a) -else{s=this.b -return r.ee(this.kN(0,s==null?A.pn():s,a))}}, -l4(a){var s,r,q=this,p=A.pg(a) -if(p.gW()==="file"&&q.a===$.fG())return p.i(0) -else if(p.gW()!=="file"&&p.gW()!==""&&q.a!==$.fG())return p.i(0) -s=q.eH(q.a.dc(A.pg(p))) -r=q.l5(s) -return q.bk(0,r).length>q.bk(0,s).length?s:r}} -A.jv.prototype={ -$1(a){return a!==""}, -$S:2} -A.jw.prototype={ -$1(a){return a.length!==0}, -$S:2} -A.nX.prototype={ -$1(a){return a==null?"null":'"'+a+'"'}, -$S:63} -A.kv.prototype={ -hG(a){var s=this.Y(a) -if(s>0)return B.a.p(a,0,s) -return this.aZ(a)?a[0]:null}, -hm(a){var s,r=null,q=a.length -if(q===0)return A.an(r,r,r,r) -s=A.pS(this).bk(0,a) -if(this.aw(a.charCodeAt(q-1)))B.c.v(s,"") -return A.an(r,r,s,r)}, -eK(a,b){return a===b}} -A.kI.prototype={ -gev(){var s=this.d -if(s.length!==0)s=B.c.gD(s)===""||B.c.gD(this.e)!=="" -else s=!1 -return s}, -ho(){var s,r,q=this -for(;;){s=q.d -if(!(s.length!==0&&B.c.gD(s)===""))break -B.c.hn(q.d) -q.e.pop()}s=q.e -r=s.length -if(r!==0)s[r-1]=""}, -eG(){var s,r,q,p,o,n=this,m=A.f([],t.s) -for(s=n.d,r=s.length,q=0,p=0;p0){s=B.a.aY(a,"\\",s+1) -if(s>0)return s}return r}if(r<3)return 0 -if(!A.rT(a.charCodeAt(0)))return 0 -if(a.charCodeAt(1)!==58)return 0 -r=a.charCodeAt(2) -if(!(r===47||r===92))return 0 -return 3}, -Y(a){return this.bF(a,!1)}, -aZ(a){return this.Y(a)===1}, -dc(a){var s,r -if(a.gW()!==""&&a.gW()!=="file")throw A.b(A.K("Uri "+a.i(0)+" must have scheme 'file:'.",null)) -s=a.gaa() -if(a.gba()===""){if(s.length>=3&&B.a.u(s,"/")&&A.rP(s,1)!=null)s=B.a.hq(s,"/","")}else s="\\\\"+a.gba()+s -r=A.bl(s,"/","\\") -return A.pa(r,0,r.length,B.j,!1)}, -ee(a){var s,r,q=A.di(a,this),p=q.b -p.toString -if(B.a.u(p,"\\\\")){s=new A.aK(A.f(p.split("\\"),t.s),new A.m9(),t.U) -B.c.d5(q.d,0,s.gD(0)) -if(q.gev())B.c.v(q.d,"") -return A.an(s.gE(0),null,q.d,"file")}else{if(q.d.length===0||q.gev())B.c.v(q.d,"") -p=q.d -r=q.b -r.toString -r=A.bl(r,"/","") -B.c.d5(p,0,A.bl(r,"\\","")) -return A.an(null,null,q.d,"file")}}, -k5(a,b){var s -if(a===b)return!0 -if(a===47)return b===92 -if(a===92)return b===47 -if((a^b)!==32)return!1 -s=a|32 -return s>=97&&s<=122}, -eK(a,b){var s,r -if(a===b)return!0 -s=a.length -if(s!==b.length)return!1 -for(r=0;r")).az(0,", ")):s}return p.charCodeAt(0)==0?p:p}, -$ia9:1} -A.lc.prototype={ -$1(a){if(t.E.b(a))return"blob ("+a.length+" bytes)" -else return J.b3(a)}, -$S:64} -A.cp.prototype={} -A.fX.prototype={ -gln(){var s,r,q=this.l3("PRAGMA user_version;") -try{s=q.eU(new A.cz(B.aD)) -r=A.B(J.j1(s).b[0]) -return r}finally{q.n()}}, -h3(a,b,c,d,e){var s,r,q,p,o,n=null,m=this.b,l=B.i.a4(e) -if(l.length>255)A.D(A.ae(e,"functionName","Must not exceed 255 bytes when utf-8 encoded")) -s=new Uint8Array(A.fA(l)) -r=c?526337:2049 -q=m.a -p=q.c2(s,1) -s=q.d -o=A.pj(s,"dart_sqlite3_create_function_v2",[m.b,p,a.a,r,0,new A.bH(new A.jO(d),n,n)]) -s.dart_sqlite3_free(p) -if(o!==0)A.on(this,o,n,n,n)}, -a5(a,b,c,d){return this.h3(a,b,!0,c,d)}, -n(){var s,r,q,p=this -if(p.r)return -p.r=!0 -s=p.b -r=s.eX() -q=r!==0?A.pm(p.a,s,r,"closing database",null,null):null -if(q!=null)throw A.b(q)}, -h8(a){var s,r,q,p=this,o=B.o -if(J.aC(o)===0){if(p.r)A.D(A.A("This database has already been closed")) -r=p.b -q=r.a -s=q.c2(B.i.a4(a),1) -q=q.d -r=A.pj(q,"sqlite3_exec",[r.b,s,0,0,0]) -q.dart_sqlite3_free(s) -if(r!==0)A.on(p,r,"executing",a,o)}else{s=p.dd(a,!0) -try{s.h9(new A.cz(o))}finally{s.n()}}}, -j3(a,b,c,d,a0){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=this -if(e.r)A.D(A.A("This database has already been closed")) -s=B.i.a4(a) -r=e.b -q=r.a -p=q.bv(s) -o=q.d -n=o.dart_sqlite3_malloc(4) -o=o.dart_sqlite3_malloc(4) -m=new A.lW(r,p,n,o) -l=A.f([],t.bb) -k=new A.jN(m,l) -for(r=s.length,q=q.b,j=0;j."))}, -dA(a){A:{this.i7(a.a) -break A}}, -ck(){if(!this.f){var s=this.a -s.c.d.sqlite3_reset(s.b) -this.f=!0}}, -n(){var s,r,q=this -if(!q.r){q.r=!0 -q.ck() -s=q.a -r=s.c -r.d.sqlite3_finalize(s.b) -r=r.w -if(r!=null)r.h5(s.d)}}, -eU(a){var s=this -s.fi() -s.ck() -s.dA(a) -return s.jm()}, -h9(a){var s=this -s.fi() -s.ck() -s.dA(a) -s.fl()}} -A.hb.prototype={ -cr(a,b){return this.d.a_(a)?1:0}, -dh(a,b){this.d.F(0,a)}, -di(a){return new v.G.URL(a,"file:///").pathname}, -b1(a,b){var s,r=a.a -if(r==null)r=A.oB(this.b,"/") -s=this.d -if(!s.a_(r))if((b&4)!==0)s.t(0,r,new A.bh(new Uint8Array(0),0)) -else throw A.b(A.cb(14)) -return new A.cS(new A.ir(this,r,(b&8)!==0),0)}, -dl(a){}} -A.ir.prototype={ -eM(a,b){var s,r=this.a.d.j(0,this.b) -if(r==null||r.b<=b)return 0 -s=Math.min(a.length,r.b-b) -B.e.N(a,0,s,J.d0(B.e.gaX(r.a),0,r.b),b) -return s}, -dg(){return this.d>=2?1:0}, -cs(){if(this.c)this.a.d.F(0,this.b)}, -cu(){return this.a.d.j(0,this.b).b}, -dj(a){this.d=a}, -dm(a){}, -cv(a){var s=this.a.d,r=this.b,q=s.j(0,r) -if(q==null){s.t(0,r,new A.bh(new Uint8Array(0),0)) -s.j(0,r).sl(0,a)}else q.sl(0,a)}, -dn(a){this.d=a}, -bg(a,b){var s,r=this.a.d,q=this.b,p=r.j(0,q) -if(p==null){p=new A.bh(new Uint8Array(0),0) -r.t(0,q,p)}s=b+a.length -if(s>p.b)p.sl(0,s) -p.ad(0,b,s,a)}} -A.og.prototype={ -$1(a){return a.length!==0}, -$S:2} -A.jx.prototype={ -i9(){var s,r,q,p,o=A.ap(t.N,t.S) -for(s=this.a,r=s.length,q=0;qq.d)throw A.b(A.cb(14)) -s=q.a.b -s===$&&A.x() -s=A.bF(s.buffer,0,null) -r=q.e -B.e.b3(s,r,p) -s.$flags&2&&A.z(s) -s[r+o]=0}, -$S:0} -A.jF.prototype={ -$0(){var s,r=this,q=r.a.b -q===$&&A.x() -s=A.bF(q.buffer,r.b,r.c) -q=r.d -if(q!=null)A.pL(s,q.b) -else return A.pL(s,null)}, -$S:0} -A.jH.prototype={ -$0(){this.a.dl(A.pV(this.b,0))}, -$S:0} -A.jA.prototype={ -$0(){return this.a.cs()}, -$S:0} -A.jG.prototype={ -$0(){var s=this,r=s.a.b -r===$&&A.x() -s.b.eT(A.bF(r.buffer,s.c,s.d),A.B(v.G.Number(s.e)))}, -$S:0} -A.jL.prototype={ -$0(){var s=this,r=s.a.b -r===$&&A.x() -s.b.bg(A.bF(r.buffer,s.c,s.d),A.B(v.G.Number(s.e)))}, -$S:0} -A.jJ.prototype={ -$0(){return this.a.cv(A.B(v.G.Number(this.b)))}, -$S:0} -A.jI.prototype={ -$0(){return this.a.dm(this.b)}, -$S:0} -A.jC.prototype={ -$0(){var s,r=this.b.cu(),q=this.a.b -q===$&&A.x() -q=A.bE(q.buffer,0,null) -s=B.b.L(this.c,2) -q.$flags&2&&A.z(q) -q[s]=r}, -$S:0} -A.jE.prototype={ -$0(){return this.a.dj(this.b)}, -$S:0} -A.jK.prototype={ -$0(){return this.a.dn(this.b)}, -$S:0} -A.jz.prototype={ -$0(){var s,r=this.b.dg(),q=this.a.b -q===$&&A.x() -q=A.bE(q.buffer,0,null) -s=B.b.L(this.c,2) -q.$flags&2&&A.z(q) -q[s]=r}, -$S:0} -A.bH.prototype={} -A.e8.prototype={ -P(a,b,c,d){var s,r=null,q={},p=A.a7(A.hk(this.a,v.G.Symbol.asyncIterator,r,r,r,r)),o=A.eL(r,r,!0,this.$ti.c) -q.a=null -s=new A.j6(q,this,p,o) -o.d=s -o.f=new A.j7(q,o,s) -return new A.au(o,A.r(o).h("au<1>")).P(a,b,c,d)}, -b_(a,b,c){return this.P(a,null,b,c)}} -A.j6.prototype={ -$0(){var s,r=this,q=r.c.next(),p=r.a -p.a=q -s=r.d -A.V(q,t.m).b0(new A.j8(p,r.b,s,r),s.gfX(),t.P)}, -$S:0} -A.j8.prototype={ -$1(a){var s,r,q=this,p=a.done -if(p==null)p=null -s=a.value -r=q.c -if(p===!0){r.n() -q.a.a=null}else{r.v(0,s==null?q.b.$ti.c.a(s):s) -q.a.a=null -p=r.b -if(!((p&1)!==0?(r.gaV().e&4)!==0:(p&2)===0))q.d.$0()}}, -$S:11} -A.j7.prototype={ -$0(){var s,r -if(this.a.a==null){s=this.b -r=s.b -s=!((r&1)!==0?(s.gaV().e&4)!==0:(r&2)===0)}else s=!1 -if(s)this.c.$0()}, -$S:0} -A.cM.prototype={ -I(){var s=0,r=A.k(t.H),q=this,p -var $async$I=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:p=q.b -if(p!=null)p.I() -p=q.c -if(p!=null)p.I() -q.c=q.b=null -return A.i(null,r)}}) -return A.j($async$I,r)}, -gm(){var s=this.a -return s==null?A.D(A.A("Await moveNext() first")):s}, -k(){var s,r,q=this,p=q.a -if(p!=null)p.continue() -p=new A.m($.n,t.k) -s=new A.Z(p,t.fa) -r=q.d -q.b=A.aL(r,"success",new A.mt(q,s),!1) -q.c=A.aL(r,"error",new A.mu(q,s),!1) -return p}} -A.mt.prototype={ -$1(a){var s,r=this.a -r.I() -s=r.$ti.h("1?").a(r.d.result) -r.a=s -this.b.O(s!=null)}, -$S:1} -A.mu.prototype={ -$1(a){var s=this.a -s.I() -s=s.d.error -if(s==null)s=a -this.b.a3(s)}, -$S:1} -A.jn.prototype={ -$1(a){this.a.O(this.c.a(this.b.result))}, -$S:1} -A.jo.prototype={ -$1(a){var s=this.b.error -if(s==null)s=a -this.a.a3(s)}, -$S:1} -A.js.prototype={ -$1(a){this.a.O(this.c.a(this.b.result))}, -$S:1} -A.jt.prototype={ -$1(a){var s=this.b.error -if(s==null)s=a -this.a.a3(s)}, -$S:1} -A.ju.prototype={ -$1(a){this.a.a3(new A.aI("IndexedDB open blocked"))}, -$S:1} -A.lQ.prototype={ -k8(){var s={} -s.dart=new A.lR(this).$0() -return s}, -d9(a){return this.kQ(a)}, -kQ(a){var s=0,r=A.k(t.m),q,p=this,o,n -var $async$d9=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:s=3 -return A.c(A.V(v.G.WebAssembly.instantiateStreaming(a,p.k8()),t.m),$async$d9) -case 3:o=c -n=o.instance.exports -if("_initialize" in n)t.g.a(n._initialize).call() -q=o.instance -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$d9,r)}} -A.lR.prototype={ -$0(){var s=this.a.a,r=A.a7(v.G.Object),q=A.a7(r.create.apply(r,[null])) -q.error_log=A.bj(s.gkT()) -q.localtime=A.b_(s.gkR()) -q.xOpen=A.pd(s.glI()) -q.xDelete=A.nQ(s.glx()) -q.xAccess=A.dX(s.glp()) -q.xFullPathname=A.dX(s.glE()) -q.xRandomness=A.nQ(s.glK()) -q.xSleep=A.b_(s.glP()) -q.xCurrentTimeInt64=A.b_(s.glv()) -q.xClose=A.bj(s.glt()) -q.xRead=A.dX(s.glM()) -q.xWrite=A.dX(s.glX()) -q.xTruncate=A.b_(s.glT()) -q.xSync=A.b_(s.glR()) -q.xFileSize=A.b_(s.glC()) -q.xLock=A.b_(s.glG()) -q.xUnlock=A.b_(s.glV()) -q.xCheckReservedLock=A.b_(s.glr()) -q.xDeviceCharacteristics=A.bj(s.gct()) -q.xFileControl=A.nQ(s.glA()) -q.xSectorSize=A.bj(s.gdk()) -q["dispatch_()v"]=A.bj(s.gkm()) -q["dispatch_()i"]=A.bj(s.gkh()) -q.dispatch_update=A.pd(s.gkk()) -q.dispatch_xFunc=A.dX(s.gks()) -q.dispatch_xStep=A.dX(s.gkw()) -q.dispatch_xInverse=A.dX(s.gku()) -q.dispatch_xValue=A.b_(s.gky()) -q.dispatch_xFinal=A.b_(s.gkq()) -q.dispatch_compare=A.pd(s.gko()) -q.dispatch_busy=A.b_(s.gkf()) -q.changeset_apply_filter=A.b_(s.gkd()) -q.changeset_apply_conflict=A.nQ(s.gkb()) -return q}, -$S:30} -A.i4.prototype={} -A.dy.prototype={ -jh(a,b){var s,r,q=this.e -q.hv(b) -s=this.d.b -r=v.G -r.Atomics.store(s,1,-1) -r.Atomics.store(s,0,a.a) -A.u4(s,0) -r.Atomics.wait(s,1,-1) -s=r.Atomics.load(s,1) -if(s!==0)throw A.b(A.cb(s)) -return a.d.$1(q)}, -a1(a,b){var s=t.cb -return this.jh(a,b,s,s)}, -cr(a,b){return this.a1(B.a0,new A.aX(a,b,0,0)).a}, -dh(a,b){this.a1(B.a1,new A.aX(a,b,0,0))}, -di(a){return new v.G.URL(a,"file:///").pathname}, -b1(a,b){var s=a.a,r=this.a1(B.ac,new A.aX(s==null?A.oB(this.b,"/"):s,b,0,0)) -return new A.cS(new A.i3(this,r.b),r.a)}, -dl(a){this.a1(B.a6,new A.R(B.b.M(a.a,1000),0,0))}, -n(){this.a1(B.a2,B.h)}} -A.i3.prototype={ -gct(){return 2048}, -eM(a,b){var s,r,q,p,o,n,m,l,k,j,i=a.length -for(s=this.a,r=this.b,q=s.e.a,p=v.G,o=t.Z,n=0;i>0;){m=Math.min(65536,i) -i-=m -l=s.a1(B.aa,new A.R(r,b+n,m)).a -k=p.Uint8Array -j=[q] -j.push(0) -j.push(l) -A.hk(a,"set",o.a(A.rN(k,j)),n,null,null) -n+=l -if(l0;){o=Math.min(65536,n) -A.hk(r,"set",o===n&&p===0?a:J.d0(B.e.gaX(a),a.byteOffset+p,o),0,null,null) -s.a1(B.a5,new A.R(q,b+p,o)) -p+=o -n-=o}}} -A.kQ.prototype={} -A.bD.prototype={ -hv(a){var s,r,q -if(!(a instanceof A.b4))if(a instanceof A.R){s=this.b -r=v.G -s.setBigInt64(0,r.BigInt(a.a)) -s.setBigInt64(8,r.BigInt(a.b)) -s.setBigInt64(16,r.BigInt(a.c)) -if(a instanceof A.aX){q=B.i.a4(a.d) -s.setInt32(24,q.length) -B.e.b3(this.c,28,q)}}else throw A.b(A.a3("Message "+a.i(0)))}, -bp(a){return A.B(v.G.Number(this.b.getBigInt64(a)))}} -A.ad.prototype={ -ae(){return"WorkerOperation."+this.b}} -A.bC.prototype={} -A.b4.prototype={} -A.R.prototype={} -A.aX.prototype={} -A.iD.prototype={} -A.eO.prototype={ -bU(a,b){return this.je(a,b)}, -fI(a){return this.bU(a,!1)}, -je(a,b){var s=0,r=A.k(t.eg),q,p=this,o,n,m,l,k,j,i,h -var $async$bU=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:k=A.am(A.pu(a),t.N) -j=k.length -i=j>=1 -h=null -if(i){o=j-1 -n=B.c.a0(k,0,o) -h=k[o]}else n=null -if(!i)throw A.b(A.A("Pattern matching error")) -m=p.c -k=n.length,i=t.m,l=0 -case 3:if(!(l=h.length){s=5 -break}i=new A.n_(f,j,Math.min(4096,h.length-j)) -if(l.value instanceof o.Blob)b.push(A.kP(A.a7(l.value)).bG(i,m)) -else i.$1(g.a(l.value)) -s=4 -break -case 5:q=f -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$bJ,r)}, -cZ(a){return this.k7(a)}, -k7(a){var s=0,r=A.k(t.S),q,p=this,o -var $async$cZ=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:if((p.b.a.a&30)!==0)A.D(A.A("IDB transaction already completed")) -o=A -s=3 -return A.c(A.bo(p.d.put({name:a,length:0}),t.i),$async$cZ) -case 3:q=o.B(c) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$cZ,r)}, -bf(a,b){return this.lo(a,b)}, -lo(a,b){var s=0,r=A.k(t.H),q=this,p,o,n,m,l -var $async$bf=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:if((q.b.a.a&30)!==0)A.D(A.A("IDB transaction already completed")) -s=2 -return A.c(q.e2(a),$async$bf) -case 2:p=d -o=b.b -n=A.r(o).h("bB<1>") -m=A.am(new A.bB(o,n),n.h("e.E")) -B.c.hM(m) -s=3 -return A.c(A.q2(new A.E(m,new A.n0(new A.n1(q,a),b),A.O(m).h("E<1,C<~>>")),t.H),$async$bf) -case 3:s=b.c!==p.length?4:5 -break -case 4:l=new A.cM(q.d.openCursor(a),t.V) -s=6 -return A.c(l.k(),$async$bf) -case 6:s=7 -return A.c(A.bo(l.gm().update({name:p.name,length:b.c}),t.X),$async$bf) -case 7:case 5:return A.i(null,r)}}) -return A.j($async$bf,r)}, -be(a,b,c){return this.ll(0,b,c)}, -ll(a,b,c){var s=0,r=A.k(t.H),q=this,p,o -var $async$be=A.l(function(d,e){if(d===1)return A.h(e,r) -for(;;)switch(s){case 0:if((q.b.a.a&30)!==0)A.D(A.A("IDB transaction already completed")) -s=2 -return A.c(q.e2(b),$async$be) -case 2:p=e -s=p.length>c?3:4 -break -case 3:s=5 -return A.c(A.bo(q.e.delete(q.j5(b,B.b.M(c,4096)*4096)),t.X),$async$be) -case 5:case 4:o=new A.cM(q.d.openCursor(b),t.V) -s=6 -return A.c(o.k(),$async$be) -case 6:s=7 -return A.c(A.bo(o.gm().update({name:p.name,length:c}),t.X),$async$be) -case 7:return A.i(null,r)}}) -return A.j($async$be,r)}, -d0(a){return this.ka(a)}, -ka(a){var s=0,r=A.k(t.H),q=this,p -var $async$d0=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:if((q.b.a.a&30)!==0)A.D(A.A("IDB transaction already completed")) -p=t.X -s=2 -return A.c(A.q2(A.f([A.bo(q.e.delete(q.e1(a,9007199254740992,0)),p),A.bo(q.d.delete(a),p)],t.fG),t.H),$async$d0) -case 2:return A.i(null,r)}}) -return A.j($async$d0,r)}} -A.mY.prototype={ -$0(){this.a.b.ai()}, -$S:3} -A.mZ.prototype={ -$0(){var s=this.a,r=s.a.error -if(r==null)r=new v.G.DOMException("IDB transaction error") -s.b.a3(r)}, -$S:3} -A.mX.prototype={ -$1(a){if(a==null)throw A.b(A.ae(this.a,"fileId","File not found in database")) -else return a}, -$S:89} -A.n_.prototype={ -$1(a){var s=this.a -s.b3(s,this.b,J.d0(a,0,this.c))}, -$S:90} -A.n1.prototype={ -hF(a,b){var s=0,r=A.k(t.H),q=this,p,o,n,m,l,k -var $async$$2=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:p=q.a.e -o=q.b -n=t.n -s=2 -return A.c(A.bo(p.openCursor(v.G.IDBKeyRange.only(A.f([o,a],n))),t.A),$async$$2) -case 2:m=d -l=t.u.a(B.e.gaX(b)) -k=t.X -s=m==null?3:5 -break -case 3:s=6 -return A.c(A.bo(p.put(l,A.f([o,a],n)),k),$async$$2) -case 6:s=4 -break -case 5:s=7 -return A.c(A.bo(m.update(l),k),$async$$2) -case 7:case 4:return A.i(null,r)}}) -return A.j($async$$2,r)}, -$2(a,b){return this.hF(a,b)}, -$S:91} -A.n0.prototype={ -$1(a){var s=this.b.b.j(0,a) -s.toString -return this.a.$2(a,s)}, -$S:92} -A.mD.prototype={ -jC(a,b,c){B.e.b3(this.b.hl(a,new A.mE(this,a)),b,c)}, -jV(a,b){var s,r,q,p,o,n,m,l -for(s=b.length,r=0;rp)B.e.b3(s,0,J.d0(B.e.gaX(r),r.byteOffset+p,Math.min(4096,q-p))) -return s}, -$S:93} -A.iz.prototype={} -A.d7.prototype={ -bZ(a){var s=this -if(s.e||s.d.a==null)A.D(A.cb(10)) -if(a.ex(s.x)){s.aU(!0) -return a.d.a}else return A.b5(null,t.H)}, -aU(a){return this.jz(a)}, -jz(a){var s=0,r=A.k(t.H),q,p=this,o,n -var $async$aU=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:if(a&&!p.r){s=1 -break}s=!p.f&&!p.x.gB(0)?3:4 -break -case 3:p.f=!0 -o=p.x -n=A.am(o,o.$ti.h("e.E")) -o.c4(0) -s=5 -return A.c(p.d.j2(n).ak(new A.kp(p,n,a)),$async$aU) -case 5:case 4:case 1:return A.i(q,r)}}) -return A.j($async$aU,r)}, -n(){var s=0,r=A.k(t.H),q,p=this,o,n -var $async$n=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:if(!p.e){o=p.bZ(new A.f5(new A.kq(),new A.Z(new A.m($.n,t.D),t.F))) -p.e=!0 -p.aU(!1) -q=o -s=1 -break}else{n=p.x -if(!n.gB(0)){q=n.gD(0).d.a -s=1 -break}}case 1:return A.i(q,r)}}) -return A.j($async$n,r)}, -bn(a,b){return this.iA(a,b)}, -iA(a,b){var s=0,r=A.k(t.S),q,p=this,o,n -var $async$bn=A.l(function(c,d){if(c===1)return A.h(d,r) -for(;;)switch(s){case 0:n=p.z -s=n.a_(b)?3:5 -break -case 3:n=n.j(0,b) -n.toString -q=n -s=1 -break -s=4 -break -case 5:s=6 -return A.c(a.d2(b),$async$bn) -case 6:o=d -o.toString -n.t(0,b,o) -q=o -s=1 -break -case 4:case 1:return A.i(q,r)}}) -return A.j($async$bn,r)}, -bS(){var s=0,r=A.k(t.H),q=this,p -var $async$bS=A.l(function(a,b){if(a===1)return A.h(b,r) -for(;;)switch(s){case 0:p=A.f([],t.fG) -s=2 -return A.c(q.d.br(new A.ko(q,p),"readonly"),$async$bS) -case 2:s=3 -return A.c(A.ut(p,t.H),$async$bS) -case 3:return A.i(null,r)}}) -return A.j($async$bS,r)}, -cr(a,b){return this.w.d.a_(a)?1:0}, -dh(a,b){var s=this -s.w.d.F(0,a) -if(!s.y.F(0,a))s.bZ(new A.eZ(s,a,new A.Z(new A.m($.n,t.D),t.F)))}, -di(a){return new v.G.URL(a,"file:///").pathname}, -b1(a,b){var s,r,q,p=this,o=a.a -if(o==null)o=A.oB(p.b,"/") -s=p.w -r=s.d.a_(o)?1:0 -q=s.b1(new A.eH(o),b) -if(r===0)if((b&8)!==0)p.y.v(0,o) -else p.bZ(new A.dC(p,o,new A.Z(new A.m($.n,t.D),t.F))) -return new A.cS(new A.is(p,q.a,o),0)}, -dl(a){}} -A.kp.prototype={ -$0(){var s,r,q,p,o=this.a -o.f=!1 -for(s=this.b,r=s.length,q=0;q=2?1:0}, -cs(){}, -cu(){return this.b.cu()}, -dj(a){this.b.d=a -return null}, -dm(a){}, -hw(a,b){return 12}, -cv(a){var s=this,r=s.a -if(r.e||r.d.a==null)A.D(A.cb(10)) -s.b.cv(a) -if(!r.y.G(0,s.c))r.bZ(new A.f5(new A.mW(s,a),new A.Z(new A.m($.n,t.D),t.F)))}, -dn(a){this.b.d=a -return null}, -bg(a,b){var s,r,q,p,o,n,m=this,l=m.a -if(l.e||l.d.a==null)A.D(A.cb(10)) -s=m.c -if(l.y.G(0,s)){m.b.bg(a,b) -return}r=l.w.d.j(0,s) -if(r==null)r=new A.bh(new Uint8Array(0),0) -q=J.d0(B.e.gaX(r.a),0,r.b) -m.b.bg(a,b) -p=new Uint8Array(a.length) -B.e.b3(p,0,a) -o=A.f([],t.gQ) -n=$.n -o.push(new A.iz(b,p)) -l.bZ(new A.dU(l,s,q,o,new A.Z(new A.m(n,t.D),t.F)))}, -$iaB:1, -$idw:1} -A.mW.prototype={ -$1(a){return this.hE(a)}, -hE(a){var s=0,r=A.k(t.H),q,p=this,o,n -var $async$$1=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:o=p.a -n=a -s=3 -return A.c(o.a.bn(a,o.c),$async$$1) -case 3:q=n.be(0,c,p.b) -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$$1,r)}, -$S:17} -A.av.prototype={ -ex(a){a.cF(a.c,this,!1) -return!0}} -A.f5.prototype={ -Z(a){return this.w.$1(a)}} -A.eZ.prototype={ -ex(a){var s,r,q,p -if(!a.gB(0)){s=a.gD(0) -for(r=this.x;s!=null;)if(s instanceof A.eZ)if(s.x===r)return!1 -else s=s.gcg() -else if(s instanceof A.dU){q=s.gcg() -if(s.x===r){p=s.a -p.toString -p.e7(A.r(s).h("az.E").a(s))}s=q}else if(s instanceof A.dC){if(s.x===r){r=s.a -r.toString -r.e7(A.r(s).h("az.E").a(s)) -return!1}s=s.gcg()}else break}a.cF(a.c,this,!1) -return!0}, -Z(a){return this.l9(a)}, -l9(a){var s=0,r=A.k(t.H),q=this,p,o,n -var $async$Z=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:p=q.w -o=q.x -s=2 -return A.c(p.bn(a,o),$async$Z) -case 2:n=c -p.z.F(0,o) -s=3 -return A.c(a.d0(n),$async$Z) -case 3:return A.i(null,r)}}) -return A.j($async$Z,r)}} -A.dC.prototype={ -Z(a){return this.l8(a)}, -l8(a){var s=0,r=A.k(t.H),q=this,p,o,n -var $async$Z=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:p=q.x -o=q.w.z -n=p -s=2 -return A.c(a.cZ(p),$async$Z) -case 2:o.t(0,n,c) -return A.i(null,r)}}) -return A.j($async$Z,r)}} -A.dU.prototype={ -ex(a){var s,r=a.b===0?null:a.gD(0) -for(s=this.x;r!=null;)if(r instanceof A.dU)if(r.x===s){B.c.ag(r.z,this.z) -return!1}else r=r.gcg() -else if(r instanceof A.dC){if(r.x===s)break -r=r.gcg()}else break -a.cF(a.c,this,!1) -return!0}, -Z(a){return this.la(a)}, -la(a){var s=0,r=A.k(t.H),q=this,p,o,n,m,l,k -var $async$Z=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:m=q.y -l=new A.mD(m,A.ap(t.S,t.E),m.length) -for(m=q.z,p=m.length,o=0;o0) -n.cb(B.M,o.getSize()>0)}return A.i(null,r)}}) -return A.j($async$bB,r)}} -A.l9.prototype={ -hC(a){var s=0,r=A.k(t.m),q,p=this,o,n -var $async$$1=A.l(function(b,c){if(b===1)return A.h(c,r) -for(;;)switch(s){case 0:o=t.m -s=3 -return A.c(A.V(p.a.getFileHandle(a,{create:!0}),o),$async$$1) -case 3:n=c.createSyncAccessHandle() -s=4 -return A.c(A.V(n,o),$async$$1) -case 4:q=c -s=1 -break -case 1:return A.i(q,r)}}) -return A.j($async$$1,r)}, -$1(a){return this.hC(a)}, -$S:94} -A.iJ.prototype={ -eM(a,b){return A.oy(this.a.ap().b9(this.b),a,{at:b})}, -dg(){return this.d>=2?1:0}, -cs(){var s=this.a,r=this.b -s.ap().b9(r).flush() -if(this.c)s.ap().cb(r,!1)}, -cu(){return this.a.ap().b9(this.b).getSize()}, -dj(a){this.d=a}, -dm(a){this.a.ap().b9(this.b).flush()}, -cv(a){this.a.ap().b9(this.b).truncate(a)}, -dn(a){this.d=a}, -bg(a,b){if(A.oz(this.a.ap().b9(this.b),a,{at:b})")),null)}, -i(a){var s=this.a,r=A.O(s) -return new A.E(s,new A.jg(new A.E(s,new A.jh(),r.h("E<1,a>")).ep(0,0,B.u)),r.h("E<1,p>")).az(0,u.q)}, -$iT:1} -A.jd.prototype={ -$1(a){return a.length!==0}, -$S:2} -A.ji.prototype={ -$1(a){return a.gc7()}, -$S:95} -A.jh.prototype={ -$1(a){var s=a.gc7() -return new A.E(s,new A.jf(),A.O(s).h("E<1,a>")).ep(0,0,B.u)}, -$S:96} -A.jf.prototype={ -$1(a){return a.gbz().length}, -$S:37} -A.jg.prototype={ -$1(a){var s=a.gc7() -return new A.E(s,new A.je(this.a),A.O(s).h("E<1,p>")).c9(0)}, -$S:98} -A.je.prototype={ -$1(a){return B.a.hk(a.gbz(),this.a)+" "+A.t(a.geE())+"\n"}, -$S:38} -A.N.prototype={ -geC(){var s=this.a -if(s.gW()==="data")return"data:..." -return $.pG().l4(s)}, -gbz(){var s,r=this,q=r.b -if(q==null)return r.geC() -s=r.c -if(s==null)return r.geC()+" "+A.t(q) -return r.geC()+" "+A.t(q)+":"+A.t(s)}, -i(a){return this.gbz()+" in "+A.t(this.d)}, -geE(){return this.d}} -A.kd.prototype={ -$0(){var s,r,q,p,o,n,m,l=null,k=this.a -if(k==="...")return new A.N(A.an(l,l,l,l),l,l,"...") -s=$.tQ().a9(k) -if(s==null)return new A.bt(A.an(l,"unparsed",l,l),k) -k=s.b -r=k[1] -r.toString -q=$.tx() -r=A.bl(r,q,"") -p=A.bl(r,"","") -r=k[2] -q=r -q.toString -if(B.a.u(q,"1?A.bk(n[1],l):l -return new A.N(o,m,k>2?A.bk(n[2],l):l,p)}, -$S:10} -A.kb.prototype={ -$0(){var s,r,q,p,o,n="",m=this.a,l=$.tP().a9(m) -if(l!=null){s=l.aM("member") -m=l.aM("uri") -m.toString -r=A.ha(m) -m=l.aM("index") -m.toString -q=l.aM("offset") -q.toString -p=A.bk(q,16) -if(!(s==null))m=s -return new A.N(r,1,p+1,m)}l=$.tL().a9(m) -if(l!=null){m=new A.kc(m) -q=l.b -o=q[2] -if(o!=null){o=o -o.toString -q=q[1] -q.toString -q=A.bl(q,"",n) -q=A.bl(q,"Anonymous function",n) -return m.$2(o,A.bl(q,"(anonymous function)",n))}else{q=q[3] -q.toString -return m.$2(q,n)}}return new A.bt(A.an(null,"unparsed",null,null),m)}, -$S:10} -A.kc.prototype={ -$2(a,b){var s,r,q,p,o,n=null,m=$.tK(),l=m.a9(a) -for(;l!=null;a=s){s=l.b[1] -s.toString -l=m.a9(s)}if(a==="native")return new A.N(A.bu("native"),n,n,b) -r=$.tM().a9(a) -if(r==null)return new A.bt(A.an(n,"unparsed",n,n),this.a) -m=r.b -s=m[1] -s.toString -q=A.ha(s) -s=m[2] -s.toString -p=A.bk(s,n) -o=m[3] -return new A.N(q,p,o!=null?A.bk(o,n):n,b)}, -$S:101} -A.k8.prototype={ -$0(){var s,r,q,p,o=null,n=this.a,m=$.ty().a9(n) -if(m==null)return new A.bt(A.an(o,"unparsed",o,o),n) -n=m.b -s=n[1] -s.toString -r=A.bl(s,"/<","") -s=n[2] -s.toString -q=A.ha(s) -n=n[3] -n.toString -p=A.bk(n,o) -return new A.N(q,p,o,r.length===0||r==="anonymous"?"":r)}, -$S:10} -A.k9.prototype={ -$0(){var s,r,q,p,o,n,m,l,k=null,j=this.a,i=$.tA().a9(j) -if(i!=null){s=i.b -r=s[3] -q=r -q.toString -if(B.a.G(q," line "))return A.ul(j) -j=r -j.toString -p=A.ha(j) -o=s[1] -if(o!=null){j=s[2] -j.toString -o+=B.c.c9(A.b7(B.a.ef("/",j).gl(0),".",!1,t.N)) -if(o==="")o="" -o=B.a.hq(o,$.tF(),"")}else o="" -j=s[4] -if(j==="")n=k -else{j=j -j.toString -n=A.bk(j,k)}j=s[5] -if(j==null||j==="")m=k -else{j=j -j.toString -m=A.bk(j,k)}return new A.N(p,n,m,o)}i=$.tC().a9(j) -if(i!=null){j=i.aM("member") -j.toString -s=i.aM("uri") -s.toString -p=A.ha(s) -s=i.aM("index") -s.toString -r=i.aM("offset") -r.toString -l=A.bk(r,16) -if(!(j.length!==0))j=s -return new A.N(p,1,l+1,j)}i=$.tH().a9(j) -if(i!=null){j=i.aM("member") -j.toString -return new A.N(A.an(k,"wasm code",k,k),k,k,j)}return new A.bt(A.an(k,"unparsed",k,k),j)}, -$S:10} -A.ka.prototype={ -$0(){var s,r,q,p,o=null,n=this.a,m=$.tD().a9(n) -if(m==null)throw A.b(A.al("Couldn't parse package:stack_trace stack trace line '"+n+"'.",o,o)) -n=m.b -s=n[1] -if(s==="data:...")r=A.qH("") -else{s=s -s.toString -r=A.bu(s)}if(r.gW()===""){s=$.pG() -r=s.hu(s.fW(s.a.dc(A.pg(r)),o,o,o,o,o,o,o,o,o,o,o,o,o,o))}s=n[2] -if(s==null)q=o -else{s=s -s.toString -q=A.bk(s,o)}s=n[3] -if(s==null)p=o -else{s=s -s.toString -p=A.bk(s,o)}return new A.N(r,q,p,n[4])}, -$S:10} -A.hn.prototype={ -gfU(){var s,r=this,q=r.b -if(q===$){s=r.a.$0() -r.b!==$&&A.pA() -r.b=s -q=s}return q}, -gc7(){return this.gfU().gc7()}, -i(a){return this.gfU().i(0)}, -$iT:1, -$ia2:1} -A.a2.prototype={ -i(a){var s=this.a,r=A.O(s) -return new A.E(s,new A.lv(new A.E(s,new A.lw(),r.h("E<1,a>")).ep(0,0,B.u)),r.h("E<1,p>")).c9(0)}, -$iT:1, -gc7(){return this.a}} -A.lt.prototype={ -$0(){return A.qD(this.a.i(0))}, -$S:102} -A.lu.prototype={ -$1(a){return a.length!==0}, -$S:2} -A.ls.prototype={ -$1(a){return!B.a.u(a,$.tO())}, -$S:2} -A.lr.prototype={ -$1(a){return a!=="\tat "}, -$S:2} -A.lp.prototype={ -$1(a){return a.length!==0&&a!=="[native code]"}, -$S:2} -A.lq.prototype={ -$1(a){return!B.a.u(a,"=====")}, -$S:2} -A.lw.prototype={ -$1(a){return a.gbz().length}, -$S:37} -A.lv.prototype={ -$1(a){if(a instanceof A.bt)return a.i(0)+"\n" -return B.a.hk(a.gbz(),this.a)+" "+A.t(a.geE())+"\n"}, -$S:38} -A.bt.prototype={ -i(a){return this.w}, -$iN:1, -gbz(){return"unparsed"}, -geE(){return this.w}} -A.ed.prototype={} -A.eX.prototype={ -P(a,b,c,d){var s,r=this.b -if(r.d){a=null -d=null}s=this.a.P(a,b,c,d) -if(!r.d)r.c=s -return s}, -b_(a,b,c){return this.P(a,null,b,c)}, -eD(a,b){return this.P(a,null,b,null)}} -A.eW.prototype={ -n(){var s,r=this.hQ(),q=this.b -q.d=!0 -s=q.c -if(s!=null){s.ce(null) -s.eI(null)}return r}} -A.em.prototype={ -ghP(){var s=this.b -s===$&&A.x() -return new A.au(s,A.r(s).h("au<1>"))}, -ghL(){var s=this.a -s===$&&A.x() -return s}, -hW(a,b,c,d){var s=this,r=$.n -s.a!==$&&A.j_() -s.a=new A.f7(a,s,new A.a6(new A.m(r,t.D),t.h),!0) -r=A.eL(null,new A.kn(c,s),!0,d) -s.b!==$&&A.j_() -s.b=r}, -iZ(){var s,r -this.d=!0 -s=this.c -if(s!=null)s.I() -r=this.b -r===$&&A.x() -r.n()}} -A.kn.prototype={ -$0(){var s,r,q=this.b -if(q.d)return -s=this.a.a -r=q.b -r===$&&A.x() -q.c=s.b_(r.gjT(r),new A.km(q),r.gfX())}, -$S:0} -A.km.prototype={ -$0(){var s=this.a,r=s.a -r===$&&A.x() -r.j_() -s=s.b -s===$&&A.x() -s.n()}, -$S:0} -A.f7.prototype={ -v(a,b){if(this.e)throw A.b(A.A("Cannot add event after closing.")) -if(this.d)return -this.a.a.v(0,b)}, -a2(a,b){if(this.e)throw A.b(A.A("Cannot add event after closing.")) -if(this.d)return -this.iD(a,b)}, -iD(a,b){this.a.a.a2(a,b) -return}, -n(){var s=this -if(s.e)return s.c.a -s.e=!0 -if(!s.d){s.b.iZ() -s.c.O(s.a.a.n())}return s.c.a}, -j_(){this.d=!0 -var s=this.c -if((s.a.a&30)===0)s.ai() -return}, -$iaf:1} -A.hM.prototype={} -A.eK.prototype={} -A.dt.prototype={ -gl(a){return this.b}, -j(a,b){if(b>=this.b)throw A.b(A.q4(b,this)) -return this.a[b]}, -t(a,b,c){var s -if(b>=this.b)throw A.b(A.q4(b,this)) -s=this.a -s.$flags&2&&A.z(s) -s[b]=c}, -sl(a,b){var s,r,q,p,o=this,n=o.b -if(bn){if(n===0)p=new Uint8Array(b) -else p=o.im(b) -B.e.ad(p,0,o.b,o.a) -o.a=p}}o.b=b}, -im(a){var s=this.a.length*2 -if(a!=null&&ss)throw A.b(A.X(c,0,s,null,null)) -s=this.a -if(d instanceof A.bh)B.e.N(s,b,c,d.a,e) -else B.e.N(s,b,c,d,e)}, -ad(a,b,c,d){return this.N(0,b,c,d,0)}} -A.it.prototype={} -A.bh.prototype={} -A.ox.prototype={} -A.f2.prototype={ -P(a,b,c,d){return A.aL(this.a,this.b,a,!1)}, -b_(a,b,c){return this.P(a,null,b,c)}} -A.il.prototype={ -I(){var s=this,r=A.b5(null,t.H) -if(s.b==null)return r -s.e8() -s.d=s.b=null -return r}, -ce(a){var s,r=this -if(r.b==null)throw A.b(A.A("Subscription has been canceled.")) -r.e8() -if(a==null)s=null -else{s=A.rJ(new A.mB(a),t.m) -s=s==null?null:A.bj(s)}r.d=s -r.e6()}, -eI(a){}, -bC(){if(this.b==null)return;++this.a -this.e8()}, -bc(){var s=this -if(s.b==null||s.a<=0)return;--s.a -s.e6()}, -e6(){var s=this,r=s.d -if(r!=null&&s.a<=0)s.b.addEventListener(s.c,r,!1)}, -e8(){var s=this.d -if(s!=null)this.b.removeEventListener(this.c,s,!1)}} -A.mA.prototype={ -$1(a){return this.a.$1(a)}, -$S:1} -A.mB.prototype={ -$1(a){return this.a.$1(a)}, -$S:1};(function aliases(){var s=J.bZ.prototype -s.hR=s.i -s=A.cK.prototype -s.hT=s.bK -s=A.ag.prototype -s.dt=s.aQ -s.f_=s.a7 -s.f0=s.bm -s=A.fn.prototype -s.hU=s.eg -s=A.w.prototype -s.eZ=s.N -s=A.d4.prototype -s.hQ=s.n -s=A.cD.prototype -s.hS=s.n})();(function installTearOffs(){var s=hunkHelpers._static_2,r=hunkHelpers._static_1,q=hunkHelpers._static_0,p=hunkHelpers.installStaticTearOff,o=hunkHelpers._instance_0u,n=hunkHelpers.installInstanceTearOff,m=hunkHelpers._instance_2u,l=hunkHelpers._instance_1i,k=hunkHelpers._instance_1u -s(J,"ws","uz",103) -r(A,"x5","vg",13) -r(A,"x6","vh",13) -r(A,"x7","vi",13) -r(A,"x8","wG",104) -q(A,"rM","wZ",0) -r(A,"x9","wH",18) -s(A,"xa","wJ",7) -q(A,"rL","wI",0) -p(A,"xe",5,null,["$5"],["wS"],105,0) -p(A,"xj",4,null,["$1$4","$4"],["nT",function(a,b,c,d){return A.nT(a,b,c,d,t.z)}],106,0) -p(A,"xl",5,null,["$2$5","$5"],["nU",function(a,b,c,d,e){var i=t.z -return A.nU(a,b,c,d,e,i,i)}],107,0) -p(A,"xk",6,null,["$3$6"],["ph"],108,0) -p(A,"xh",4,null,["$1$4","$4"],["rC",function(a,b,c,d){return A.rC(a,b,c,d,t.z)}],109,0) -p(A,"xi",4,null,["$2$4","$4"],["rD",function(a,b,c,d){var i=t.z -return A.rD(a,b,c,d,i,i)}],110,0) -p(A,"xg",4,null,["$3$4","$4"],["rB",function(a,b,c,d){var i=t.z -return A.rB(a,b,c,d,i,i,i)}],111,0) -p(A,"xc",5,null,["$5"],["wR"],112,0) -p(A,"xm",4,null,["$4"],["nV"],113,0) -p(A,"xb",5,null,["$5"],["wQ"],114,0) -p(A,"ze",5,null,["$5"],["wP"],115,0) -p(A,"xf",4,null,["$4"],["wT"],116,0) -p(A,"xd",5,null,["$5"],["rA"],117,0) -var j -o(j=A.cL.prototype,"gbP","an",0) -o(j,"gbQ","ao",0) -n(A.dB.prototype,"gk6",0,1,null,["$2","$1"],["bx","a3"],31,0,0) -m(A.m.prototype,"gdG","ie",7) -l(j=A.cT.prototype,"gjT","v",8) -n(j,"gfX",0,1,null,["$2","$1"],["a2","jU"],31,0,0) -o(j=A.cg.prototype,"gbP","an",0) -o(j,"gbQ","ao",0) -o(j=A.ag.prototype,"gbP","an",0) -o(j,"gbQ","ao",0) -o(A.f_.prototype,"gfw","iY",0) -k(j=A.dO.prototype,"giS","iT",8) -m(j,"giW","iX",7) -o(j,"giU","iV",0) -o(j=A.dE.prototype,"gbP","an",0) -o(j,"gbQ","ao",0) -k(j,"gdR","dS",8) -m(j,"gdV","dW",42) -o(j,"gdT","dU",0) -o(j=A.dL.prototype,"gbP","an",0) -o(j,"gbQ","ao",0) -k(j,"gdR","dS",8) -m(j,"gdV","dW",7) -o(j,"gdT","dU",0) -k(A.dM.prototype,"gjZ","eg","Y<2>(d?)") -r(A,"xq","vc",6) -p(A,"xR",2,null,["$1$2","$2"],["rV",function(a,b){return A.rV(a,b,t.o)}],118,0) -r(A,"xT","y_",4) -r(A,"xS","xZ",4) -r(A,"xQ","xr",4) -r(A,"xU","y5",4) -r(A,"xN","x3",4) -r(A,"xO","x4",4) -r(A,"xP","xn",4) -k(A.eh.prototype,"giG","iH",8) -k(A.h1.prototype,"gio","dJ",15) -k(A.i5.prototype,"gjF","cM",15) -r(A,"zj","rr",20) -r(A,"zh","rp",20) -r(A,"zi","rq",20) -r(A,"rX","wK",26) -r(A,"rY","wN",121) -r(A,"rW","wi",122) -k(j=A.fW.prototype,"gkT","kU",5) -m(j,"gkR","kS",68) -n(j,"glI",0,5,null,["$5"],["lJ"],69,0,0) -n(j,"glx",0,3,null,["$3"],["ly"],70,0,0) -n(j,"glp",0,4,null,["$4"],["lq"],32,0,0) -n(j,"glE",0,4,null,["$4"],["lF"],32,0,0) -n(j,"glK",0,3,null,["$3"],["lL"],72,0,0) -m(j,"glP","lQ",33) -m(j,"glv","lw",33) -k(j,"glt","lu",21) -n(j,"glM",0,4,null,["$4"],["lN"],34,0,0) -n(j,"glX",0,4,null,["$4"],["lY"],34,0,0) -m(j,"glT","lU",76) -m(j,"glR","lS",9) -m(j,"glC","lD",9) -m(j,"glG","lH",9) -m(j,"glV","lW",9) -m(j,"glr","ls",9) -k(j,"gct","lz",21) -n(j,"glA",0,3,null,["$3"],["lB"],78,0,0) -k(j,"gdk","lO",21) -k(j,"gkm","kn",13) -k(j,"gkh","ki",79) -n(j,"gkk",0,5,null,["$5"],["kl"],80,0,0) -n(j,"gks",0,4,null,["$4"],["kt"],23,0,0) -n(j,"gkw",0,4,null,["$4"],["kx"],23,0,0) -n(j,"gku",0,4,null,["$4"],["kv"],23,0,0) -m(j,"gky","kz",35) -m(j,"gkq","kr",35) -n(j,"gko",0,5,null,["$5"],["kp"],83,0,0) -m(j,"gkf","kg",127) -m(j,"gkd","ke",85) -n(j,"gkb",0,3,null,["$3"],["kc"],86,0,0) -o(A.dy.prototype,"gc5","n",0) -r(A,"bT","uH",123) -r(A,"ba","uI",124) -r(A,"pz","uJ",125) -k(A.eO.prototype,"gj8","j9",87) -o(A.d7.prototype,"gc5","n",12) -o(A.dq.prototype,"gc5","n",0) -r(A,"xz","us",14) -r(A,"rQ","ur",14) -r(A,"xx","up",14) -r(A,"xy","uq",14) -r(A,"y9","v5",36) -r(A,"y8","v4",36)})();(function inheritance(){var s=hunkHelpers.mixin,r=hunkHelpers.inherit,q=hunkHelpers.inheritMany -r(A.d,null) -q(A.d,[A.oG,J.hf,A.eF,J.fI,A.e,A.fR,A.M,A.w,A.cs,A.kS,A.b6,A.dc,A.cI,A.h7,A.hP,A.hK,A.hL,A.h4,A.i6,A.eo,A.el,A.hT,A.hO,A.fh,A.ee,A.iv,A.ly,A.hB,A.ej,A.fl,A.S,A.kA,A.hp,A.db,A.ho,A.cA,A.dJ,A.ma,A.ds,A.ni,A.mq,A.iQ,A.be,A.ip,A.no,A.iN,A.i8,A.iL,A.W,A.Y,A.ag,A.cK,A.f6,A.dB,A.bv,A.m,A.i9,A.hN,A.cT,A.iM,A.ia,A.dP,A.ij,A.my,A.fg,A.f_,A.dO,A.f1,A.dF,A.nG,A.nI,A.nH,A.nE,A.nF,A.nD,A.nA,A.iU,A.nz,A.ny,A.nC,A.nB,A.iT,A.iV,A.iS,A.dV,A.eQ,A.iq,A.dp,A.n4,A.dI,A.ix,A.az,A.iy,A.ct,A.cv,A.nw,A.fx,A.aa,A.io,A.ef,A.by,A.mz,A.hC,A.eI,A.im,A.aF,A.he,A.aP,A.G,A.dQ,A.aD,A.fu,A.hW,A.b8,A.h8,A.hA,A.n2,A.d4,A.fZ,A.hq,A.hz,A.hU,A.eh,A.iA,A.fU,A.h2,A.h1,A.c_,A.aQ,A.bX,A.c3,A.bq,A.c5,A.bW,A.c6,A.c4,A.bG,A.bJ,A.kT,A.fi,A.i5,A.bL,A.bV,A.eb,A.ar,A.e9,A.d2,A.kL,A.lx,A.jP,A.dj,A.kM,A.eA,A.kK,A.br,A.jQ,A.lM,A.h3,A.dm,A.lK,A.l0,A.fV,A.ln,A.kI,A.hD,A.c9,A.cp,A.fX,A.lb,A.d3,A.at,A.fP,A.jx,A.iH,A.n8,A.cz,A.aJ,A.eH,A.lU,A.lL,A.lW,A.lV,A.cc,A.bO,A.fW,A.bH,A.cM,A.lQ,A.kQ,A.bD,A.bC,A.iD,A.eO,A.dK,A.j9,A.f8,A.mD,A.iz,A.is,A.n5,A.lF,A.bn,A.N,A.hn,A.a2,A.bt,A.eK,A.f7,A.hM,A.ox,A.il]) -q(J.hf,[J.hh,J.er,J.a1,J.aN,J.d9,J.d8,J.bY]) -q(J.a1,[J.bZ,J.u,A.de,A.ew]) -q(J.bZ,[J.hE,J.cH,J.aV]) -r(J.hg,A.eF) -r(J.kw,J.u) -q(J.d8,[J.eq,J.hj]) -q(A.e,[A.cf,A.q,A.aG,A.aK,A.ek,A.cG,A.bK,A.eG,A.eP,A.bz,A.cQ,A.i7,A.iK,A.dR,A.cB]) -q(A.cf,[A.cr,A.fy]) -r(A.f0,A.cr) -r(A.eV,A.fy) -r(A.ak,A.eV) -q(A.M,[A.da,A.bM,A.hl,A.hS,A.hI,A.ik,A.eB,A.fL,A.bc,A.eN,A.hR,A.aI,A.fT]) -q(A.w,[A.du,A.i0,A.dx,A.dt]) -r(A.fS,A.du) -q(A.cs,[A.jj,A.kr,A.jk,A.lo,A.o8,A.oa,A.mc,A.mb,A.nJ,A.nj,A.nl,A.nk,A.kk,A.kf,A.mH,A.mG,A.mS,A.ll,A.lk,A.li,A.lg,A.nh,A.mx,A.nc,A.mV,A.kE,A.mn,A.nr,A.kg,A.oc,A.oh,A.oi,A.o1,A.jW,A.jX,A.jY,A.kY,A.kZ,A.l_,A.kW,A.m4,A.m1,A.m2,A.m_,A.m5,A.m3,A.kN,A.k4,A.nW,A.ky,A.kz,A.kD,A.lX,A.lY,A.jS,A.l6,A.nZ,A.of,A.jZ,A.kR,A.jp,A.jq,A.jr,A.l5,A.l1,A.l4,A.l2,A.l3,A.jv,A.jw,A.nX,A.m9,A.lc,A.og,A.ok,A.ol,A.j8,A.mt,A.mu,A.jn,A.jo,A.js,A.jt,A.ju,A.jc,A.ja,A.mX,A.n_,A.n0,A.kq,A.ko,A.mW,A.l9,A.lG,A.lH,A.lI,A.lJ,A.jd,A.ji,A.jh,A.jf,A.jg,A.je,A.lu,A.ls,A.lr,A.lp,A.lq,A.lw,A.lv,A.mA,A.mB]) -q(A.jj,[A.oe,A.md,A.me,A.nn,A.nm,A.kj,A.mJ,A.mO,A.mN,A.mL,A.mK,A.mR,A.mQ,A.mP,A.lm,A.lj,A.lh,A.lf,A.ng,A.nf,A.mp,A.mo,A.n6,A.nM,A.nN,A.mw,A.mv,A.nb,A.na,A.nS,A.nv,A.nu,A.jV,A.kU,A.kV,A.kX,A.m6,A.m7,A.m0,A.oj,A.mf,A.mk,A.mi,A.mj,A.mh,A.mg,A.nd,A.ne,A.jU,A.jT,A.mC,A.kB,A.kC,A.lZ,A.jR,A.k2,A.k_,A.k0,A.k1,A.j4,A.jN,A.om,A.jB,A.jy,A.jD,A.jF,A.jH,A.jA,A.jG,A.jL,A.jJ,A.jI,A.jC,A.jE,A.jK,A.jz,A.j6,A.j7,A.lR,A.jb,A.mY,A.mZ,A.mE,A.kp,A.kd,A.kb,A.k8,A.k9,A.ka,A.lt,A.kn,A.km]) -q(A.q,[A.Q,A.cy,A.bB,A.et,A.es,A.cP,A.fa]) -q(A.Q,[A.cF,A.E,A.eE]) -r(A.cx,A.aG) -r(A.ei,A.cG) -r(A.d5,A.bK) -r(A.cw,A.bz) -r(A.iB,A.fh) -q(A.iB,[A.ah,A.cS,A.iC]) -r(A.cu,A.ee) -r(A.ep,A.kr) -r(A.ey,A.bM) -q(A.lo,[A.le,A.ea]) -q(A.S,[A.bA,A.cO]) -q(A.jk,[A.kx,A.o9,A.nK,A.nY,A.kl,A.ke,A.mI,A.mT,A.nL,A.mU,A.kF,A.mm,A.lD,A.ki,A.kh,A.lP,A.lO,A.lN,A.o_,A.j5,A.jO,A.n1,A.kc]) -r(A.dd,A.de) -q(A.ew,[A.ev,A.dg]) -q(A.dg,[A.fc,A.fe]) -r(A.fd,A.fc) -r(A.c0,A.fd) -r(A.ff,A.fe) -r(A.aY,A.ff) -q(A.c0,[A.hs,A.ht]) -q(A.aY,[A.hu,A.df,A.hv,A.hw,A.hx,A.ex,A.c1]) -r(A.fp,A.ik) -q(A.Y,[A.dN,A.f4,A.eT,A.e8,A.eX,A.f2]) -r(A.au,A.dN) -r(A.eU,A.au) -q(A.ag,[A.cg,A.dE,A.dL]) -r(A.cL,A.cg) -r(A.fo,A.cK) -q(A.dB,[A.a6,A.Z]) -q(A.cT,[A.dA,A.dS]) -q(A.ij,[A.dD,A.eY]) -r(A.fb,A.f4) -r(A.fn,A.hN) -r(A.dM,A.fn) -q(A.iS,[A.ih,A.iG]) -r(A.dG,A.cO) -r(A.fj,A.dp) -r(A.f9,A.fj) -q(A.ct,[A.h5,A.fN]) -q(A.h5,[A.fJ,A.hZ]) -q(A.cv,[A.iP,A.fO,A.i_]) -r(A.fK,A.iP) -q(A.bc,[A.dk,A.en]) -r(A.ii,A.fu) -q(A.c_,[A.as,A.bg,A.bp,A.bx]) -q(A.mz,[A.dh,A.cE,A.c2,A.dv,A.c8,A.cC,A.cd,A.bP,A.kH,A.ad,A.d6]) -r(A.jM,A.kL) -r(A.kG,A.lx) -q(A.jP,[A.hy,A.k3]) -q(A.ar,[A.ib,A.dH,A.hm]) -q(A.ib,[A.iO,A.h_,A.ic,A.f3]) -r(A.fm,A.iO) -r(A.iu,A.dH) -r(A.cD,A.jM) -r(A.fk,A.k3) -q(A.lM,[A.jl,A.dz,A.dn,A.dl,A.eJ,A.h0]) -q(A.jl,[A.c7,A.eg]) -r(A.ms,A.kM) -r(A.i2,A.h_) -r(A.iR,A.cD) -r(A.kv,A.ln) -q(A.kv,[A.kJ,A.lE,A.m8]) -r(A.dr,A.d3) -r(A.fQ,A.at) -q(A.fQ,[A.hb,A.dy,A.d7,A.dq]) -q(A.fP,[A.ir,A.i3,A.iJ]) -r(A.iE,A.jx) -r(A.iF,A.iE) -r(A.hH,A.iF) -r(A.iI,A.iH) -r(A.bs,A.iI) -q(A.az,[A.cJ,A.av]) -r(A.i4,A.lb) -q(A.bC,[A.b4,A.R]) -r(A.aX,A.R) -q(A.av,[A.f5,A.eZ,A.dC,A.dU]) -q(A.eK,[A.ed,A.em]) -r(A.eW,A.d4) -r(A.it,A.dt) -r(A.bh,A.it) -s(A.du,A.hT) -s(A.fy,A.w) -s(A.fc,A.w) -s(A.fd,A.el) -s(A.fe,A.w) -s(A.ff,A.el) -s(A.dA,A.ia) -s(A.dS,A.iM) -s(A.iE,A.w) -s(A.iF,A.hz) -s(A.iH,A.hU) -s(A.iI,A.S)})() -var v={G:typeof self!="undefined"?self:globalThis,typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{a:"int",F:"double",b2:"num",p:"String",J:"bool",G:"Null",o:"List",d:"Object",aq:"Map",y:"JSObject"},mangledNames:{},types:["~()","~(y)","J(p)","G()","F(b2)","~(a)","p(p)","~(d,T)","~(d?)","a(aB,a)","N()","G(y)","C<~>()","~(~())","N(p)","d?(d?)","C()","C<~>(f8)","~(@)","~(y?,o?)","p(a)","a(aB)","G(d,T)","~(bH,a,a,a)","J(~)","C()","b2?(o)","@()","J()","G(d?,T)","y()","~(d[T?])","a(at,a,a,a)","a(at,a)","a(aB,a,a,aN)","~(bH,a)","a2(p)","a(N)","p(N)","G(@)","a(a)","a(a,a)","~(@,T)","a()","C()","aq(o)","a(o)","~(d?,d?)","G(ar)","C(~)","G(~())","@(@,p)","@(p)","J(a)","0&(p,a?)","y(u)","dm()","C()","C()","~(af)","@(@)","~(J,J,J,o<+(bP,p)>)","G(aV,aV)","p(p?)","p(d?)","~(oL,o)","d?(~)","~(v,U,v,~())","~(aN,a)","aB?(at,a,a,a,a)","a(at,a,a)","G(@,T)","a(at?,a,a)","C<~>(as)","a?(a)","G(~)","a(aB,aN)","bI?/(as)","a(aB,a,a)","a(a())","~(~(a,p,a),a,a,a,aN)","G(J)","C()","a(bH,a,a,a,a)","bV<@>?()","a(oO,a)","a(oO,a,a)","~(dK)","as()","y(y?)","~(cq)","C<~>(a,aZ)","C<~>(a)","aZ()","C(p)","o(a2)","a(a2)","bg()","p(a2)","bq()","o(u)","N(p,p)","a2()","a(@,@)","J(d?)","~(v?,U?,v,d,T)","0^(v?,U?,v,0^())","0^(v?,U?,v,0^(1^),1^)","0^(v?,U?,v,0^(1^,2^),1^,2^)","0^()(v,U,v,0^())","0^(1^)(v,U,v,0^(1^))","0^(1^,2^)(v,U,v,0^(1^,2^))","W?(v,U,v,d,T?)","~(v?,U?,v,~())","eM(v,U,v,by,~())","eM(v,U,v,by,~(eM))","~(v,U,v,p)","v(v?,U?,v,eQ?,aq?)","0^(0^,0^)","bL(d?)","C()","J?(o)","J?(o<@>)","b4(bD)","R(bD)","aX(bD)","~(a,@)","a(a(a),a)"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{"2;":(a,b)=>c=>c instanceof A.ah&&a.b(c.a)&&b.b(c.b),"2;file,outFlags":(a,b)=>c=>c instanceof A.cS&&a.b(c.a)&&b.b(c.b),"2;result,resultCode":(a,b)=>c=>c instanceof A.iC&&a.b(c.a)&&b.b(c.b)}} -A.vL(v.typeUniverse,JSON.parse('{"aV":"bZ","hE":"bZ","cH":"bZ","ym":"de","u":{"o":["1"],"a1":[],"q":["1"],"y":[],"e":["1"],"ay":["1"]},"hh":{"J":[],"L":[]},"er":{"G":[],"L":[]},"a1":{"y":[]},"bZ":{"a1":[],"y":[]},"hg":{"eF":[]},"kw":{"u":["1"],"o":["1"],"a1":[],"q":["1"],"y":[],"e":["1"],"ay":["1"]},"d8":{"F":[],"b2":[]},"eq":{"F":[],"a":[],"b2":[],"L":[]},"hj":{"F":[],"b2":[],"L":[]},"bY":{"p":[],"ay":["@"],"L":[]},"cf":{"e":["2"]},"cr":{"cf":["1","2"],"e":["2"],"e.E":"2"},"f0":{"cr":["1","2"],"cf":["1","2"],"q":["2"],"e":["2"],"e.E":"2"},"eV":{"w":["2"],"o":["2"],"cf":["1","2"],"q":["2"],"e":["2"]},"ak":{"eV":["1","2"],"w":["2"],"o":["2"],"cf":["1","2"],"q":["2"],"e":["2"],"w.E":"2","e.E":"2"},"da":{"M":[]},"fS":{"w":["a"],"o":["a"],"q":["a"],"e":["a"],"w.E":"a"},"q":{"e":["1"]},"Q":{"q":["1"],"e":["1"]},"cF":{"Q":["1"],"q":["1"],"e":["1"],"e.E":"1","Q.E":"1"},"aG":{"e":["2"],"e.E":"2"},"cx":{"aG":["1","2"],"q":["2"],"e":["2"],"e.E":"2"},"E":{"Q":["2"],"q":["2"],"e":["2"],"e.E":"2","Q.E":"2"},"aK":{"e":["1"],"e.E":"1"},"ek":{"e":["2"],"e.E":"2"},"cG":{"e":["1"],"e.E":"1"},"ei":{"cG":["1"],"q":["1"],"e":["1"],"e.E":"1"},"bK":{"e":["1"],"e.E":"1"},"d5":{"bK":["1"],"q":["1"],"e":["1"],"e.E":"1"},"eG":{"e":["1"],"e.E":"1"},"cy":{"q":["1"],"e":["1"],"e.E":"1"},"eP":{"e":["1"],"e.E":"1"},"bz":{"e":["+(a,1)"],"e.E":"+(a,1)"},"cw":{"bz":["1"],"q":["+(a,1)"],"e":["+(a,1)"],"e.E":"+(a,1)"},"du":{"w":["1"],"o":["1"],"q":["1"],"e":["1"]},"eE":{"Q":["1"],"q":["1"],"e":["1"],"e.E":"1","Q.E":"1"},"ee":{"aq":["1","2"]},"cu":{"ee":["1","2"],"aq":["1","2"]},"cQ":{"e":["1"],"e.E":"1"},"ey":{"bM":[],"M":[]},"hl":{"M":[]},"hS":{"M":[]},"hB":{"a9":[]},"fl":{"T":[]},"hI":{"M":[]},"bA":{"S":["1","2"],"aq":["1","2"],"S.K":"1","S.V":"2"},"bB":{"q":["1"],"e":["1"],"e.E":"1"},"et":{"q":["1"],"e":["1"],"e.E":"1"},"es":{"q":["aP<1,2>"],"e":["aP<1,2>"],"e.E":"aP<1,2>"},"dJ":{"hG":[],"eu":[]},"i7":{"e":["hG"],"e.E":"hG"},"ds":{"eu":[]},"iK":{"e":["eu"],"e.E":"eu"},"dd":{"a1":[],"y":[],"cq":[],"L":[]},"df":{"aY":[],"kt":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"c1":{"aY":[],"aZ":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"de":{"a1":[],"y":[],"cq":[],"L":[]},"ew":{"a1":[],"y":[]},"iQ":{"cq":[]},"ev":{"a1":[],"ou":[],"y":[],"L":[]},"dg":{"aW":["1"],"a1":[],"y":[],"ay":["1"]},"c0":{"w":["F"],"o":["F"],"aW":["F"],"a1":[],"q":["F"],"y":[],"ay":["F"],"e":["F"]},"aY":{"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"]},"hs":{"c0":[],"k6":[],"w":["F"],"o":["F"],"aW":["F"],"a1":[],"q":["F"],"y":[],"ay":["F"],"e":["F"],"L":[],"w.E":"F"},"ht":{"c0":[],"k7":[],"w":["F"],"o":["F"],"aW":["F"],"a1":[],"q":["F"],"y":[],"ay":["F"],"e":["F"],"L":[],"w.E":"F"},"hu":{"aY":[],"ks":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"hv":{"aY":[],"ku":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"hw":{"aY":[],"lA":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"hx":{"aY":[],"lB":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"ex":{"aY":[],"lC":[],"w":["a"],"o":["a"],"aW":["a"],"a1":[],"q":["a"],"y":[],"ay":["a"],"e":["a"],"L":[],"w.E":"a"},"ik":{"M":[]},"fp":{"bM":[],"M":[]},"W":{"M":[]},"ag":{"ag.T":"1"},"dF":{"af":["1"]},"dR":{"e":["1"],"e.E":"1"},"eU":{"au":["1"],"dN":["1"],"Y":["1"],"Y.T":"1"},"cL":{"cg":["1"],"ag":["1"],"ag.T":"1"},"cK":{"af":["1"]},"fo":{"cK":["1"],"af":["1"]},"eB":{"M":[]},"a6":{"dB":["1"]},"Z":{"dB":["1"]},"m":{"C":["1"]},"cT":{"af":["1"]},"dA":{"cT":["1"],"af":["1"]},"dS":{"cT":["1"],"af":["1"]},"au":{"dN":["1"],"Y":["1"],"Y.T":"1"},"cg":{"ag":["1"],"ag.T":"1"},"dP":{"af":["1"]},"dN":{"Y":["1"]},"f4":{"Y":["2"]},"dE":{"ag":["2"],"ag.T":"2"},"fb":{"f4":["1","2"],"Y":["2"],"Y.T":"2"},"f1":{"af":["1"]},"dL":{"ag":["2"],"ag.T":"2"},"eT":{"Y":["2"],"Y.T":"2"},"dM":{"fn":["1","2"]},"iS":{"v":[]},"ih":{"v":[]},"iG":{"v":[]},"dV":{"U":[]},"cO":{"S":["1","2"],"aq":["1","2"],"S.K":"1","S.V":"2"},"dG":{"cO":["1","2"],"S":["1","2"],"aq":["1","2"],"S.K":"1","S.V":"2"},"cP":{"q":["1"],"e":["1"],"e.E":"1"},"f9":{"fj":["1"],"dp":["1"],"q":["1"],"e":["1"]},"cB":{"e":["1"],"e.E":"1"},"w":{"o":["1"],"q":["1"],"e":["1"]},"S":{"aq":["1","2"]},"fa":{"q":["2"],"e":["2"],"e.E":"2"},"dp":{"q":["1"],"e":["1"]},"fj":{"dp":["1"],"q":["1"],"e":["1"]},"fJ":{"ct":["p","o"]},"iP":{"cv":["p","o"]},"fK":{"cv":["p","o"]},"fN":{"ct":["o","p"]},"fO":{"cv":["o","p"]},"h5":{"ct":["p","o"]},"hZ":{"ct":["p","o"]},"i_":{"cv":["p","o"]},"F":{"b2":[]},"a":{"b2":[]},"o":{"q":["1"],"e":["1"]},"hG":{"eu":[]},"fL":{"M":[]},"bM":{"M":[]},"bc":{"M":[]},"dk":{"M":[]},"en":{"M":[]},"eN":{"M":[]},"hR":{"M":[]},"aI":{"M":[]},"fT":{"M":[]},"hC":{"M":[]},"eI":{"M":[]},"im":{"a9":[]},"aF":{"a9":[]},"he":{"a9":[],"M":[]},"dQ":{"T":[]},"fu":{"hV":[]},"b8":{"hV":[]},"ii":{"hV":[]},"hA":{"a9":[]},"d4":{"af":["1"]},"fU":{"a9":[]},"h2":{"a9":[]},"as":{"c_":[]},"bg":{"c_":[]},"bq":{"aA":[]},"bG":{"aA":[]},"aQ":{"bI":[]},"bp":{"c_":[]},"bx":{"c_":[]},"dh":{"aA":[]},"bX":{"aA":[]},"c3":{"aA":[]},"c5":{"aA":[]},"bW":{"aA":[]},"c6":{"aA":[]},"c4":{"aA":[]},"bJ":{"bI":[]},"eb":{"a9":[]},"ib":{"ar":[]},"iO":{"hQ":[],"ar":[]},"fm":{"hQ":[],"ar":[]},"h_":{"ar":[]},"ic":{"ar":[]},"f3":{"ar":[]},"dH":{"ar":[]},"iu":{"hQ":[],"ar":[]},"hm":{"ar":[]},"dz":{"a9":[]},"i2":{"ar":[]},"iR":{"cD":["ov"],"cD.0":"ov"},"hD":{"a9":[]},"c9":{"a9":[]},"fX":{"ov":[]},"i0":{"w":["d?"],"o":["d?"],"q":["d?"],"e":["d?"],"w.E":"d?"},"dr":{"d3":[]},"hb":{"at":[]},"ir":{"dw":[],"aB":[]},"bs":{"S":["p","@"],"aq":["p","@"],"S.K":"p","S.V":"@"},"hH":{"w":["bs"],"o":["bs"],"q":["bs"],"e":["bs"],"w.E":"bs"},"aJ":{"a9":[]},"fQ":{"at":[]},"fP":{"dw":[],"aB":[]},"cJ":{"az":["cJ"],"az.E":"cJ"},"bO":{"oM":[]},"cc":{"oL":[]},"dx":{"w":["bO"],"o":["bO"],"q":["bO"],"e":["bO"],"w.E":"bO"},"e8":{"Y":["1"],"Y.T":"1"},"dy":{"at":[]},"i3":{"dw":[],"aB":[]},"b4":{"bC":[]},"R":{"bC":[]},"aX":{"R":[],"bC":[]},"d7":{"at":[]},"av":{"az":["av"]},"is":{"dw":[],"aB":[]},"f5":{"av":[],"az":["av"],"az.E":"av"},"eZ":{"av":[],"az":["av"],"az.E":"av"},"dC":{"av":[],"az":["av"],"az.E":"av"},"dU":{"av":[],"az":["av"],"az.E":"av"},"dq":{"at":[]},"iJ":{"dw":[],"aB":[]},"bn":{"T":[]},"hn":{"a2":[],"T":[]},"a2":{"T":[]},"bt":{"N":[]},"ed":{"eK":["1"]},"eX":{"Y":["1"],"Y.T":"1"},"eW":{"af":["1"]},"em":{"eK":["1"]},"f7":{"af":["1"]},"bh":{"dt":["a"],"w":["a"],"o":["a"],"q":["a"],"e":["a"],"w.E":"a"},"dt":{"w":["1"],"o":["1"],"q":["1"],"e":["1"]},"it":{"dt":["a"],"w":["a"],"o":["a"],"q":["a"],"e":["a"]},"f2":{"Y":["1"],"Y.T":"1"},"ku":{"o":["a"],"q":["a"],"e":["a"]},"aZ":{"o":["a"],"q":["a"],"e":["a"]},"lC":{"o":["a"],"q":["a"],"e":["a"]},"ks":{"o":["a"],"q":["a"],"e":["a"]},"lA":{"o":["a"],"q":["a"],"e":["a"]},"kt":{"o":["a"],"q":["a"],"e":["a"]},"lB":{"o":["a"],"q":["a"],"e":["a"]},"k6":{"o":["F"],"q":["F"],"e":["F"]},"k7":{"o":["F"],"q":["F"],"e":["F"]}}')) -A.vK(v.typeUniverse,JSON.parse('{"cI":1,"hK":1,"hL":1,"h4":1,"eo":1,"el":1,"hT":1,"du":1,"fy":2,"hp":1,"db":1,"dg":1,"af":1,"iL":1,"eB":2,"hN":2,"iM":1,"ia":1,"dP":1,"ij":1,"dD":1,"fg":1,"f_":1,"dO":1,"f1":1,"h8":1,"d4":1,"fZ":1,"hq":1,"hz":1,"hU":2,"u2":1,"eW":1,"f7":1,"il":1}')) -var u={v:"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u03f6\x00\u0404\u03f4 \u03f4\u03f6\u01f6\u01f6\u03f6\u03fc\u01f4\u03ff\u03ff\u0584\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u05d4\u01f4\x00\u01f4\x00\u0504\u05c4\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0400\x00\u0400\u0200\u03f7\u0200\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0200\u0200\u0200\u03f7\x00",q:"===== asynchronous gap ===========================\n",l:"Cannot extract a file path from a URI with a fragment component",y:"Cannot extract a file path from a URI with a query component",j:"Cannot extract a non-Windows file path from a file URI with an authority",o:"Cannot fire new event. Controller is already firing an event",c:"Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",D:"Tried to operate on a released prepared statement"} -var t=(function rtii(){var s=A.aw -return{b9:s("u2"),cO:s("e8>"),w:s("cq"),fd:s("ou"),g1:s("bV<@>"),eT:s("d3"),ed:s("eg"),gw:s("eh"),Q:s("q<@>"),p:s("b4"),C:s("M"),g8:s("a9"),G:s("R"),h4:s("k6"),gN:s("k7"),B:s("N"),b8:s("yj"),aQ:s("C"),bF:s("C"),cG:s("C"),eY:s("C"),bd:s("d7"),dQ:s("ks"),an:s("kt"),gj:s("ku"),hf:s("e<@>"),b:s("u"),cf:s("u"),e:s("u"),fG:s("u>"),fk:s("u>"),W:s("u"),gP:s("u>"),gz:s("u>"),d:s("u>"),f:s("u"),L:s("u<+(bP,p)>"),bb:s("u"),s:s("u

"),be:s("u"),J:s("u"),gQ:s("u"),n:s("u"),gn:s("u<@>"),t:s("u"),dL:s("u"),c:s("u"),d4:s("u"),r:s("u"),Y:s("u"),bT:s("u<~()>"),aP:s("ay<@>"),T:s("er"),m:s("y"),g:s("aV"),aU:s("aW<@>"),aX:s("a1"),bN:s("cB"),au:s("cB"),e9:s("o>"),cl:s("o"),aS:s("o>"),q:s("o

"),j:s("o<@>"),I:s("o"),ee:s("o"),g6:s("aq"),eO:s("aq<@,@>"),M:s("aG"),fe:s("E"),do:s("E"),fJ:s("c_"),cb:s("bC"),fK:s("aX"),u:s("dd"),ha:s("df"),aV:s("c0"),eB:s("aY"),Z:s("c1"),bw:s("bG"),P:s("G"),K:s("d"),x:s("ar"),aj:s("dj"),gT:s("yo"),bQ:s("+()"),e1:s("+(y?,y)"),cV:s("+(d?,a)"),cz:s("hG"),al:s("as"),cc:s("bI"),bJ:s("eE

"),fE:s("dm"),fL:s("c7"),gW:s("dq"),cB:s("eG

"),f_:s("c9"),l:s("T"),a7:s("hM"),N:s("p"),aF:s("eM"),a:s("a2"),v:s("hQ"),dm:s("L"),eK:s("bM"),h7:s("lA"),ai:s("lB"),fQ:s("bh"),go:s("lC"),E:s("aZ"),ak:s("cH"),dD:s("hV"),ei:s("eO"),gh:s("dw"),ab:s("i4"),aT:s("dy"),U:s("aK

"),eJ:s("eP

"),R:s("ad"),dx:s("ad"),bv:s("ad"),bi:s("a6"),co:s("a6"),fu:s("a6"),h:s("a6<~>"),V:s("cM"),fF:s("f2"),et:s("m"),a9:s("m"),k:s("m"),eI:s("m<@>"),gR:s("m"),fX:s("m"),D:s("m<~>"),hg:s("dG"),cT:s("dK"),aR:s("iA"),eg:s("iD"),dn:s("fo<~>"),eC:s("Z"),fa:s("Z"),F:s("Z<~>"),y:s("J"),i:s("F"),z:s("@"),bI:s("@(d)"),_:s("@(d,T)"),S:s("a"),eH:s("C?"),A:s("y?"),dE:s("c1?"),X:s("d?"),ah:s("aA?"),O:s("bI?"),dk:s("p?"),fN:s("bh?"),aD:s("aZ?"),a6:s("J?"),cD:s("F?"),h6:s("a?"),cg:s("b2?"),o:s("b2"),H:s("~"),d5:s("~(d)"),da:s("~(d,T)")}})();(function constants(){var s=hunkHelpers.makeConstList -B.av=J.hf.prototype -B.c=J.u.prototype -B.b=J.eq.prototype -B.aw=J.d8.prototype -B.a=J.bY.prototype -B.ax=J.aV.prototype -B.ay=J.a1.prototype -B.aJ=A.ev.prototype -B.e=A.c1.prototype -B.V=J.hE.prototype -B.B=J.cH.prototype -B.ad=new A.cp(0) -B.k=new A.cp(1) -B.n=new A.cp(2) -B.F=new A.cp(3) -B.bw=new A.cp(-1) -B.ae=new A.fK(127) -B.u=new A.ep(A.xR(),A.aw("ep")) -B.af=new A.fJ() -B.bx=new A.fO() -B.ag=new A.fN() -B.v=new A.eb() -B.ah=new A.fU() -B.by=new A.fZ() -B.G=new A.h1() -B.H=new A.h4() -B.h=new A.b4() -B.ai=new A.he() -B.I=function getTagFallback(o) { - var s = Object.prototype.toString.call(o); - return s.substring(8, s.length - 1); -} -B.aj=function() { - var toStringFunction = Object.prototype.toString; - function getTag(o) { - var s = toStringFunction.call(o); - return s.substring(8, s.length - 1); - } - function getUnknownTag(object, tag) { - if (/^HTML[A-Z].*Element$/.test(tag)) { - var name = toStringFunction.call(object); - if (name == "[object Object]") return null; - return "HTMLElement"; - } - } - function getUnknownTagGenericBrowser(object, tag) { - if (object instanceof HTMLElement) return "HTMLElement"; - return getUnknownTag(object, tag); - } - function prototypeForTag(tag) { - if (typeof window == "undefined") return null; - if (typeof window[tag] == "undefined") return null; - var constructor = window[tag]; - if (typeof constructor != "function") return null; - return constructor.prototype; - } - function discriminator(tag) { return null; } - var isBrowser = typeof HTMLElement == "function"; - return { - getTag: getTag, - getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag, - prototypeForTag: prototypeForTag, - discriminator: discriminator }; -} -B.ao=function(getTagFallback) { - return function(hooks) { - if (typeof navigator != "object") return hooks; - var userAgent = navigator.userAgent; - if (typeof userAgent != "string") return hooks; - if (userAgent.indexOf("DumpRenderTree") >= 0) return hooks; - if (userAgent.indexOf("Chrome") >= 0) { - function confirm(p) { - return typeof window == "object" && window[p] && window[p].name == p; - } - if (confirm("Window") && confirm("HTMLElement")) return hooks; - } - hooks.getTag = getTagFallback; - }; -} -B.ak=function(hooks) { - if (typeof dartExperimentalFixupGetTag != "function") return hooks; - hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag); -} -B.an=function(hooks) { - if (typeof navigator != "object") return hooks; - var userAgent = navigator.userAgent; - if (typeof userAgent != "string") return hooks; - if (userAgent.indexOf("Firefox") == -1) return hooks; - var getTag = hooks.getTag; - var quickMap = { - "BeforeUnloadEvent": "Event", - "DataTransfer": "Clipboard", - "GeoGeolocation": "Geolocation", - "Location": "!Location", - "WorkerMessageEvent": "MessageEvent", - "XMLDocument": "!Document"}; - function getTagFirefox(o) { - var tag = getTag(o); - return quickMap[tag] || tag; - } - hooks.getTag = getTagFirefox; -} -B.am=function(hooks) { - if (typeof navigator != "object") return hooks; - var userAgent = navigator.userAgent; - if (typeof userAgent != "string") return hooks; - if (userAgent.indexOf("Trident/") == -1) return hooks; - var getTag = hooks.getTag; - var quickMap = { - "BeforeUnloadEvent": "Event", - "DataTransfer": "Clipboard", - "HTMLDDElement": "HTMLElement", - "HTMLDTElement": "HTMLElement", - "HTMLPhraseElement": "HTMLElement", - "Position": "Geoposition" - }; - function getTagIE(o) { - var tag = getTag(o); - var newTag = quickMap[tag]; - if (newTag) return newTag; - if (tag == "Object") { - if (window.DataView && (o instanceof window.DataView)) return "DataView"; - } - return tag; - } - function prototypeForTagIE(tag) { - var constructor = window[tag]; - if (constructor == null) return null; - return constructor.prototype; - } - hooks.getTag = getTagIE; - hooks.prototypeForTag = prototypeForTagIE; -} -B.al=function(hooks) { - var getTag = hooks.getTag; - var prototypeForTag = hooks.prototypeForTag; - function getTagFixed(o) { - var tag = getTag(o); - if (tag == "Document") { - if (!!o.xmlVersion) return "!Document"; - return "!HTMLDocument"; - } - return tag; - } - function prototypeForTagFixed(tag) { - if (tag == "Document") return null; - return prototypeForTag(tag); - } - hooks.getTag = getTagFixed; - hooks.prototypeForTag = prototypeForTagFixed; -} -B.J=function(hooks) { return hooks; } - -B.m=new A.hq() -B.ap=new A.kG() -B.aq=new A.hy() -B.ar=new A.hC() -B.f=new A.kS() -B.j=new A.hZ() -B.i=new A.i_() -B.w=new A.my() -B.d=new A.iG() -B.as=new A.ny() -B.K=new A.by(0) -B.L=new A.d6("/database",0,"database") -B.M=new A.d6("/database-journal",1,"journal") -B.at=new A.aF("Unknown tag",null,null) -B.au=new A.aF("Cannot read message",null,null) -B.az=s([11],t.t) -B.D=new A.bP(0,"opfs") -B.Y=new A.cd(0,"opfsShared") -B.Z=new A.cd(1,"opfsLocks") -B.a_=new A.bP(1,"indexedDb") -B.r=new A.cd(2,"sharedIndexedDb") -B.C=new A.cd(3,"unsafeIndexedDb") -B.bj=new A.cd(4,"inMemory") -B.aA=s([B.Y,B.Z,B.r,B.C,B.bj],A.aw("u")) -B.b9=new A.dv(0,"insert") -B.ba=new A.dv(1,"update") -B.bb=new A.dv(2,"delete") -B.N=s([B.b9,B.ba,B.bb],A.aw("u")) -B.aB=s([B.D,B.a_],A.aw("u")) -B.x=s([],t.W) -B.aC=s([],t.gz) -B.aD=s([],t.f) -B.y=s([],t.s) -B.o=s([],t.c) -B.z=s([],t.L) -B.aF=s([B.L,B.M],A.aw("u")) -B.a0=new A.ad(A.pz(),A.ba(),0,"xAccess",t.bv) -B.a1=new A.ad(A.pz(),A.bT(),1,"xDelete",A.aw("ad")) -B.ac=new A.ad(A.pz(),A.ba(),2,"xOpen",t.bv) -B.aa=new A.ad(A.ba(),A.ba(),3,"xRead",t.dx) -B.a5=new A.ad(A.ba(),A.bT(),4,"xWrite",t.R) -B.a6=new A.ad(A.ba(),A.bT(),5,"xSleep",t.R) -B.a7=new A.ad(A.ba(),A.bT(),6,"xClose",t.R) -B.ab=new A.ad(A.ba(),A.ba(),7,"xFileSize",t.dx) -B.a8=new A.ad(A.ba(),A.bT(),8,"xSync",t.R) -B.a9=new A.ad(A.ba(),A.bT(),9,"xTruncate",t.R) -B.a3=new A.ad(A.ba(),A.bT(),10,"xLock",t.R) -B.a4=new A.ad(A.ba(),A.bT(),11,"xUnlock",t.R) -B.a2=new A.ad(A.bT(),A.bT(),12,"stopServer",A.aw("ad")) -B.aG=s([B.a0,B.a1,B.ac,B.aa,B.a5,B.a6,B.a7,B.ab,B.a8,B.a9,B.a3,B.a4,B.a2],A.aw("u>")) -B.l=new A.c8(0,"sqlite") -B.aQ=new A.c8(1,"mysql") -B.aR=new A.c8(2,"postgres") -B.aS=new A.c8(3,"duckdb") -B.aT=new A.c8(4,"mariadb") -B.O=s([B.l,B.aQ,B.aR,B.aS,B.aT],A.aw("u")) -B.aU=new A.cE(0,"custom") -B.aV=new A.cE(1,"deleteOrUpdate") -B.aW=new A.cE(2,"insert") -B.aX=new A.cE(3,"select") -B.P=s([B.aU,B.aV,B.aW,B.aX],A.aw("u")) -B.R=new A.c2(0,"beginTransaction") -B.aK=new A.c2(1,"commit") -B.aL=new A.c2(2,"rollback") -B.S=new A.c2(3,"startExclusive") -B.T=new A.c2(4,"endExclusive") -B.Q=s([B.R,B.aK,B.aL,B.S,B.T],A.aw("u")) -B.U={} -B.aH=new A.cu(B.U,[],A.aw("cu")) -B.A=new A.dh(0,"terminateAll") -B.bz=new A.kH(2,"readWriteCreate") -B.p=new A.cC(0,0,"legacy") -B.aM=new A.cC(1,1,"v1") -B.aN=new A.cC(2,2,"v2") -B.aO=new A.cC(3,3,"v3") -B.q=new A.cC(4,4,"v4") -B.aE=s([],t.d) -B.aP=new A.bJ(B.aE) -B.W=new A.hO("drift.runtime.cancellation") -B.aY=A.bm("cq") -B.aZ=A.bm("ou") -B.b_=A.bm("k6") -B.b0=A.bm("k7") -B.b1=A.bm("ks") -B.b2=A.bm("kt") -B.b3=A.bm("ku") -B.b4=A.bm("d") -B.b5=A.bm("lA") -B.b6=A.bm("lB") -B.b7=A.bm("lC") -B.b8=A.bm("aZ") -B.bc=new A.aJ(10) -B.bd=new A.aJ(12) -B.be=new A.aJ(14) -B.bf=new A.aJ(2570) -B.bg=new A.aJ(3850) -B.bh=new A.aJ(522) -B.X=new A.aJ(778) -B.bi=new A.aJ(8) -B.t=new A.dQ("") -B.bk=new A.nz(B.d,A.xb()) -B.bl=new A.nA(B.d,A.xc()) -B.bm=new A.nB(B.d,A.xd()) -B.bn=new A.iT(B.d,A.xe()) -B.bo=new A.nC(B.d,A.xf()) -B.bp=new A.nD(B.d,A.xg()) -B.bq=new A.nE(B.d,A.xh()) -B.br=new A.nF(B.d,A.xi()) -B.bs=new A.nH(B.d,A.xk()) -B.bt=new A.nI(B.d,A.xl()) -B.bu=new A.nG(B.d,A.xj()) -B.bv=new A.iU(B.d,A.xm()) -B.aI=new A.cu(B.U,[],A.aw("cu")) -B.E=new A.iV(B.d,B.aI)})();(function staticFields(){$.n3=null -$.cV=A.f([],t.f) -$.wL=null -$.qg=null -$.pP=null -$.pO=null -$.rS=null -$.rK=null -$.t0=null -$.o3=null -$.ob=null -$.pq=null -$.n7=A.f([],A.aw("u?>")) -$.dZ=null -$.fB=null -$.fC=null -$.pf=!1 -$.n=B.d -$.n9=null -$.qP=null -$.qQ=null -$.qR=null -$.qS=null -$.oX=A.mr("_lastQuoRemDigits") -$.oY=A.mr("_lastQuoRemUsed") -$.eS=A.mr("_lastRemUsed") -$.oZ=A.mr("_lastRem_nsh") -$.qI="" -$.qJ=null -$.ro=null -$.nO=null})();(function lazyInitializers(){var s=hunkHelpers.lazyFinal,r=hunkHelpers.lazy -s($,"yf","t7",()=>A.o5("_$dart_dartClosure")) -s($,"ye","cZ",()=>A.o5("_$dart_dartClosure_dartJSInterop")) -s($,"zk","tR",()=>B.d.bd(new A.oe(),A.aw("C<~>"))) -s($,"z5","tI",()=>A.f([new J.hg()],A.aw("u"))) -s($,"yu","td",()=>A.bN(A.lz({ -toString:function(){return"$receiver$"}}))) -s($,"yv","te",()=>A.bN(A.lz({$method$:null, -toString:function(){return"$receiver$"}}))) -s($,"yw","tf",()=>A.bN(A.lz(null))) -s($,"yx","tg",()=>A.bN(function(){var $argumentsExpr$="$arguments$" -try{null.$method$($argumentsExpr$)}catch(q){return q.message}}())) -s($,"yA","tj",()=>A.bN(A.lz(void 0))) -s($,"yB","tk",()=>A.bN(function(){var $argumentsExpr$="$arguments$" -try{(void 0).$method$($argumentsExpr$)}catch(q){return q.message}}())) -s($,"yz","ti",()=>A.bN(A.qE(null))) -s($,"yy","th",()=>A.bN(function(){try{null.$method$}catch(q){return q.message}}())) -s($,"yD","tm",()=>A.bN(A.qE(void 0))) -s($,"yC","tl",()=>A.bN(function(){try{(void 0).$method$}catch(q){return q.message}}())) -s($,"yG","pD",()=>A.vf()) -s($,"yl","co",()=>$.tR()) -s($,"yk","ta",()=>A.vr(!1,B.d,t.y)) -s($,"yT","tw",()=>A.qd(4096)) -s($,"yR","tu",()=>new A.nv().$0()) -s($,"yS","tv",()=>new A.nu().$0()) -s($,"yH","to",()=>A.uK(A.fA(A.f([-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-2,-2,-2,-2,62,-2,62,-2,63,52,53,54,55,56,57,58,59,60,61,-2,-2,-2,-1,-2,-2,-2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-2,-2,-2,-2,63,-2,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-2,-2,-2,-2,-2],t.t)))) -s($,"yO","bb",()=>A.eR(0)) -s($,"yM","d_",()=>A.eR(1)) -s($,"yN","tr",()=>A.eR(2)) -s($,"yK","pF",()=>$.d_().al(0)) -s($,"yI","pE",()=>A.eR(1e4)) -r($,"yL","tq",()=>A.H("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$",!1,!1,!1,!1)) -s($,"yJ","tp",()=>A.qd(8)) -s($,"yP","ts",()=>typeof FinalizationRegistry=="function"?FinalizationRegistry:null) -s($,"yQ","tt",()=>A.H("^[\\-\\.0-9A-Z_a-z~]*$",!0,!1,!1,!1)) -s($,"z1","op",()=>A.pt(B.b4)) -s($,"z3","tG",()=>Symbol("jsBoxedDartObjectProperty")) -s($,"yn","tb",()=>{var q=new A.n2(new DataView(new ArrayBuffer(A.wh(8)))) -q.i0() -return q}) -s($,"yF","pC",()=>A.ui(B.aB,A.aw("bP"))) -s($,"zm","tS",()=>A.pS($.fH())) -s($,"zf","pG",()=>new A.fV($.pB(),null)) -s($,"yr","tc",()=>new A.kJ(A.H("/",!0,!1,!1,!1),A.H("[^/]$",!0,!1,!1,!1),A.H("^/",!0,!1,!1,!1))) -s($,"yt","fH",()=>new A.m8(A.H("[/\\\\]",!0,!1,!1,!1),A.H("[^/\\\\]$",!0,!1,!1,!1),A.H("^(\\\\\\\\[^\\\\]+\\\\[^\\\\/]+|[a-zA-Z]:[/\\\\])",!0,!1,!1,!1),A.H("^[/\\\\](?![/\\\\])",!0,!1,!1,!1))) -s($,"ys","fG",()=>new A.lE(A.H("/",!0,!1,!1,!1),A.H("(^[a-zA-Z][-+.a-zA-Z\\d]*://|[^/])$",!0,!1,!1,!1),A.H("[a-zA-Z][-+.a-zA-Z\\d]*://[^/]*",!0,!1,!1,!1),A.H("^/",!0,!1,!1,!1))) -s($,"yq","pB",()=>A.v_()) -s($,"yd","t6",()=>$.d_().aG(0,63).al(0)) -s($,"yc","t5",()=>{var q=$.d_() -return q.aG(0,63).cB(0,q)}) -s($,"yb","fF",()=>$.tb()) -s($,"yE","tn",()=>new A.h8(new WeakMap())) -s($,"z6","tJ",()=>A.uF(A.f([A.qw("files"),A.qw("blocks")],t.s))) -s($,"yg","oo",()=>{var q,p,o=A.ap(t.N,A.aw("d6")) -for(q=0;q<2;++q){p=B.aF[q] -o.t(0,p.c,p)}return o}) -s($,"zd","tQ",()=>A.H("^#\\d+\\s+(\\S.*) \\((.+?)((?::\\d+){0,2})\\)$",!0,!1,!1,!1)) -s($,"z8","tL",()=>A.H("^\\s*at (?:(\\S.*?)(?: \\[as [^\\]]+\\])? \\((.*)\\)|(.*))$",!0,!1,!1,!1)) -s($,"z9","tM",()=>A.H("^(.*?):(\\d+)(?::(\\d+))?$|native$",!0,!1,!1,!1)) -s($,"zc","tP",()=>A.H("^\\s*at (?:(?.+) )?(?:\\(?(?:(?\\S+):wasm-function\\[(?\\d+)\\]\\:0x(?[0-9a-fA-F]+))\\)?)$",!0,!1,!1,!1)) -s($,"z7","tK",()=>A.H("^eval at (?:\\S.*?) \\((.*)\\)(?:, .*?:\\d+:\\d+)?$",!0,!1,!1,!1)) -s($,"yV","ty",()=>A.H("(\\S+)@(\\S+) line (\\d+) >.* (Function|eval):\\d+:\\d+",!0,!1,!1,!1)) -s($,"yX","tA",()=>A.H("^(?:([^@(/]*)(?:\\(.*\\))?((?:/[^/]*)*)(?:\\(.*\\))?@)?(.*?):(\\d*)(?::(\\d*))?$",!0,!1,!1,!1)) -s($,"yZ","tC",()=>A.H("^(?.*?)@(?:(?\\S+).*?:wasm-function\\[(?\\d+)\\]:0x(?[0-9a-fA-F]+))$",!0,!1,!1,!1)) -s($,"z4","tH",()=>A.H("^.*?wasm-function\\[(?.*)\\]@\\[wasm code\\]$",!0,!1,!1,!1)) -s($,"z_","tD",()=>A.H("^(\\S+)(?: (\\d+)(?::(\\d+))?)?\\s+([^\\d].*)$",!0,!1,!1,!1)) -s($,"yU","tx",()=>A.H("<(|[^>]+)_async_body>",!0,!1,!1,!1)) -s($,"z2","tF",()=>A.H("^\\.",!0,!1,!1,!1)) -s($,"yh","t8",()=>A.H("^[a-zA-Z][-+.a-zA-Z\\d]*://",!0,!1,!1,!1)) -s($,"yi","t9",()=>A.H("^([a-zA-Z]:[\\\\/]|\\\\\\\\)",!0,!1,!1,!1)) -s($,"za","tN",()=>A.H("(?:^|\\n) ?at ",!0,!1,!1,!1)) -s($,"zb","tO",()=>A.H(" ?at ",!0,!1,!1,!1)) -s($,"yW","tz",()=>A.H("@\\S+ line \\d+ >.* (Function|eval):\\d+:\\d+",!0,!1,!1,!1)) -s($,"yY","tB",()=>A.H("^(([.0-9A-Za-z_$/<]|\\(.*\\))*@)?[^\\s]*:\\d*$",!0,!1,!0,!1)) -s($,"z0","tE",()=>A.H("^[^\\s<][^\\s]*( \\d+(:\\d+)?)?[ \\t]+[^\\s]+$",!0,!1,!0,!1)) -s($,"zl","pH",()=>A.H("^\\n?$",!0,!1,!0,!1))})();(function nativeSupport(){!function(){var s=function(a){var m={} -m[a]=1 -return Object.keys(hunkHelpers.convertToFastObject(m))[0]} -v.getIsolateTag=function(a){return s("___dart_"+a+v.isolateTag)} -var r="___dart_isolate_tags_" -var q=Object[r]||(Object[r]=Object.create(null)) -var p="_ZxYxX" -for(var o=0;;o++){var n=s(p+"_"+o+"_") -if(!(n in q)){q[n]=1 -v.isolateTag=n -break}}v.dispatchPropertyName=v.getIsolateTag("dispatch_record")}() -hunkHelpers.setOrUpdateInterceptorsByTag({SharedArrayBuffer:A.de,ArrayBuffer:A.dd,ArrayBufferView:A.ew,DataView:A.ev,Float32Array:A.hs,Float64Array:A.ht,Int16Array:A.hu,Int32Array:A.df,Int8Array:A.hv,Uint16Array:A.hw,Uint32Array:A.hx,Uint8ClampedArray:A.ex,CanvasPixelArray:A.ex,Uint8Array:A.c1}) -hunkHelpers.setOrUpdateLeafTags({SharedArrayBuffer:true,ArrayBuffer:true,ArrayBufferView:false,DataView:true,Float32Array:true,Float64Array:true,Int16Array:true,Int32Array:true,Int8Array:true,Uint16Array:true,Uint32Array:true,Uint8ClampedArray:true,CanvasPixelArray:true,Uint8Array:false}) -A.dg.$nativeSuperclassTag="ArrayBufferView" -A.fc.$nativeSuperclassTag="ArrayBufferView" -A.fd.$nativeSuperclassTag="ArrayBufferView" -A.c0.$nativeSuperclassTag="ArrayBufferView" -A.fe.$nativeSuperclassTag="ArrayBufferView" -A.ff.$nativeSuperclassTag="ArrayBufferView" -A.aY.$nativeSuperclassTag="ArrayBufferView"})() -Function.prototype.$0=function(){return this()} -Function.prototype.$1=function(a){return this(a)} -Function.prototype.$2=function(a,b){return this(a,b)} -Function.prototype.$1$1=function(a){return this(a)} -Function.prototype.$3=function(a,b,c){return this(a,b,c)} -Function.prototype.$4=function(a,b,c,d){return this(a,b,c,d)} -Function.prototype.$3$1=function(a){return this(a)} -Function.prototype.$2$1=function(a){return this(a)} -Function.prototype.$3$3=function(a,b,c){return this(a,b,c)} -Function.prototype.$2$2=function(a,b){return this(a,b)} -Function.prototype.$2$3=function(a,b,c){return this(a,b,c)} -Function.prototype.$1$2=function(a,b){return this(a,b)} -Function.prototype.$5=function(a,b,c,d,e){return this(a,b,c,d,e)} -Function.prototype.$3$4=function(a,b,c,d){return this(a,b,c,d)} -Function.prototype.$2$4=function(a,b,c,d){return this(a,b,c,d)} -Function.prototype.$1$4=function(a,b,c,d){return this(a,b,c,d)} -Function.prototype.$3$6=function(a,b,c,d,e,f){return this(a,b,c,d,e,f)} -Function.prototype.$2$5=function(a,b,c,d,e){return this(a,b,c,d,e)} -Function.prototype.$1$0=function(){return this()} -convertAllToFastObject(w) -convertToFastObject($);(function(a){if(typeof document==="undefined"){a(null) -return}if(typeof document.currentScript!="undefined"){a(document.currentScript) -return}var s=document.scripts -function onLoad(b){for(var q=0;q url.pathname.startsWith("/api/"); - -self.addEventListener("install", (event) => { - // Take over as soon as this version is ready; there is no migration to stage. - event.waitUntil(self.skipWaiting()); -}); - -self.addEventListener("activate", (event) => { - event.waitUntil( - (async () => { - const names = await caches.keys(); - await Promise.all(names.filter((name) => name !== CACHE).map((name) => caches.delete(name))); - await self.clients.claim(); - })(), - ); -}); - -self.addEventListener("fetch", (event) => { - const request = event.request; - if (request.method !== "GET") return; - const url = new URL(request.url); - if (url.origin !== self.location.origin || isApi(url)) return; - - // A navigation is the app opening. Prefer the network so a deploy is picked - // up, and fall back to whatever shell was cached, which is what makes a cold - // start offline work at all. - if (request.mode === "navigate") { - event.respondWith( - (async () => { - try { - const response = await fetch(request); - const cache = await caches.open(CACHE); - cache.put(request, response.clone()); - return response; - } catch (error) { - const cached = (await caches.match(request)) || (await caches.match("/")); - if (cached) return cached; - throw error; - } - })(), - ); - return; - } - - // Everything else the shell is built from: answer from the cache instantly and - // refresh it in the background, so a release lands on the next load. - event.respondWith( - (async () => { - const cached = await caches.match(request); - const network = fetch(request) - .then(async (response) => { - if (response.ok) { - const cache = await caches.open(CACHE); - cache.put(request, response.clone()); - } - return response; - }) - .catch((error) => { - if (cached) return cached; - throw error; - }); - return cached || network; - })(), - ); -}); diff --git a/server/packages/create-eigen-game/templates/app-overlay/web/firebase-messaging-sw.js.template b/server/packages/create-eigen-game/templates/app-overlay/web/firebase-messaging-sw.js.template index df24bbd8..6152ab39 100644 --- a/server/packages/create-eigen-game/templates/app-overlay/web/firebase-messaging-sw.js.template +++ b/server/packages/create-eigen-game/templates/app-overlay/web/firebase-messaging-sw.js.template @@ -1,7 +1,7 @@ // Keep this version aligned with the Firebase JS SDK supported by the // firebase_core_web version resolved by the Flutter app. -importScripts("https://www.gstatic.com/firebasejs/12.15.0/firebase-app-compat.js"); -importScripts("https://www.gstatic.com/firebasejs/12.15.0/firebase-messaging-compat.js"); +importScripts("https://www.gstatic.com/firebasejs/12.19.0/firebase-app-compat.js"); +importScripts("https://www.gstatic.com/firebasejs/12.19.0/firebase-messaging-compat.js"); importScripts("firebase-config.js"); // `firebase:configure` generates this public configuration from the Web app diff --git a/server/packages/create-eigen-game/templates/app-overlay/web/flutter_bootstrap.js.template b/server/packages/create-eigen-game/templates/app-overlay/web/flutter_bootstrap.js.template index aaf8afd7..0bbd8057 100644 --- a/server/packages/create-eigen-game/templates/app-overlay/web/flutter_bootstrap.js.template +++ b/server/packages/create-eigen-game/templates/app-overlay/web/flutter_bootstrap.js.template @@ -1,30 +1,43 @@ {{flutter_js}} {{flutter_build_config}} -(async () => { - if ("serviceWorker" in navigator) { - await navigator.serviceWorker - .register("firebase-messaging-sw.js", { - scope: "/firebase-cloud-messaging-push-scope", - }) - .catch((error) => { - console.warn( - "Firebase Messaging service worker registration failed", - error, - ); - }); - } +// Flutter starts at once. Neither worker below is anything this page waits on, +// so they register beside it rather than ahead of it. +_flutter.loader.load(); - if ("serviceWorker" in navigator) { - // The app shell's own cache, registered at the root scope so it can answer - // a cold start with no network. Separate from the messaging worker above, - // which owns only its push scope. - await navigator.serviceWorker - .register("eigen_offline_sw.js", { scope: "/" }) - .catch((error) => { - console.warn("Offline shell service worker registration failed", error); - }); - } +if ("serviceWorker" in navigator) { + // The app's own worker, generated by Workbox (workbox-config.cjs): the + // precached build, which is what lets the app open with no network. + navigator.serviceWorker.register("sw.js").catch((error) => { + console.warn("App service worker registration failed", error); + }); + // Firebase Messaging's worker, which owns only its push scope. + navigator.serviceWorker.register("firebase-messaging-sw.js", { scope: "/firebase-cloud-messaging-push-scope" }).catch((error) => { + console.warn("Firebase Messaging service worker registration failed", error); + }); +} - _flutter.loader.load(); -})(); +// CanvasKit and the Firebase JS SDK load from Google's CDN, which the app's +// worker caches as they pass through it. A first visit fetches them before that +// worker controls the page, so the page copies what it loaded into the same +// cache ("eigen-cdn" in workbox-config.cjs), and drops versions of each it no +// longer loads. Without this, the first visit would not open offline. +if ("caches" in self && "PerformanceObserver" in self) { + const cdn = /^https:\/\/www\.gstatic\.com\/(flutter-canvaskit|firebasejs)\/[^/]+\//; + new PerformanceObserver(async (entries) => { + for (const { name } of entries.getEntries()) { + const loaded = cdn.exec(name); + if (!loaded) continue; + try { + const cache = await caches.open("eigen-cdn"); + if (!(await cache.match(name))) await cache.add(name); + for (const request of await cache.keys()) { + const cached = cdn.exec(request.url); + if (cached && cached[1] === loaded[1] && cached[0] !== loaded[0]) await cache.delete(request); + } + } catch { + // Only a later offline start is at stake, and the next load tries again. + } + } + }).observe({ type: "resource", buffered: true }); +} diff --git a/server/packages/create-eigen-game/templates/app-overlay/web/sqlite3.wasm b/server/packages/create-eigen-game/templates/app-overlay/web/sqlite3.wasm deleted file mode 100644 index 03e9d20e..00000000 Binary files a/server/packages/create-eigen-game/templates/app-overlay/web/sqlite3.wasm and /dev/null differ diff --git a/server/packages/create-eigen-game/templates/ci/.github/workflows/checks.yml.template b/server/packages/create-eigen-game/templates/ci/.github/workflows/checks.yml.template index 121faba6..a46d96df 100644 --- a/server/packages/create-eigen-game/templates/ci/.github/workflows/checks.yml.template +++ b/server/packages/create-eigen-game/templates/ci/.github/workflows/checks.yml.template @@ -109,17 +109,19 @@ jobs: run: flutter test # A VM widget test can pass while a dependency still imports dart:io or - # calls an unsupported plugin. Compiling the real web entrypoint is - # what actually proves it ships, mirroring eigen-flutter's own `example` - # job, which does the same for the RPS reference app. + # calls an unsupported plugin. Building the real web app is what actually + # proves it ships, mirroring eigen-flutter's own `example` job, which does + # the same for the RPS reference app. `build:web` is the deploy's own + # build: Flutter, then the service worker Workbox generates from it, so + # the root's Node tools are installed first. # # No Android SDK step in this job, for the same reason # `create-eigen-game`'s own `scaffold-e2e.mjs` check skips one: # `flutter analyze`/`test`/`build web` don't need it, and it would # roughly double this job for no extra coverage. The Android build is # verified for real, with a real signing config, in `release.yml`. + - name: Install root dependencies + run: {{PACKAGE_MANAGER}} install + - name: Build web - working-directory: app - run: > - flutter build web --release - --dart-define-from-file=app-config.json + run: {{PACKAGE_MANAGER}} run build:web diff --git a/server/packages/create-eigen-game/templates/project/README.md b/server/packages/create-eigen-game/templates/project/README.md index c323874a..f041caae 100644 --- a/server/packages/create-eigen-game/templates/project/README.md +++ b/server/packages/create-eigen-game/templates/project/README.md @@ -88,8 +88,9 @@ values in `app/app-config.json`, then deploy both halves together: {{PACKAGE_MANAGER}} run deploy ``` -That builds Flutter into `server/public/` and deploys one Worker containing the -SPA and API. The app is `/`; invite and game URLs open the installed native app +That builds Flutter into `server/public/`, generates the service worker that lets +the web app open offline (`workbox-config.cjs`), and deploys one Worker +containing the SPA and API. The app is `/`; invite and game URLs open the installed native app or the browser SPA; the native install landing page is `/download`. Configure Android, Flutter Web, and the messaging service worker together: diff --git a/server/packages/create-eigen-game/templates/project/package.json b/server/packages/create-eigen-game/templates/project/package.json index db921b6d..7f511288 100644 --- a/server/packages/create-eigen-game/templates/project/package.json +++ b/server/packages/create-eigen-game/templates/project/package.json @@ -3,7 +3,7 @@ "private": true, "scripts": { "build:android": "cd app && flutter build appbundle --release --dart-define-from-file=app-config.json", - "build:web": "cd app && flutter build web --release --output ../server/public --dart-define-from-file=app-config.json", + "build:web": "cd app && flutter build web --release --output ../server/public --dart-define-from-file=app-config.json && cd .. && workbox generateSW workbox-config.cjs", "contract": "cd server && {{PACKAGE_MANAGER}} run contract && cd ../app && dart run eigen_codegen:generate_payloads --contract ../server/game-contract.json --output lib/game/generated/payloads.dart --fixtures-output test/fixtures", "contract:check": "cd server && {{PACKAGE_MANAGER}} run contract:check && cd ../app && dart run eigen_codegen:generate_payloads --contract ../server/game-contract.json --output lib/game/generated/payloads.dart --fixtures-output test/fixtures --check", "deploy": "{{PACKAGE_MANAGER}} run build:web && cd server && {{PACKAGE_MANAGER}} run deploy", @@ -12,6 +12,7 @@ "lint": "biome check ." }, "devDependencies": { - "@biomejs/biome": "2.5.12" + "@biomejs/biome": "2.5.12", + "workbox-cli": "7.4.1" } } diff --git a/server/packages/create-eigen-game/templates/project/workbox-config.cjs b/server/packages/create-eigen-game/templates/project/workbox-config.cjs new file mode 100644 index 00000000..8d1bb31d --- /dev/null +++ b/server/packages/create-eigen-game/templates/project/workbox-config.cjs @@ -0,0 +1,45 @@ +// The web app's service worker, generated by Workbox from the Flutter build +// (decision 0014). `build:web` runs it after building +// Flutter into `server/public/`. +// +// Every file the app is built from is precached when the worker installs, so +// the app opens with no network from the first visit on, and always from one +// consistent build. A deploy reaches a player as a new worker that precaches +// the new build beside the old one and takes over once no tab still runs the +// old build, or at once when the app asks it to because the engine requires the +// update. + +// Paths the game Worker answers itself rather than the app shell: its +// `run_worker_first` routes in wrangler.jsonc, less `/join/*` and `/game/*`, +// which render the app. A navigation to any other path opens the app. +const workerRoutes = [/^\/api\//, /^\/avatars\//, /^\/\.well-known\//, /^\/(health|download|terms|privacy|delete-account|robots\.txt|sitemap\.xml|site\.webmanifest)$/]; + +module.exports = { + globDirectory: "server/public", + swDest: "server/public/sw.js", + globPatterns: ["index.html", "flutter_bootstrap.js", "main.dart.*", "manifest.json", "favicon.png", "icons/**", "assets/**"], + globIgnores: ["**/*.map", "**/*.symbols"], + // `main.dart.js` alone is several megabytes, and a game's assets may be too. + // A file over the limit would be left out with only a warning, and the app + // would then fail offline, so the limit is set well above anything expected. + maximumFileSizeToCacheInBytes: 32 * 1024 * 1024, + navigateFallback: "index.html", + navigateFallbackDenylist: workerRoutes, + runtimeCaching: [ + { + // CanvasKit and the Firebase JS SDK load from Google's CDN at URLs that + // name their version, so a cached copy is never stale. The page adds what + // a first visit loaded before this worker controlled it (see + // web/flutter_bootstrap.js), under the same cache name. + urlPattern: /^https:\/\/www\.gstatic\.com\/(flutter-canvaskit|firebasejs)\//, + handler: "CacheFirst", + options: { cacheName: "eigen-cdn", cacheableResponse: { statuses: [200] } }, + }, + ], + skipWaiting: false, + clientsClaim: true, + cleanupOutdatedCaches: true, + inlineWorkboxRuntime: true, + sourcemap: false, + mode: "production", +}; diff --git a/server/packages/create-eigen-game/test/scaffold.spec.ts b/server/packages/create-eigen-game/test/scaffold.spec.ts index d30fb69e..2aec6f6a 100644 --- a/server/packages/create-eigen-game/test/scaffold.spec.ts +++ b/server/packages/create-eigen-game/test/scaffold.spec.ts @@ -1,5 +1,6 @@ import { execFileSync } from "node:child_process"; import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, writeFileSync } from "node:fs"; +import { createRequire } from "node:module"; import { tmpdir } from "node:os"; import { relative, resolve } from "node:path"; import { buildGameContract } from "@eigeninteractive/testkit"; @@ -88,6 +89,7 @@ describe("scaffoldGame", () => { expect(readFileSync(resolve(root, "app/lib/game/README.md"), "utf8")).toContain("eigen_codegen:generate_payloads"); const bootstrap = readFileSync(resolve(root, "app/web/flutter_bootstrap.js"), "utf8"); expect(bootstrap).toContain("firebase-messaging-sw.js"); + expect(bootstrap).toContain('register("sw.js")'); expect(bootstrap).not.toContain("cdnjs.cloudflare.com"); expect(readFileSync(resolve(root, "app/web/index.html"), "utf8")).not.toContain("cropper"); expect(existsSync(resolve(root, "app/web/vendor/cropperjs"))).toBe(false); @@ -151,11 +153,11 @@ describe("scaffoldGame", () => { expect(readFileSync(resolve(root, `app/assets/icon/${asset}`))).toEqual(readFileSync(resolve(import.meta.dirname, `../templates/app-overlay/assets/icon/${asset}`))); } - // Drift's web runtime, for the same reason: the module is WebAssembly and - // the worker is JavaScript, and the browser gets no local storage - so no - // offline play - without both arriving intact from the app's own origin. - for (const asset of ["sqlite3.wasm", "drift_worker.js"]) { - expect(readFileSync(resolve(root, `app/web/${asset}`))).toEqual(readFileSync(resolve(import.meta.dirname, `../templates/app-overlay/web/${asset}`))); + // Drift's web runtime ships inside eigen_flutter as package assets, and the + // service worker is generated from each build, so neither is a file the + // scaffold writes and a game has to keep in step. + for (const asset of ["sqlite3.wasm", "drift_worker.js", "eigen_offline_sw.js"]) { + expect(existsSync(resolve(root, `app/web/${asset}`)), asset).toBe(false); } // The notification icon is deliberately NOT here: `eigen_flutter`'s @@ -173,6 +175,10 @@ describe("scaffoldGame", () => { expect(rootManifest.private).toBe(true); expect(rootManifest.scripts.contract).toContain("cd server && npm run contract"); expect(rootManifest.scripts.contract).toContain("cd ../app && dart run eigen_codegen:generate_payloads"); + // A web build is not finished until Workbox has written its service worker. + expect(rootManifest.scripts["build:web"]).toMatch(/flutter build web .*&& cd \.\. && workbox generateSW workbox-config\.cjs$/); + expect(rootManifest.devDependencies).toHaveProperty("workbox-cli"); + expect(readFileSync(resolve(root, "workbox-config.cjs"), "utf8")).toContain('globDirectory: "server/public"'); expect(rootManifest.scripts.contract).toContain("--fixtures-output test/fixtures"); expect(rootManifest.scripts["contract:check"]).toContain("npm run contract:check"); expect(rootManifest.scripts["contract:check"]).toMatch(/--check$/); @@ -789,6 +795,35 @@ describe("repository initialisation", () => { }); }); +describe("the web service worker", () => { + const templates = resolve(import.meta.dirname, "../templates"); + const load = createRequire(import.meta.url); + const routesOf = (config: string): string[] => (load(config) as { navigateFallbackDenylist: RegExp[] }).navigateFallbackDenylist.map(String); + + it("answers a navigation with the app exactly where the Worker would", () => { + // A path the Worker renders itself (legal pages, the download page, the + // API) must reach the network, and the two routes the Worker hands to + // Flutter must open the precached app, offline included. The worker's list + // is written out rather than read from wrangler.jsonc at build time, so + // this is what keeps the two from drifting. + const { navigateFallbackDenylist } = load(resolve(templates, "project/workbox-config.cjs")) as { navigateFallbackDenylist: RegExp[] }; + const wrangler = readFileSync(resolve(templates, "worker/wrangler.jsonc"), "utf8"); + const runWorkerFirst = JSON.parse(/"run_worker_first":\s*(\[[^\]]*\])/.exec(wrangler)?.[1] ?? "[]") as string[]; + expect(runWorkerFirst.length).toBeGreaterThan(0); + for (const route of runWorkerFirst) { + const workerAnswers = !["/join/*", "/game/*"].includes(route); + expect( + navigateFallbackDenylist.some((pattern) => pattern.test(route.replace("*", "anything"))), + route, + ).toBe(workerAnswers); + } + }); + + it("is configured the same way for the reference app", () => { + expect(routesOf(resolve(import.meta.dirname, "../../../../flutter/example/workbox-config.cjs"))).toEqual(routesOf(resolve(templates, "project/workbox-config.cjs"))); + }); +}); + describe("template rendering", () => { it("pins which files are copied verbatim rather than rendered", () => { // The rule, "render it if it decodes as UTF-8", is otherwise invisible, @@ -807,7 +842,7 @@ describe("template rendering", () => { .filter((file) => decodeUtf8(readFileSync(resolve(templates, file))) === undefined) .sort(); - expect(verbatim).toEqual(["app-overlay/assets/icon/icon.png", "app-overlay/assets/icon/icon_foreground.png", "app-overlay/assets/icon/splash.png", "app-overlay/assets/icon/splash_dark.png", "app-overlay/web/sqlite3.wasm"]); + expect(verbatim).toEqual(["app-overlay/assets/icon/icon.png", "app-overlay/assets/icon/icon_foreground.png", "app-overlay/assets/icon/splash.png", "app-overlay/assets/icon/splash_dark.png"]); }); it("keeps each packaged .gitignore identical to the one it stands in for", () => { diff --git a/shell/CHANGELOG.md b/shell/CHANGELOG.md index e3f88491..1dfa67c1 100644 --- a/shell/CHANGELOG.md +++ b/shell/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog All notable changes to this project will be documented in this file. +## [Unreleased] +### Added +- The home screen offers to have the browser keep games played on this device, explaining what it is for before the browser asks, and only while such a game has yet to upload. +- A banner offering a reload when the replica stops answering, which in a browser is how a database whose worker has been taken away appears. + +### Changed +- The app refreshes when it comes back into view (`AppLifecycleListener.onShow`) rather than whenever it regains focus, which on the web was every alt-tab and the closing of the sign-in popup; the open game reconnects on the same signal. +- On the web, the update-required action lets the newly deployed service worker take over before reloading, so the reload lands on the new build. + +### Fixed +- Dismissing Google's sign-in no longer shows an error, and dismissing it while switching to an existing account keeps the guest and its data. A blocked sign-in window says to allow pop-ups. + ## [0.5.0] - 2026-09-16 ### Added - Every screen opens from the device replica: the home and history lists, replays, the profile, ratings and friends render with no network and no spinner on a device that has synced before, and pull-to-refresh runs the sync pass. @@ -50,6 +62,7 @@ the lower package reusable beneath an application-owned root. - Own account orchestration, profiles, friends, ratings, product persistence, app startup, navigation, and all first-party screens and platform plugins. +[Unreleased]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_shell-v0.5.0...HEAD [0.5.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_shell-v0.4.0...eigen_shell-v0.5.0 [0.4.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_shell-v0.3.0...eigen_shell-v0.4.0 [0.3.0]: https://github.com/eigeninteractive/eigen-platform/compare/eigen_shell-v0.2.0...eigen_shell-v0.3.0 diff --git a/shell/lib/core/startup/app_startup.dart b/shell/lib/core/startup/app_startup.dart index f1935d54..c0115246 100644 --- a/shell/lib/core/startup/app_startup.dart +++ b/shell/lib/core/startup/app_startup.dart @@ -36,7 +36,12 @@ class _AppStartupState extends ConsumerState { unawaited(_removeNativeSplashWhenReady()); unawaited(ref.read(updateProvider.notifier).checkForUpdate()); _lifecycleListener = AppLifecycleListener( - onResume: () { + // The app coming back into view, not merely regaining focus. A browser + // resumes the app whenever its window is focused again, which is every + // alt-tab and the closing of the sign-in popup, and Android does the same + // when the notification shade closes. None of those is the player + // returning, and each would cost a pass (decision 0014). + onShow: () { // Whatever changed while the app was away arrives in one pass. unawaited(ref.read(syncCoordinatorProvider.notifier).run()); ref.read(updateProvider.notifier).checkForUpdate(); diff --git a/shell/lib/core/updates/app_update_gateway.dart b/shell/lib/core/updates/app_update_gateway.dart index 20ad4fc1..fefc5ac9 100644 --- a/shell/lib/core/updates/app_update_gateway.dart +++ b/shell/lib/core/updates/app_update_gateway.dart @@ -72,7 +72,7 @@ class PluginAppUpdateGateway implements AppUpdateGateway { Future completeFlexibleUpdate() => InAppUpdate.completeFlexibleUpdate(); @override - Future reloadWeb() async => reloadBrowser(); + Future reloadWeb() => reloadBrowser(); } NativeUpdateAttempt _attempt(AppUpdateResult result) => switch (result) { diff --git a/shell/lib/core/updates/browser_reload_stub.dart b/shell/lib/core/updates/browser_reload_stub.dart index 684e7db9..2a4a51a6 100644 --- a/shell/lib/core/updates/browser_reload_stub.dart +++ b/shell/lib/core/updates/browser_reload_stub.dart @@ -1,6 +1,6 @@ -/// Reloads the current browser document. +/// Reloads the page into the newest deployed version of the app. /// /// The production gateway calls this only when compiled for the web. -void reloadBrowser() { +Future reloadBrowser() async { throw UnsupportedError('Browser reload is unavailable on this platform.'); } diff --git a/shell/lib/core/updates/browser_reload_web.dart b/shell/lib/core/updates/browser_reload_web.dart index 6e8525e5..4a226822 100644 --- a/shell/lib/core/updates/browser_reload_web.dart +++ b/shell/lib/core/updates/browser_reload_web.dart @@ -1,4 +1,58 @@ +import 'dart:async'; +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; + import 'package:web/web.dart' as web; -/// Reloads the current browser document from its existing URL. -void reloadBrowser() => web.window.location.reload(); +/// Reloads the page into the newest deployed version of the app. +/// +/// A plain reload would come back to the same build. The service worker +/// answers from the version it precached, and a newly deployed worker waits +/// until no tab still runs the old one, which a reload does not change: the +/// reloading tab is still one. So this first asks the browser for the newest +/// worker, lets it finish precaching, has it take over, and only then reloads +/// (decision 0014). Where there is no worker to update, or it will not +/// cooperate in reasonable time, it reloads anyway. +Future reloadBrowser() async { + try { + await _activateNewestWorker().timeout(const Duration(seconds: 30)); + } on Object { + // Nothing to activate, or the worker could not be reached: reload as is. + } + web.window.location.reload(); +} + +Future _activateNewestWorker() async { + if (!web.window.navigator.has('serviceWorker')) return; + final workers = web.window.navigator.serviceWorker; + final registration = await workers.getRegistration().toDart; + if (registration == null) return; + await registration.update().toDart; + if (registration.installing case final installing?) { + await _installed(installing); + } + final waiting = registration.waiting; + if (waiting == null) return; + final tookOver = Completer(); + workers.addEventListener( + 'controllerchange', + ((web.Event _) { + if (!tookOver.isCompleted) tookOver.complete(); + }).toJS, + ); + // The Workbox worker's own handshake for leaving the waiting state. + waiting.postMessage({'type': 'SKIP_WAITING'}.jsify()); + await tookOver.future; +} + +/// Completes once [worker] has finished installing, whether it succeeded. +Future _installed(web.ServiceWorker worker) { + final done = Completer(); + void settle() { + if (worker.state != 'installing' && !done.isCompleted) done.complete(); + } + + worker.addEventListener('statechange', ((web.Event _) => settle()).toJS); + settle(); + return done.future; +} diff --git a/shell/lib/features/auth/providers/auth_controller.dart b/shell/lib/features/auth/providers/auth_controller.dart index f205729b..dd42c150 100644 --- a/shell/lib/features/auth/providers/auth_controller.dart +++ b/shell/lib/features/auth/providers/auth_controller.dart @@ -17,6 +17,10 @@ enum UpgradeOutcome { /// The Google identity already belongs to an account. The UI must ask before /// abandoning guest progress and calling [AuthController.switchToExisting]. existingAccount, + + /// The player dismissed Google's sign-in. The guest is unchanged, and there + /// is nothing to say. + cancelled, } /// Manages first-party account actions and their operation state. @@ -27,7 +31,8 @@ class AuthController extends _$AuthController { @override AsyncValue build() => const AsyncData(null); - /// Signs in with Google. + /// Signs in with Google. Dismissing Google's sign-in is not an error: the + /// state simply settles back. Future signInWithGoogle() async { state = const AsyncLoading(); state = await AsyncValue.guard( @@ -55,6 +60,10 @@ class AuthController extends _$AuthController { final analytics = ref.read(analyticsServiceProvider); try { final result = await authService.upgradeWithGoogle(); + if (result == AuthUpgradeResult.cancelled) { + state = const AsyncData(null); + return UpgradeOutcome.cancelled; + } if (result == AuthUpgradeResult.existingAccount) { _hasPendingExistingAccount = true; state = const AsyncData(null); @@ -73,11 +82,14 @@ class AuthController extends _$AuthController { } } - /// Switches to the existing Google account selected by [upgradeToGoogle]. + /// Switches to the existing Google account selected by [upgradeToGoogle], and + /// answers whether it did. /// /// This is separate from conflict detection so the UI can explain that guest /// progress cannot be transferred and obtain consent before local teardown. - Future switchToExisting() async { + /// A player who then dismisses Google's sign-in stays the guest, with + /// everything the guest had. + Future switchToExisting() async { if (!_hasPendingExistingAccount) { throw StateError('No existing Google account switch is pending.'); } @@ -85,7 +97,13 @@ class AuthController extends _$AuthController { state = const AsyncLoading(); final guestId = ref.read(currentUserProvider)?.id; try { - await ref.read(authServiceProvider).switchToExistingGoogleAccount(); + final result = await ref + .read(authServiceProvider) + .switchToExistingGoogleAccount(); + if (result == AuthSignInResult.cancelled) { + state = const AsyncData(null); + return false; + } if (guestId != null) { try { await forgetAbandonedGuest(ref, guestId); @@ -99,6 +117,7 @@ class AuthController extends _$AuthController { } } state = const AsyncData(null); + return true; } catch (error, stackTrace) { state = AsyncError(error, stackTrace); rethrow; diff --git a/shell/lib/features/auth/providers/auth_controller.g.dart b/shell/lib/features/auth/providers/auth_controller.g.dart index f8345cbb..e67081dc 100644 --- a/shell/lib/features/auth/providers/auth_controller.g.dart +++ b/shell/lib/features/auth/providers/auth_controller.g.dart @@ -44,7 +44,7 @@ final class AuthControllerProvider } } -String _$authControllerHash() => r'829c02742ab01b266d199af166030e50bdf6fbb2'; +String _$authControllerHash() => r'76e2c6226e1ee548d766c2e6c64f2d56627838a7'; /// Manages first-party account actions and their operation state. diff --git a/shell/lib/features/game/presentation/screens/game_screen.dart b/shell/lib/features/game/presentation/screens/game_screen.dart index ad249c60..e7b6c73e 100644 --- a/shell/lib/features/game/presentation/screens/game_screen.dart +++ b/shell/lib/features/game/presentation/screens/game_screen.dart @@ -63,7 +63,9 @@ class _GameScreenState extends ConsumerState { @override void initState() { super.initState(); - _lifecycleListener = AppLifecycleListener(onResume: _invalidateStreams); + // Back into view, not merely refocused: a browser reports every window + // focus as a resume, and each would reconnect the game's socket. + _lifecycleListener = AppLifecycleListener(onShow: _invalidateStreams); // Analytics listeners registered once here so they are independent of the // build cycle and don't mix side-effects into the build method. // Registered before the build-cycle listeners so they read player count diff --git a/shell/lib/features/game/presentation/widgets/keep_local_games_card.dart b/shell/lib/features/game/presentation/widgets/keep_local_games_card.dart new file mode 100644 index 00000000..3bcfbdb6 --- /dev/null +++ b/shell/lib/features/game/presentation/widgets/keep_local_games_card.dart @@ -0,0 +1,110 @@ +import 'package:eigen_flutter/shell_support.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +/// Offers to have the browser keep the games this device is holding. +/// +/// A browser may clear a site's storage when it runs short of space, and a game +/// played here that has not uploaded yet is the one thing a sync cannot bring +/// back. Asking the browser to keep it makes some browsers ask the player, so +/// this explains what it is for first, and appears only while such a game +/// exists and the browser has neither granted nor refused. It shows nothing on +/// a device, which evicts nothing. +class KeepLocalGamesCard extends ConsumerStatefulWidget { + const KeepLocalGamesCard({super.key}); + + @override + ConsumerState createState() => _KeepLocalGamesCardState(); +} + +class _KeepLocalGamesCardState extends ConsumerState { + bool _asking = false; + + @override + Widget build(BuildContext context) { + final offer = ref.watch(keepLocalGamesProvider).value ?? false; + if (!offer) return const SizedBox.shrink(); + + final textTheme = Theme.of(context).textTheme; + return Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon(Icons.save_outlined), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Keep your offline games', + style: textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 4), + const Text( + 'A game you play offline is only on this device until ' + 'it uploads, and a browser short of space may clear it. ' + 'Your browser may ask you to allow this.', + ), + ], + ), + ), + ], + ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: _asking ? null : _dismiss, + child: const Text('Not now'), + ), + const SizedBox(width: 8), + FilledButton.tonalIcon( + onPressed: _asking ? null : _keep, + icon: _asking + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.shield_outlined), + label: const Text('Keep them'), + ), + ], + ), + ], + ), + ), + ); + } + + Future _keep() async { + setState(() => _asking = true); + try { + final decision = await ref.read(keepLocalGamesProvider.notifier).keep(); + if (!mounted) return; + if (decision != StoragePersistence.granted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + "Your browser didn't allow it. Games still save here, but it may " + 'clear them if it runs short of space before they upload.', + ), + ), + ); + } + } finally { + if (mounted) setState(() => _asking = false); + } + } + + Future _dismiss() => + ref.read(keepLocalGamesProvider.notifier).dismiss(); +} diff --git a/shell/lib/features/home/presentation/screens/home_screen.dart b/shell/lib/features/home/presentation/screens/home_screen.dart index 4c24cec0..cf97d186 100644 --- a/shell/lib/features/home/presentation/screens/home_screen.dart +++ b/shell/lib/features/home/presentation/screens/home_screen.dart @@ -7,6 +7,7 @@ import 'package:shimmer/shimmer.dart'; import 'package:eigen_shell/features/game/presentation/extensions/game_ui.dart'; import 'package:eigen_flutter/shell_support.dart'; +import 'package:eigen_shell/features/game/presentation/widgets/keep_local_games_card.dart'; import 'package:eigen_shell/features/game/presentation/widgets/turn_countdown.dart'; import 'package:eigen_shell/features/profile/providers/profile_providers.dart'; import 'package:eigen_client/eigen_client.dart'; @@ -38,6 +39,7 @@ class _HomeScreenState extends ConsumerState { children: [ const _WelcomeHeader(), const SizedBox(height: 16), + const KeepLocalGamesCard(), Expanded( child: RefreshIndicator( onRefresh: _onRefresh, diff --git a/shell/lib/features/settings/presentation/screens/settings_screen.dart b/shell/lib/features/settings/presentation/screens/settings_screen.dart index aa959e8b..f0aded41 100644 --- a/shell/lib/features/settings/presentation/screens/settings_screen.dart +++ b/shell/lib/features/settings/presentation/screens/settings_screen.dart @@ -514,6 +514,8 @@ class _UpgradeAccountCard extends ConsumerWidget { .read(authControllerProvider.notifier) .upgradeToGoogle(); switch (outcome) { + case UpgradeOutcome.cancelled: + return; case UpgradeOutcome.linked: messenger.showSnackBar( const SnackBar( @@ -531,7 +533,10 @@ class _UpgradeAccountCard extends ConsumerWidget { .cancelExistingAccountSwitch(); return; } - await ref.read(authControllerProvider.notifier).switchToExisting(); + final switched = await ref + .read(authControllerProvider.notifier) + .switchToExisting(); + if (!switched) return; messenger.showSnackBar( const SnackBar( content: Text( diff --git a/shell/lib/src/app_runner.dart b/shell/lib/src/app_runner.dart index d0513eaf..041381b2 100644 --- a/shell/lib/src/app_runner.dart +++ b/shell/lib/src/app_runner.dart @@ -9,6 +9,7 @@ import 'package:eigen_shell/core/navigation/providers/navigation_providers.dart' import 'package:eigen_shell/core/navigation/widgets/app_route_title.dart'; import 'package:eigen_shell/core/navigation/url_strategy.dart'; import 'package:eigen_shell/core/startup/app_startup.dart'; +import 'package:eigen_shell/core/updates/update_notifier.dart'; import 'package:eigen_shell/core/theme/theme_provider.dart'; SemanticsHandle? _webSemanticsHandle; @@ -120,13 +121,13 @@ class MyApp extends ConsumerWidget { } } -/// Stops the app where the browser gives it nowhere to keep its data. +/// Says what the browser has done to the app's data, above whatever it renders. /// /// Another tab of the app may hold the replica in a browser where sharing it -/// between tabs is unsafe, and this tab then opens nothing and says so. A -/// browser that keeps nothing across a reload runs the app normally, minus -/// local play, and says that too (decision 0013). Native always persists, so -/// this renders its child. +/// between tabs is unsafe, and this tab then opens nothing, says so, and opens +/// once that tab closes. A browser that keeps nothing across a reload runs the +/// app normally, minus local play, and says that too (decisions 0013 and 0014). +/// Native always persists, so this renders its child. class _ReplicaGate extends ConsumerWidget { const _ReplicaGate({required this.child}); @@ -136,18 +137,42 @@ class _ReplicaGate extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final storage = ref.watch(replicaStorageProvider).value; final colorScheme = Theme.of(context).colorScheme; - return switch (storage) { - ReplicaStorage.heldElsewhere => Scaffold( + if (storage == ReplicaStorage.heldElsewhere) { + return const Scaffold( body: EmptyStateView( icon: Icons.tab_outlined, title: 'Open in another tab', message: 'This browser can only use the app in one tab at a time. ' - 'Close this tab, or close the other one and reload.', + 'It opens here as soon as the other tab is closed.', ), - ), - ReplicaStorage.ephemeral => Column( - children: [ + ); + } + // A browser can take the worker holding the database away without telling + // the page, and then nothing this app reads or writes ever answers. Only + // reopening recovers it, which is what a reload does (decision 0014). + final answering = ref.watch(replicaAnsweringProvider).value ?? true; + return Column( + children: [ + if (!answering) + SafeArea( + bottom: false, + child: StatusBanner( + leading: Icon( + Icons.sync_problem_outlined, + size: 16, + color: colorScheme.onErrorContainer, + ), + label: 'The app stopped responding', + backgroundColor: colorScheme.errorContainer, + foregroundColor: colorScheme.onErrorContainer, + trailing: TextButton( + onPressed: () => ref.read(appUpdateGatewayProvider).reloadWeb(), + child: const Text('Reload'), + ), + ), + ), + if (storage == ReplicaStorage.ephemeral) SafeArea( bottom: false, child: StatusBanner( @@ -161,10 +186,8 @@ class _ReplicaGate extends ConsumerWidget { foregroundColor: colorScheme.onSurfaceVariant, ), ), - Expanded(child: child), - ], - ), - _ => child, - }; + Expanded(child: child), + ], + ); } } diff --git a/shell/test/features/auth/auth_controller_test.dart b/shell/test/features/auth/auth_controller_test.dart index ccbd00e4..25946d3c 100644 --- a/shell/test/features/auth/auth_controller_test.dart +++ b/shell/test/features/auth/auth_controller_test.dart @@ -13,6 +13,9 @@ final class _FakeAuthGateway implements AuthGateway { bool switched = false; bool cancelled = false; + /// Whether the player dismisses Google's sign-in when it opens. + bool dismisses = false; + @override AuthUser? get currentUser => const AuthUser(id: 'guest-1', isAnonymous: true); @@ -23,14 +26,17 @@ final class _FakeAuthGateway implements AuthGateway { Future signInAnonymously() async {} @override - Future signInWithGoogle() async {} + Future signInWithGoogle() async => + dismisses ? AuthSignInResult.cancelled : AuthSignInResult.signedIn; @override Future signOut() async {} @override - Future switchToExistingGoogleAccount() async { + Future switchToExistingGoogleAccount() async { + if (dismisses) return AuthSignInResult.cancelled; switched = true; + return AuthSignInResult.signedIn; } @override @@ -160,11 +166,50 @@ void main() { final controller = container.read(authControllerProvider.notifier); await controller.upgradeToGoogle(); - await controller.switchToExisting(); + check(await controller.switchToExisting()).isTrue(); check(auth.switched).isTrue(); expect(container.read(authControllerProvider), isA>()); }); + + test('dismissing Google during a switch keeps the guest as it was', () async { + final auth = _FakeAuthGateway()..throwExistingAccount = true; + final container = makeContainer( + overrides: [ + ...replicaTestOverrides(), + syncCoordinatorProvider.overrideWith(_IdleSyncCoordinator.new), + authServiceProvider.overrideWithValue(auth), + analyticsServiceProvider.overrideWithValue(_FakeAnalytics()), + currentUserProvider.overrideWith( + (ref) => const AuthUser(id: 'guest-1', isAnonymous: true), + ), + ], + ); + + final controller = container.read(authControllerProvider.notifier); + await controller.upgradeToGoogle(); + auth.dismisses = true; + + check(await controller.switchToExisting()).isFalse(); + check(auth.switched).isFalse(); + expect(container.read(authControllerProvider), isA>()); + }); + + test('dismissing Google at sign-in is not an error', () async { + final auth = _FakeAuthGateway()..dismisses = true; + final container = makeContainer( + overrides: [ + ...replicaTestOverrides(), + syncCoordinatorProvider.overrideWith(_IdleSyncCoordinator.new), + authServiceProvider.overrideWithValue(auth), + analyticsServiceProvider.overrideWithValue(_FakeAnalytics()), + ], + ); + + await container.read(authControllerProvider.notifier).signInWithGoogle(); + + expect(container.read(authControllerProvider), isA>()); + }); } /// A sync coordinator that runs nothing: account changes trigger a sync, which diff --git a/shell/test/features/game/presentation/keep_local_games_card_test.dart b/shell/test/features/game/presentation/keep_local_games_card_test.dart new file mode 100644 index 00000000..31faf0bc --- /dev/null +++ b/shell/test/features/game/presentation/keep_local_games_card_test.dart @@ -0,0 +1,102 @@ +import 'package:eigen_flutter/shell_support.dart'; +import 'package:eigen_shell/features/game/presentation/widgets/keep_local_games_card.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +/// The offer, without a browser: [offered] is what the app decided to ask, and +/// [decision] is what the browser would answer. +class _FakeKeepLocalGames extends KeepLocalGames { + _FakeKeepLocalGames({ + required this.offered, + this.decision = StoragePersistence.granted, + }); + + final bool offered; + final StoragePersistence decision; + var asked = 0; + var dismissed = 0; + + @override + Future build() async => offered; + + @override + Future keep() async { + asked++; + state = const AsyncData(false); + return decision; + } + + @override + Future dismiss() async { + dismissed++; + state = const AsyncData(false); + } +} + +Widget _app(_FakeKeepLocalGames offer) => ProviderScope( + overrides: [keepLocalGamesProvider.overrideWith(() => offer)], + child: const MaterialApp(home: Scaffold(body: KeepLocalGamesCard())), +); + +void main() { + testWidgets('explains what it is for before the browser asks', ( + tester, + ) async { + await tester.pumpWidget(_app(_FakeKeepLocalGames(offered: true))); + await tester.pump(); + + expect(find.text('Keep your offline games'), findsOneWidget); + expect( + find.textContaining('only on this device until it uploads'), + findsOneWidget, + ); + expect(find.text('Keep them'), findsOneWidget); + }); + + testWidgets('asks the browser when the player accepts', (tester) async { + final offer = _FakeKeepLocalGames(offered: true); + await tester.pumpWidget(_app(offer)); + await tester.pump(); + + await tester.tap(find.text('Keep them')); + await tester.pumpAndSettle(); + + expect(offer.asked, 1); + expect(find.text('Keep them'), findsNothing); + }); + + testWidgets('a browser that refuses says what that means', (tester) async { + final offer = _FakeKeepLocalGames( + offered: true, + decision: StoragePersistence.refused, + ); + await tester.pumpWidget(_app(offer)); + await tester.pump(); + + await tester.tap(find.text('Keep them')); + await tester.pumpAndSettle(); + + expect(find.textContaining("didn't allow it"), findsOneWidget); + }); + + testWidgets('declining asks nothing and leaves the card', (tester) async { + final offer = _FakeKeepLocalGames(offered: true); + await tester.pumpWidget(_app(offer)); + await tester.pump(); + + await tester.tap(find.text('Not now')); + await tester.pumpAndSettle(); + + expect(offer.dismissed, 1); + expect(offer.asked, 0); + expect(find.text('Not now'), findsNothing); + }); + + testWidgets('shows nothing where there is nothing to offer', (tester) async { + await tester.pumpWidget(_app(_FakeKeepLocalGames(offered: false))); + await tester.pump(); + + expect(find.text('Keep your offline games'), findsNothing); + }); +} diff --git a/tool/check.sh b/tool/check.sh index 03b9d54c..5f64687e 100755 --- a/tool/check.sh +++ b/tool/check.sh @@ -161,13 +161,22 @@ run_flutter() { flutter analyze flutter test flutter build web --release --dart-define-from-file=app-config.json + "$platform_root/node_modules/.bin/workbox" generateSW workbox-config.cjs test -f build/web/assets/packages/eigen_shell/assets/vendor/cropperjs/cropper.min.js - # Drift's web runtime and the shell's own service worker. Without all three a - # browser has no persistence and no cold start offline, which is the whole of - # offline play on the web, and the build would still be green. - test -f build/web/sqlite3.wasm - test -f build/web/drift_worker.js - test -f build/web/eigen_offline_sw.js + # Drift's web runtime, shipped by eigen_flutter, and the Workbox worker that + # precaches the build. Without them a browser has no persistence and no cold + # start offline, which is the whole of offline play on the web, and the build + # would still be green. The worker must precache the runtime and the entry + # points by name, or it installs and still fails offline. + for precached in \ + index.html \ + flutter_bootstrap.js \ + main.dart.js \ + assets/packages/eigen_flutter/assets/drift/sqlite3.wasm \ + assets/packages/eigen_flutter/assets/drift/drift_worker.js; do + test -f "build/web/$precached" + grep -q "\"$precached\"" build/web/sw.js + done cd "$platform_root/flutter" dart pub publish --dry-run diff --git a/web/docs/how-it-works/the-client-app.md b/web/docs/how-it-works/the-client-app.md index 9557451b..6e5c029e 100644 --- a/web/docs/how-it-works/the-client-app.md +++ b/web/docs/how-it-works/the-client-app.md @@ -155,10 +155,12 @@ account deletes them. **One read fills it.** A sync pass uploads the games this device decides (offline play, below) and then pulls `GET /me/sync`, which answers with the small sets whole and finished games since a cursor. It runs on events, never on -a timer: app start, resume, reconnecting, pull-to-refresh, a push arriving while -the app is open, and a local game finishing. Only one pass runs at a time, and a -failed one changes nothing, so the replica still holds what the last good one -wrote. +a timer: app start, coming back into view, reconnecting, pull-to-refresh, a push +arriving while the app is open, and a local game finishing. Passes never overlap, +and a trigger is already answered once a pass that began pulling after it has +completed, so a burst of triggers costs one pass rather than one each, including +across browser tabs. A failed pass answers nothing and changes nothing, so the +replica still holds what the last good one wrote. **Writes are ordered by the game's own revision.** A summary from a sync, a snapshot from the open game's socket and a commit from the local engine all @@ -171,8 +173,24 @@ Two disciplines make this safe: - **The replica is a cache of the server, except where it is not.** A game this device decides is the only copy of that game until it synchronizes, which is why deleting an account deletes it deliberately rather than as cleanup, and - why a browser is asked for persistent storage when the first one is created. -- **A schema change ships a migration.** The tables are versioned and their + why a browser is offered the chance to keep it (below). +- **Replays are the one bounded thing.** The 200 most recently opened ended +online games keep their frames; beyond that a replay is fetched again when it is +opened. Games still in play, and games played on this device, keep every frame. +An app that wants a different number sets it: + +```dart +AppConfig( + branding: …, + engine: …, + replica: ReplicaConfig(keptReplays: kIsWeb ? 50 : defaultKeptReplays), +) +``` + +In a browser that stores the replica in IndexedDB, the whole replica is held in +memory while the app is open, which is the reason to keep fewer there. + +**A schema change ships a migration.** The tables are versioned and their schema is dumped into `dart/eigen_client/drift_schemas/`, which CI checks; there is no "drop it and refetch" path, because some of it cannot be refetched. @@ -195,11 +213,13 @@ rows, plus the players and bots the replica holds, which is what turns a seat index into a name and an avatar offline. Sync needs no game code and no UI trigger; it is the upload half of the pass above. -The scaffold's web build ships drift's web runtime (`sqlite3.wasm`, -`drift_worker.js`) and a service worker that precaches the application shell, -registered at the root scope beside the messaging worker's own scope, because -Flutter no longer generates one: without it, a web install has nothing cached to -render from on a cold, offline reload. +On the web, drift's runtime (`sqlite3.wasm`, `drift_worker.js`) ships inside +`eigen_flutter` as web-only package assets, so an app carries no copy of it. The +scaffold's web build ends by generating a service worker with +[Workbox](https://developer.chrome.com/docs/workbox), which precaches the whole +build when it installs: after one online visit the app opens with no network, +always from one consistent build. Flutter no longer generates a worker, and +without one a web install has nothing to render from on a cold, offline reload. ## Connectivity & offline UX @@ -227,19 +247,34 @@ bypassing Riverpod's retry backoff. ### What differs on the web -The same code runs, with three differences a browser forces: +The same code runs, with these differences a browser forces: - **Storage can be cleared.** Replicated rows come back on the next sync; a - local game not yet uploaded cannot, so the app asks for persistent storage - (`navigator.storage.persist()`) when the first one is created. + local game not yet uploaded cannot. So while the account holds one, the home + screen offers to have the browser keep this site's storage, explaining why + first: some browsers ask the player in turn, and a prompt with no explanation + is a prompt people dismiss. It is offered once, and never on a device, which + evicts nothing. - **Tabs.** The shell cannot send the cross-origin isolation headers, because they break the sign-in popup, so drift's only storage that is safe to share - between tabs is the shared-worker kind. Where the browser has no shared - workers, the first tab takes an exclusive lock on the database for its - lifetime and a second tab says the app is open elsewhere. Sync passes and - local games also run under browser locks. + between tabs is the kind one shared worker hosts for all of them, which + Chrome (on Android from version 148), Firefox, and Safari offer. Where a + browser does not, the first tab holds the + database for its lifetime, a second tab says the app is open elsewhere, and + it opens by itself once the first tab closes. Sync passes run under a browser + lock, so the tabs share them. - **No storage at all.** A browser that keeps nothing across a reload runs the app normally, minus local play, and says so. +- **Coming back.** A browser reports every window focus as the app resuming, so + the app refreshes when it comes back into view, not when it is refocused. +- **A database that goes away.** A browser may take the worker holding the + replica away without telling the page, and nothing the app reads or writes + then answers. The app notices that statements have stopped answering, says it + stopped responding, and offers a reload, which opens everything again. Every + committed write is already stored, so a reload is all it costs. +- **Updates.** A deploy reaches an open tab as a new service worker that has + precached the new build and waits. The update-required action lets it take + over and then reloads, so the reload lands on the new build. ## Navigation diff --git a/web/docs/ship-it/configure.md b/web/docs/ship-it/configure.md index bf78116f..c68bffd9 100644 --- a/web/docs/ship-it/configure.md +++ b/web/docs/ship-it/configure.md @@ -73,8 +73,9 @@ that schema, and its migrations will not know about them. ## The app -One provider-neutral `AppConfig` contains `Branding` and the Eigen server -values. The standard scaffold passes `FirebaseAdapterConfig` to +One provider-neutral `AppConfig` contains `Branding`, the Eigen server values, +and `ReplicaConfig`, which is how much of what it syncs the device keeps (only +`keptReplays` today, and it has a default). The standard scaffold passes `FirebaseAdapterConfig` to `initializeEigenFirebase` and hands those overrides to `runEigenShell`. The app reads Dart compilation environment declarations once at this composition root; neither package reads hidden process or file state. diff --git a/web/docs/ship-it/deploy-the-web-app.md b/web/docs/ship-it/deploy-the-web-app.md index cc62f8e1..66983fe4 100644 --- a/web/docs/ship-it/deploy-the-web-app.md +++ b/web/docs/ship-it/deploy-the-web-app.md @@ -25,15 +25,17 @@ Web uses the same widgets, Riverpod state, generated API client and game module as Android; only the browser integration points differ: -- Firebase Auth opens Google's Firebase-managed popup; +- Firebase Auth opens Google's Firebase-managed popup, and only the popup; - REST, avatars, and sockets are same-origin in production; - the game feed uses `wss://…?ticket=…`, with a short-lived ticket minted over authenticated HTTPS because browser WebSocket upgrades cannot set an `Authorization` header; - Firebase Messaging runs background delivery in a service worker; -- server responses stay in Riverpod memory for the browser session and are - fetched again after a reload. Firebase Auth and small user preferences retain - their own browser persistence. +- the app's own service worker, generated by Workbox, precaches the build so the + app opens with no network; +- the device replica lives in the browser's IndexedDB (or OPFS), hosted by one + shared worker for every tab, with drift's web runtime served from + `eigen_flutter`'s package assets. ## 1. Use a stable local origin @@ -117,7 +119,8 @@ The scaffold contains: - `web/firebase-messaging-sw.js`, which receives background messages; - `web/firebase-config.js`, generated from FlutterFire's selected Web app; -- `web/flutter_bootstrap.js`, which registers that worker before Flutter starts; +- `web/flutter_bootstrap.js`, which starts Flutter and registers that worker and + the app's own beside it; - an `app-config.json` containing the public `FIREBASE_VAPID_KEY` consumed by `EngineConfig`. @@ -155,8 +158,7 @@ FCM requires a secure URL. `eigen_flutter` bundles the pinned Cropper.js JavaScript, stylesheet, and MIT license required by `image_cropper`, and loads the browser assets only when avatar editing starts. The app needs no Cropper.js files or `web/index.html` -tags, has no runtime CDN dependency, and keeps `flutter_bootstrap.js` concerned -only with registering FCM before Flutter starts. +tags, and has no runtime CDN dependency. ## 4. Build and deploy one artifact @@ -193,23 +195,41 @@ pnpm run deploy ``` The root script runs `flutter build web --release` directly into -`server/public/` with -`--dart-define-from-file=app-config.json`, applies D1 migrations, then deploys -the Worker and assets together. Wrangler's `single-page-application` fallback +`server/public/` with `--dart-define-from-file=app-config.json`, generates the +service worker with `workbox generateSW workbox-config.cjs`, applies D1 +migrations, then deploys the Worker and assets together. Wrangler's `single-page-application` fallback handles clean Flutter paths. Its selective `run_worker_first` list keeps exact static files on Cloudflare's asset path while reserving dynamic engine routes for Worker code. There is no second hosting product or second deployment URL to coordinate. -For the simple reload update model: +### The service worker and updates + +`workbox-config.cjs` precaches everything the app is built from when the worker +installs: the entry points, `assets/` (drift's runtime included), and the icons. +CanvasKit and the Firebase JS SDK load from Google's CDN at URLs that name their +version, and are cached as they load. So after one online visit the app opens +with no network at all, and it always runs one consistent build rather than a +mix of cached and fresh files. + +A deploy changes `sw.js`. The browser installs the new worker beside the old +one, precaching the new build, and it waits: a tab already open keeps running +the build it started with, and a player's next visit after closing every tab +gets the new one. When the engine reports that a client is too old, the +update-required button asks the waiting worker to take over and then reloads, +so the reload lands on the new build. + +Two things keep this correct: + +- `run_worker_first` and the worker's `navigateFallbackDenylist` must agree. A + path the Worker renders (`/terms`, `/download`, the API) belongs in the + denylist, so a navigation to it reaches the Worker instead of the precached + app. `/join/*` and `/game/*` do not, so they open the app, offline included. + A new Worker route goes in both. +- Deploy the Worker and its assets together, which `deploy` does, and serve + `sw.js` with revalidation. Workers Static Assets does both by default; a + separate static host must too. -- serve `index.html`, `flutter_bootstrap.js`, `main.dart.js`, and - `firebase-messaging-sw.js` plus `firebase-config.js` with revalidation or a - short cache; -- immutable-hash assets may use a long cache; -- deploy the complete Worker + asset version atomically. - -That makes the engine's update-required button reload into the current bundle. The combined deploy removes the usual ordering race for web. Android still needs version ordering: publish a compatible Play build before server behavior that requires it. @@ -278,10 +298,13 @@ Before release, test at the production origin: 6. a background notification click opens the exact absolute `/game/:id` URL, including when no app tab is already open; 7. direct navigation and refresh at `/game/:id` or `/join/:code`; -8. the update-required reload after replacing the deployed bundle. - -The engine CI runs its browser socket and integration tests, then compiles the -RPS reference entrypoint with `flutter build web --release`. Your app CI should -do the same with `app-config.json`, `firebase_options.dart`, and the generated -`firebase-config.js`, then add credentialed browser integration tests for the -flows above. +8. the update-required reload after replacing the deployed bundle; +9. with the network off, reopening the app after a single online visit, and + opening a `/game/:id` link. + +The engine CI runs its browser socket and integration tests, then builds the +RPS reference app for the web and generates its service worker, checking that +the worker precaches the entry points and drift's runtime. The scaffolded CI +runs your project's own `build:web` with `app-config.json`, +`firebase_options.dart`, and the generated `firebase-config.js`; add +credentialed browser integration tests for the flows above.