From 5e21926fb80a3972abc797c43f0dc9fdb88e37f5 Mon Sep 17 00:00:00 2001 From: Seenu K Date: Thu, 17 Sep 2026 16:12:20 +0530 Subject: [PATCH 1/4] feat: enhance web app offline capabilities with Workbox service worker - Removed sqlite3.wasm from the project as it is now handled by eigen_flutter. - Updated GitHub Actions workflow to install root dependencies before building the web app. - Modified README to reflect changes in service worker generation and offline capabilities. - Updated package.json to include workbox-cli for service worker generation. - Added workbox-config.cjs for service worker configuration to precache assets. - Updated scaffold tests to verify service worker and asset handling. - Improved app lifecycle handling to refresh when coming back into view. - Enhanced update mechanism to allow service worker to take over before reloading. - Updated documentation to clarify web app behavior regarding offline play and updates. --- .github/workflows/checks.yml | 18 + dart/eigen_client/CHANGELOG.md | 6 + .../lib/src/replica/account_replica.dart | 36 +- .../lib/src/replica/replica_database.g.dart | 3 +- .../lib/src/replica/sync_pass.dart | 62 +- dart/eigen_client/lib/src/replica/tables.dart | 3 +- .../test/replica/account_replica_test.dart | 51 +- .../test/replica/sync_pass_test.dart | 79 +- .../0014-web-application-shell.md | 175 + docs/architecture/README.md | 1 + firebase/CHANGELOG.md | 5 + .../lib/src/auth/firebase_auth_gateway.dart | 95 +- .../test/auth/sign_in_interruption_test.dart | 49 + flutter/CHANGELOG.md | 14 + flutter/README.md | 9 +- flutter/assets/drift/README.md | 15 + .../web => assets/drift}/drift_worker.js | 0 .../web => assets/drift}/sqlite3.wasm | Bin flutter/example/README.md | 5 + flutter/example/web/README.md | 11 - flutter/example/web/eigen_offline_sw.js | 82 - flutter/example/web/firebase-messaging-sw.js | 4 +- flutter/example/web/flutter_bootstrap.js | 63 +- flutter/example/workbox-config.cjs | 46 + .../connectivity/connectivity_provider.dart | 42 +- .../connectivity/connectivity_provider.g.dart | 53 +- flutter/lib/core/errors/error_messages.dart | 4 + .../notifications/notification_provider.dart | 4 +- .../notification_provider.g.dart | 12 +- flutter/lib/core/replica/replica_host.dart | 40 +- flutter/lib/core/replica/replica_host_io.dart | 10 +- .../lib/core/replica/replica_host_web.dart | 163 +- .../lib/core/replica/replica_providers.dart | 37 +- .../lib/core/replica/replica_providers.g.dart | 28 +- .../features/auth/domain/auth_gateway.dart | 43 +- .../sync/providers/sync_providers.dart | 34 +- .../sync/providers/sync_providers.g.dart | 32 +- flutter/lib/testing/memory_replica_host.dart | 10 +- flutter/pubspec.yaml | 16 +- .../connectivity_provider_test.dart | 58 + package.json | 3 + pnpm-lock.yaml | 4653 +++++- server/.changeset/web-application-shell.md | 12 + server/biome.json | 2 +- .../scripts/scaffold-e2e.mjs | 10 +- .../templates/app-overlay/web/README.md | 11 - .../templates/app-overlay/web/drift_worker.js | 13453 ---------------- .../app-overlay/web/eigen_offline_sw.js | 82 - .../web/firebase-messaging-sw.js.template | 4 +- .../web/flutter_bootstrap.js.template | 63 +- .../templates/app-overlay/web/sqlite3.wasm | Bin 748686 -> 0 bytes .../ci/.github/workflows/checks.yml.template | 16 +- .../templates/project/README.md | 5 +- .../templates/project/package.json | 5 +- .../templates/project/workbox-config.cjs | 45 + .../create-eigen-game/test/scaffold.spec.ts | 47 +- shell/CHANGELOG.md | 9 + shell/lib/core/startup/app_startup.dart | 7 +- .../lib/core/updates/app_update_gateway.dart | 2 +- .../lib/core/updates/browser_reload_stub.dart | 4 +- .../lib/core/updates/browser_reload_web.dart | 58 +- .../auth/providers/auth_controller.dart | 27 +- .../auth/providers/auth_controller.g.dart | 2 +- .../presentation/screens/game_screen.dart | 4 +- .../presentation/screens/settings_screen.dart | 7 +- shell/lib/src/app_runner.dart | 10 +- .../features/auth/auth_controller_test.dart | 51 +- tool/check.sh | 21 +- web/docs/how-it-works/the-client-app.md | 39 +- web/docs/ship-it/deploy-the-web-app.md | 73 +- 70 files changed, 6135 insertions(+), 14008 deletions(-) create mode 100644 docs/architecture/0014-web-application-shell.md create mode 100644 firebase/test/auth/sign_in_interruption_test.dart create mode 100644 flutter/assets/drift/README.md rename flutter/{example/web => assets/drift}/drift_worker.js (100%) rename flutter/{example/web => assets/drift}/sqlite3.wasm (100%) delete mode 100644 flutter/example/web/README.md delete mode 100644 flutter/example/web/eigen_offline_sw.js create mode 100644 flutter/example/workbox-config.cjs create mode 100644 flutter/test/core/connectivity/connectivity_provider_test.dart create mode 100644 server/.changeset/web-application-shell.md delete mode 100644 server/packages/create-eigen-game/templates/app-overlay/web/README.md delete mode 100644 server/packages/create-eigen-game/templates/app-overlay/web/drift_worker.js delete mode 100644 server/packages/create-eigen-game/templates/app-overlay/web/eigen_offline_sw.js delete mode 100644 server/packages/create-eigen-game/templates/app-overlay/web/sqlite3.wasm create mode 100644 server/packages/create-eigen-game/templates/project/workbox-config.cjs 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..e6be5ac0 --- /dev/null +++ b/docs/architecture/0014-web-application-shell.md @@ -0,0 +1,175 @@ +# 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 keeps a write in memory until a later statement + runs outside a transaction, and `Sqlite3Delegate.setSchemaVersion` writes the + schema version last, without flushing (drift 2.35.0). A browser that opened + the replica and closed before writing anything else lost the version, and + every later open failed creating tables that exist. Reproduced in Chrome with + shared-worker storage. +- 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/`. +`eigen_flutter` holds `drift` to the minor line the files come from +(`>=2.35.0 <2.36.0`), because the worker and the module are one pair from one +drift release. An exact pin would be tighter, but pub does not publish a +single-version constraint, and drift keeps its worker protocol compatible within +a minor line. 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 +(keeping an existing database in the storage it is in), 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, one +statement runs straight after the database first opens, so the schema version +opening wrote is persisted. + +### 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. + +### 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. What drift's + connection does then is untested on a device. +- The schema-version flush works around drift; it should be reported upstream + and removed once drift persists `setSchemaVersion` itself. +- `navigator.storage.persist()` prompts in Firefox, and is asked when the first + local game is created rather than behind an explanation. 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/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..1d8e570a 100644 --- a/flutter/CHANGELOG.md +++ b/flutter/CHANGELOG.md @@ -14,6 +14,19 @@ 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`). + +### 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. + +### 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. + ## [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 +340,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..5709f838 --- /dev/null +++ b/flutter/assets/drift/README.md @@ -0,0 +1,15 @@ +# 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` holds `drift` to the 2.35 line, so no app can resolve a drift +minor release the worker was not built with. (Exact would be tighter, but pub +does not publish a single-version constraint.) Moving that constraint means +replacing both files from the matching release in the same change. 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/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/replica_host.dart b/flutter/lib/core/replica/replica_host.dart index 4540c576..14da759d 100644 --- a/flutter/lib/core/replica/replica_host.dart +++ b/flutter/lib/core/replica/replica_host.dart @@ -13,25 +13,33 @@ 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, } /// 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; - /// Runs [body] while holding [name], so two tabs of the app never run it at - /// once. Immediate on native, which has one process. + /// 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 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 @@ -40,3 +48,17 @@ abstract interface class ReplicaHost { /// no-op on native. 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..09a467c3 100644 --- a/flutter/lib/core/replica/replica_host_io.dart +++ b/flutter/lib/core/replica/replica_host_io.dart @@ -14,10 +14,16 @@ 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 Future requestPersistence() async {} diff --git a/flutter/lib/core/replica/replica_host_web.dart b/flutter/lib/core/replica/replica_host_web.dart index 39f764b9..ee36a9d0 100644 --- a/flutter/lib/core/replica/replica_host_web.dart +++ b/flutter/lib/core/replica/replica_host_web.dart @@ -1,68 +1,145 @@ 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 '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, + ); + final storage = _choose(probe, name); + final tabLock = '$name-tab'; + if (storage == WasmStorageImplementation.unsafeIndexedDb && + !await _TabLocks.take(tabLock)) { + return _BrowserReplicaHost.heldElsewhere(_TabLocks.wait(tabLock)); } - 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, - ), - ), + var connection = await probe.open(storage, name); + if (storage.storageApi == WebStorageApi.indexedDb) { + connection = connection.interceptWith(_PersistOpening()); + } + return _BrowserReplicaHost( + connection, + storage == WasmStorageImplementation.inMemory + ? ReplicaStorage.ephemeral + : ReplicaStorage.persistent, ); - 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 opening the database durable in IndexedDB. +/// +/// Drift's IndexedDB storage holds a write in memory until a later statement +/// runs outside a transaction, and the last thing opening a database writes is +/// its schema version, after every migration statement has already been saved. +/// A tab that closes before writing anything else loses just that, and every +/// later open then runs the creating migration against tables that exist, and +/// fails, for good. So one statement runs straight after the first open. +/// (drift 2.35.0; `Sqlite3Delegate.setSchemaVersion` does not flush.) +final class _PersistOpening extends QueryInterceptor { + Future? _persisted; + + @override + Future ensureOpen( + QueryExecutor executor, + QueryExecutorUser user, + ) async { + final opened = await executor.ensureOpen(user); + try { + await (_persisted ??= executor.runCustom('SELECT 1')); + } on Object { + _persisted = null; + rethrow; + } + return opened; + } +} + +/// The most reliable storage the browser offers, except that a database that +/// already exists stays in the storage it is in: any other would open empty. +WasmStorageImplementation _choose(WasmProbeResult probe, String name) { + final available = [...probe.availableStorages] + ..sort((a, b) => a.index.compareTo(b.index)); + final existing = { + for (final (api, database) in probe.existingDatabases) + if (database == name) api, + }; + for (final storage in available) { + if (existing.contains(storage.storageApi)) return storage; + } + return available.firstOrNull ?? WasmStorageImplementation.inMemory; +} + +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) + : available = Future.value(); + + _BrowserReplicaHost.heldElsewhere(this.available) + : executor = null, + storage = ReplicaStorage.heldElsewhere; @override final QueryExecutor? executor; @override - final Future storage; + final ReplicaStorage storage; + + @override + final Future available; @override Future exclusively(String name, Future Function() body) async { diff --git a/flutter/lib/core/replica/replica_providers.dart b/flutter/lib/core/replica/replica_providers.dart index 122acb73..0b0cd358 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,19 +43,10 @@ Future replicaDatabase(Ref ref) async { return database; } -/// 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. @Riverpod(keepAlive: true) -Future replicaStorage(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; -} +Future replicaStorage(Ref ref) async => + (await ref.watch(replicaHostProvider.future)).storage; /// The replica's public reference data: identities, bots, ratings. @Riverpod(keepAlive: true) @@ -64,8 +69,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..a9553c18 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,12 @@ final class ReplicaDatabaseProvider String _$replicaDatabaseHash() => r'6f5b5807d733499e987f467c0d15fee73d6e6814'; -/// 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. @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 +138,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 +165,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/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/sync/providers/sync_providers.dart b/flutter/lib/features/sync/providers/sync_providers.dart index 58a43dfc..01602c26 100644 --- a/flutter/lib/features/sync/providers/sync_providers.dart +++ b/flutter/lib/features/sync/providers/sync_providers.dart @@ -16,6 +16,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 +28,9 @@ 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), ); } @@ -37,9 +41,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 +66,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 +98,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..a2545552 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'62b893ed214a29afd5fe57cd596eec70f0db6390'; /// 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/testing/memory_replica_host.dart b/flutter/lib/testing/memory_replica_host.dart index 013126fc..bfde77a8 100644 --- a/flutter/lib/testing/memory_replica_host.dart +++ b/flutter/lib/testing/memory_replica_host.dart @@ -24,10 +24,16 @@ final class MemoryReplicaHost implements ReplicaHost { final QueryExecutor executor = NativeDatabase.memory(); @override - Future get storage async => storageMode; + ReplicaStorage get storage => storageMode; @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 Future requestPersistence() async {} diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index e73e0961..2db5b385 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -34,7 +34,12 @@ dependencies: shared_preferences: ^2.5.4 cached_network_image: ^4.0.0 connectivity_plus: ^7.1.1 - drift: ^2.35.0 + # Held to one minor line, because `assets/drift/` carries this release's web + # worker and SQLite module, and a browser's database is only as sound as that + # pairing. Exact would be tighter, but pub refuses to publish a single-version + # constraint, and drift keeps its worker protocol within a minor line. Moving + # this means replacing both files from the matching drift release. + drift: ">=2.35.0 <2.36.0" drift_flutter: ^0.3.1 # The generated REST client. It is produced and published by the ENGINE repo # (eigen-server/clients/dart), because that is where the wire contract lives: @@ -70,6 +75,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 +85,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/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 03e9d20ed7714dc3ba2f2755af5fbaaa23ce5fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748686 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 z 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

ile3f6j=#0ah@9~ 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 Wy0AE}u*8^KHrlk-SW;vv&i^-X=&uI= 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..07334d76 100644 --- a/shell/CHANGELOG.md +++ b/shell/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog All notable changes to this project will be documented in this file. +## [Unreleased] +### 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 +58,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/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..5926ecc9 100644 --- a/shell/lib/src/app_runner.dart +++ b/shell/lib/src/app_runner.dart @@ -123,10 +123,10 @@ class MyApp extends ConsumerWidget { /// Stops the app where the browser gives it nowhere to keep its data. /// /// 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}); @@ -143,7 +143,7 @@ class _ReplicaGate extends ConsumerWidget { 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( 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/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..8081cb1f 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 @@ -195,11 +197,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 +231,26 @@ 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. - **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. +- **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/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. From 8aad23d6971bbaa73bd8c6da2eeceec1b7678ee4 Mon Sep 17 00:00:00 2001 From: Seenu K Date: Thu, 17 Sep 2026 16:30:50 +0530 Subject: [PATCH 2/4] fix: address IndexedDB transaction persistence issues in Drift's web runtime --- .../0014-web-application-shell.md | 36 +++++---- docs/blockers.md | 62 +++++++++++++++ flutter/CHANGELOG.md | 6 ++ flutter/assets/drift/README.md | 9 ++- .../lib/core/replica/replica_host_web.dart | 77 +++++++++++++++---- flutter/pubspec.yaml | 16 ++-- 6 files changed, 164 insertions(+), 42 deletions(-) diff --git a/docs/architecture/0014-web-application-shell.md b/docs/architecture/0014-web-application-shell.md index e6be5ac0..e283393d 100644 --- a/docs/architecture/0014-web-application-shell.md +++ b/docs/architecture/0014-web-application-shell.md @@ -26,12 +26,13 @@ verified in a browser or in the source of the library involved: - 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 keeps a write in memory until a later statement - runs outside a transaction, and `Sqlite3Delegate.setSchemaVersion` writes the - schema version last, without flushing (drift 2.35.0). A browser that opened - the replica and closed before writing anything else lost the version, and - every later open failed creating tables that exist. Reproduced in Chrome with - shared-worker storage. +- 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. @@ -76,11 +77,11 @@ it controls the page. `sqlite3.wasm` and `drift_worker.js` are web-only package assets of `eigen_flutter`, served at `assets/packages/eigen_flutter/assets/drift/`. -`eigen_flutter` holds `drift` to the minor line the files come from -(`>=2.35.0 <2.36.0`), because the worker and the module are one pair from one -drift release. An exact pin would be tighter, but pub does not publish a -single-version constraint, and drift keeps its worker protocol compatible within -a minor line. No app or template carries a copy. +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 @@ -95,9 +96,10 @@ whether this tab may open it: 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, one -statement runs straight after the database first opens, so the schema version -opening wrote is persisted. +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 @@ -169,7 +171,9 @@ only tab closed. - Chrome for Android shipped shared workers in Chrome 148, with a documented caveat that one may be terminated when the app is backgrounded. What drift's connection does then is untested on a device. -- The schema-version flush works around drift; it should be reported upstream - and removed once drift persists `setSchemaVersion` itself. +- 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. + An existing database stays in IndexedDB even once a browser offers OPFS. - `navigator.storage.persist()` prompts in Firefox, and is asked when the first local game is created rather than behind an explanation. 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/flutter/CHANGELOG.md b/flutter/CHANGELOG.md index 1d8e570a..4711440b 100644 --- a/flutter/CHANGELOG.md +++ b/flutter/CHANGELOG.md @@ -17,15 +17,21 @@ 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. ### 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. ### 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 diff --git a/flutter/assets/drift/README.md b/flutter/assets/drift/README.md index 5709f838..10d35fbe 100644 --- a/flutter/assets/drift/README.md +++ b/flutter/assets/drift/README.md @@ -9,7 +9,8 @@ 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` holds `drift` to the 2.35 line, so no app can resolve a drift -minor release the worker was not built with. (Exact would be tighter, but pub -does not publish a single-version constraint.) Moving that constraint means -replacing both files from the matching release in the same change. +`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/lib/core/replica/replica_host_web.dart b/flutter/lib/core/replica/replica_host_web.dart index ee36a9d0..b4a89738 100644 --- a/flutter/lib/core/replica/replica_host_web.dart +++ b/flutter/lib/core/replica/replica_host_web.dart @@ -35,7 +35,9 @@ Future openReplicaHost({required String name}) async { } var connection = await probe.open(storage, name); if (storage.storageApi == WebStorageApi.indexedDb) { - connection = connection.interceptWith(_PersistOpening()); + connection = connection.interceptWith( + _PersistToIndexedDb(connection.executor), + ); } return _BrowserReplicaHost( connection, @@ -45,17 +47,34 @@ Future openReplicaHost({required String name}) async { ); } -/// Makes opening the database durable in IndexedDB. +/// 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: /// -/// Drift's IndexedDB storage holds a write in memory until a later statement -/// runs outside a transaction, and the last thing opening a database writes is -/// its schema version, after every migration statement has already been saved. -/// A tab that closes before writing anything else loses just that, and every -/// later open then runs the creating migration against tables that exist, and -/// fails, for good. So one statement runs straight after the first open. -/// (drift 2.35.0; `Sqlite3Delegate.setSchemaVersion` does not flush.) -final class _PersistOpening extends QueryInterceptor { - Future? _persisted; +/// - 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( @@ -63,14 +82,40 @@ final class _PersistOpening extends QueryInterceptor { QueryExecutorUser user, ) async { final opened = await executor.ensureOpen(user); - try { - await (_persisted ??= executor.runCustom('SELECT 1')); - } on Object { - _persisted = null; - rethrow; + 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'); } /// The most reliable storage the browser offers, except that a database that diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 2db5b385..98230006 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -34,12 +34,16 @@ dependencies: shared_preferences: ^2.5.4 cached_network_image: ^4.0.0 connectivity_plus: ^7.1.1 - # Held to one minor line, because `assets/drift/` carries this release's web - # worker and SQLite module, and a browser's database is only as sound as that - # pairing. Exact would be tighter, but pub refuses to publish a single-version - # constraint, and drift keeps its worker protocol within a minor line. Moving - # this means replacing both files from the matching drift release. - drift: ">=2.35.0 <2.36.0" + # `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 # (eigen-server/clients/dart), because that is where the wire contract lives: From 5ca3d981329fffd78e3d83cf02b32200e195c43d Mon Sep 17 00:00:00 2001 From: Seenu K Date: Thu, 17 Sep 2026 17:38:54 +0530 Subject: [PATCH 3/4] feat: offer browser storage persistence, and let an app set the replay budget A browser may clear a site's storage, and a game played on the device 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 the app now explains first: the home screen offers it while such a game exists, once, and never on a device. Creating a local game no longer asks silently at a moment that explains nothing. `ReplicaHost` reports persistence as a state, so the offer is made only where the browser has neither granted nor refused it. How many ended online games keep their replay is now `ReplicaConfig.keptReplays` on `AppConfig`, which answers an open question of decision 0013. It matters most in a browser, where drift holds the whole replica in memory. Also drops the storage chooser's rule that kept an existing database in the storage it was created in: that is compatibility for data no player has yet. Co-Authored-By: Claude Opus 5 --- .../0014-web-application-shell.md | 29 ++++- flutter/CHANGELOG.md | 2 + flutter/lib/core/config/app_config.dart | 31 ++++- flutter/lib/core/replica/replica_host.dart | 31 ++++- flutter/lib/core/replica/replica_host_io.dart | 6 +- .../lib/core/replica/replica_host_web.dart | 44 ++++--- flutter/lib/eigen_flutter.dart | 2 +- .../game/providers/keep_local_games.dart | 60 +++++++++ .../game/providers/keep_local_games.g.dart | 103 +++++++++++++++ .../game/providers/local_game_providers.dart | 10 +- .../providers/local_game_providers.g.dart | 2 +- .../sync/providers/sync_providers.dart | 2 + .../sync/providers/sync_providers.g.dart | 2 +- flutter/lib/shell_support.dart | 3 +- flutter/lib/testing/memory_replica_host.dart | 22 +++- .../game/providers/keep_local_games_test.dart | 118 ++++++++++++++++++ shell/CHANGELOG.md | 3 + .../widgets/keep_local_games_card.dart | 110 ++++++++++++++++ .../presentation/screens/home_screen.dart | 2 + .../keep_local_games_card_test.dart | 102 +++++++++++++++ web/docs/how-it-works/the-client-app.md | 27 +++- web/docs/ship-it/configure.md | 5 +- 22 files changed, 666 insertions(+), 50 deletions(-) create mode 100644 flutter/lib/features/game/providers/keep_local_games.dart create mode 100644 flutter/lib/features/game/providers/keep_local_games.g.dart create mode 100644 flutter/test/features/game/providers/keep_local_games_test.dart create mode 100644 shell/lib/features/game/presentation/widgets/keep_local_games_card.dart create mode 100644 shell/test/features/game/presentation/keep_local_games_card_test.dart diff --git a/docs/architecture/0014-web-application-shell.md b/docs/architecture/0014-web-application-shell.md index e283393d..8f82c5e1 100644 --- a/docs/architecture/0014-web-application-shell.md +++ b/docs/architecture/0014-web-application-shell.md @@ -85,9 +85,8 @@ 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 -(keeping an existing database in the storage it is in), and only then decides -whether this tab may open it: +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. @@ -114,6 +113,20 @@ 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. + ### Coming back is `onShow` The app refreshes (sync pass, update check, notification reconciliation, the @@ -174,6 +187,10 @@ only tab closed. - 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. - An existing database stays in IndexedDB even once a browser offers OPFS. -- `navigator.storage.persist()` prompts in Firefox, and is asked when the first - local game is created rather than behind an explanation. + 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/flutter/CHANGELOG.md b/flutter/CHANGELOG.md index 4711440b..32e7ba6f 100644 --- a/flutter/CHANGELOG.md +++ b/flutter/CHANGELOG.md @@ -18,6 +18,7 @@ for how this package, the engine and the generated `eigen_api` client pair up. ### 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. ### 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. @@ -26,6 +27,7 @@ for how this package, the engine and the generated `eigen_api` client pair up. - 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. 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/replica/replica_host.dart b/flutter/lib/core/replica/replica_host.dart index 14da759d..b987419a 100644 --- a/flutter/lib/core/replica/replica_host.dart +++ b/flutter/lib/core/replica/replica_host.dart @@ -19,6 +19,20 @@ enum ReplicaStorage { 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 (decisions 0013 and /// 0014). @@ -42,11 +56,18 @@ abstract interface class ReplicaHost { /// 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 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 diff --git a/flutter/lib/core/replica/replica_host_io.dart b/flutter/lib/core/replica/replica_host_io.dart index 09a467c3..1a914390 100644 --- a/flutter/lib/core/replica/replica_host_io.dart +++ b/flutter/lib/core/replica/replica_host_io.dart @@ -26,5 +26,9 @@ final class _FileReplicaHost implements ReplicaHost { _locks.exclusively(name, body); @override - Future requestPersistence() async {} + Future persistence() async => StoragePersistence.granted; + + @override + 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 b4a89738..c9e44d6a 100644 --- a/flutter/lib/core/replica/replica_host_web.dart +++ b/flutter/lib/core/replica/replica_host_web.dart @@ -27,7 +27,11 @@ Future openReplicaHost({required String name}) async { driftWorkerUri: _asset('drift_worker.js'), databaseName: name, ); - final storage = _choose(probe, 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)) { @@ -118,21 +122,6 @@ final class _PersistToIndexedDb extends QueryInterceptor { Future _save() => _root.runCustom('SELECT 1'); } -/// The most reliable storage the browser offers, except that a database that -/// already exists stays in the storage it is in: any other would open empty. -WasmStorageImplementation _choose(WasmProbeResult probe, String name) { - final available = [...probe.availableStorages] - ..sort((a, b) => a.index.compareTo(b.index)); - final existing = { - for (final (api, database) in probe.existingDatabases) - if (database == name) api, - }; - for (final storage in available) { - if (existing.contains(storage.storageApi)) return storage; - } - return available.firstOrNull ?? WasmStorageImplementation.inMemory; -} - Uri _asset(String file) => Uri.parse(web.document.baseURI).resolve('$_runtime/$file'); @@ -194,7 +183,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/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/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 01602c26..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'; @@ -31,6 +32,7 @@ Future syncPass(Ref ref) async { // 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, ); } diff --git a/flutter/lib/features/sync/providers/sync_providers.g.dart b/flutter/lib/features/sync/providers/sync_providers.g.dart index a2545552..1aac4b1f 100644 --- a/flutter/lib/features/sync/providers/sync_providers.g.dart +++ b/flutter/lib/features/sync/providers/sync_providers.g.dart @@ -49,7 +49,7 @@ final class SyncPassProvider } } -String _$syncPassHash() => r'62b893ed214a29afd5fe57cd596eec70f0db6390'; +String _$syncPassHash() => r'341b64cbb30b10a12b5d99d2c8968ddd8bf20860'; /// Runs the account's sync pass whenever there is reason to (decision 0013). /// 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 bfde77a8..a3776205 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,6 +23,13 @@ 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(); @@ -36,5 +46,13 @@ final class MemoryReplicaHost implements ReplicaHost { _locks.exclusively(name, body); @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/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/shell/CHANGELOG.md b/shell/CHANGELOG.md index 07334d76..41bbd286 100644 --- a/shell/CHANGELOG.md +++ b/shell/CHANGELOG.md @@ -2,6 +2,9 @@ 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. + ### 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. 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/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/web/docs/how-it-works/the-client-app.md b/web/docs/how-it-works/the-client-app.md index 8081cb1f..31962105 100644 --- a/web/docs/how-it-works/the-client-app.md +++ b/web/docs/how-it-works/the-client-app.md @@ -173,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. @@ -234,8 +250,11 @@ bypassing Riverpod's retry backoff. 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 kind one shared worker hosts for all of them, which 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. From f8238e0223ad14bfd1f38b025278b371a04a5111 Mon Sep 17 00:00:00 2001 From: Seenu K Date: Thu, 17 Sep 2026 17:50:00 +0530 Subject: [PATCH 4/4] feat: say when the replica stops answering, and offer the reload that fixes it 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 never answers, lists keep what they last read, and writes wait forever. The app looked frozen with nothing to act on, and only a reload recovered it. There is no signal to listen for, so statements are timed. 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: a banner says the app stopped responding and offers a reload, which opens everything again. Every committed write is already stored, so that is all it costs. Co-Authored-By: Claude Opus 5 --- .../0014-web-application-shell.md | 19 ++- flutter/CHANGELOG.md | 1 + flutter/lib/core/replica/answering_watch.dart | 111 ++++++++++++++++ flutter/lib/core/replica/replica_host.dart | 8 ++ flutter/lib/core/replica/replica_host_io.dart | 3 + .../lib/core/replica/replica_host_web.dart | 18 ++- .../lib/core/replica/replica_providers.dart | 12 ++ .../lib/core/replica/replica_providers.g.dart | 50 +++++++ flutter/lib/shared/widgets/status_banner.dart | 19 ++- flutter/lib/testing/memory_replica_host.dart | 3 + .../core/replica/answering_watch_test.dart | 123 ++++++++++++++++++ shell/CHANGELOG.md | 1 + shell/lib/src/app_runner.dart | 45 +++++-- web/docs/how-it-works/the-client-app.md | 5 + 14 files changed, 398 insertions(+), 20 deletions(-) create mode 100644 flutter/lib/core/replica/answering_watch.dart create mode 100644 flutter/test/core/replica/answering_watch_test.dart diff --git a/docs/architecture/0014-web-application-shell.md b/docs/architecture/0014-web-application-shell.md index 8f82c5e1..4ddb0572 100644 --- a/docs/architecture/0014-web-application-shell.md +++ b/docs/architecture/0014-web-application-shell.md @@ -127,6 +127,20 @@ 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 @@ -182,8 +196,9 @@ 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. What drift's - connection does then is untested on a device. + 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. diff --git a/flutter/CHANGELOG.md b/flutter/CHANGELOG.md index 32e7ba6f..5d22f93c 100644 --- a/flutter/CHANGELOG.md +++ b/flutter/CHANGELOG.md @@ -19,6 +19,7 @@ for how this package, the engine and the generated `eigen_api` client pair up. - 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. 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 b987419a..ed89e296 100644 --- a/flutter/lib/core/replica/replica_host.dart +++ b/flutter/lib/core/replica/replica_host.dart @@ -56,6 +56,14 @@ abstract interface class ReplicaHost { /// at the same time, in this process or in another tab of the app. Future exclusively(String name, Future Function() body); + /// 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 diff --git a/flutter/lib/core/replica/replica_host_io.dart b/flutter/lib/core/replica/replica_host_io.dart index 1a914390..261ec89a 100644 --- a/flutter/lib/core/replica/replica_host_io.dart +++ b/flutter/lib/core/replica/replica_host_io.dart @@ -25,6 +25,9 @@ final class _FileReplicaHost implements ReplicaHost { Future exclusively(String name, Future Function() body) => _locks.exclusively(name, body); + @override + Stream get answering => Stream.value(true); + @override Future persistence() async => StoragePersistence.granted; diff --git a/flutter/lib/core/replica/replica_host_web.dart b/flutter/lib/core/replica/replica_host_web.dart index c9e44d6a..9fb69d7c 100644 --- a/flutter/lib/core/replica/replica_host_web.dart +++ b/flutter/lib/core/replica/replica_host_web.dart @@ -5,6 +5,7 @@ import 'package:drift/drift.dart'; import 'package:drift/wasm.dart'; import 'package:web/web.dart' as web; +import 'answering_watch.dart'; import 'replica_host.dart'; /// Where drift's web runtime is served from: this package's own web assets. @@ -43,11 +44,15 @@ Future openReplicaHost({required String name}) async { _PersistToIndexedDb(connection.executor), ); } + // Outermost, so it times everything the database is asked, the line above + // included. + final watch = AnsweringWatch(); return _BrowserReplicaHost( - connection, + connection.interceptWith(watch), storage == WasmStorageImplementation.inMemory ? ReplicaStorage.ephemeral : ReplicaStorage.persistent, + watch, ); } @@ -159,12 +164,19 @@ abstract final class _TabLocks { } final class _BrowserReplicaHost implements ReplicaHost { - _BrowserReplicaHost(QueryExecutor this.executor, this.storage) + _BrowserReplicaHost(QueryExecutor this.executor, this.storage, this._watch) : available = Future.value(); _BrowserReplicaHost.heldElsewhere(this.available) : executor = null, - storage = ReplicaStorage.heldElsewhere; + 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; diff --git a/flutter/lib/core/replica/replica_providers.dart b/flutter/lib/core/replica/replica_providers.dart index 0b0cd358..e04cfd12 100644 --- a/flutter/lib/core/replica/replica_providers.dart +++ b/flutter/lib/core/replica/replica_providers.dart @@ -43,6 +43,18 @@ Future replicaDatabase(Ref ref) async { return database; } +/// 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. +@Riverpod(keepAlive: true) +Stream replicaAnswering(Ref ref) async* { + final host = await ref.watch(replicaHostProvider.future); + 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 => diff --git a/flutter/lib/core/replica/replica_providers.g.dart b/flutter/lib/core/replica/replica_providers.g.dart index a9553c18..06b9353e 100644 --- a/flutter/lib/core/replica/replica_providers.g.dart +++ b/flutter/lib/core/replica/replica_providers.g.dart @@ -123,6 +123,56 @@ final class ReplicaDatabaseProvider String _$replicaDatabaseHash() => r'6f5b5807d733499e987f467c0d15fee73d6e6814'; +/// 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. + +@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) 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/testing/memory_replica_host.dart b/flutter/lib/testing/memory_replica_host.dart index a3776205..d7406992 100644 --- a/flutter/lib/testing/memory_replica_host.dart +++ b/flutter/lib/testing/memory_replica_host.dart @@ -45,6 +45,9 @@ final class MemoryReplicaHost implements ReplicaHost { Future exclusively(String name, Future Function() body) => _locks.exclusively(name, body); + @override + Stream get answering => Stream.value(true); + @override Future persistence() async => persistenceMode; 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/shell/CHANGELOG.md b/shell/CHANGELOG.md index 41bbd286..1dfa67c1 100644 --- a/shell/CHANGELOG.md +++ b/shell/CHANGELOG.md @@ -4,6 +4,7 @@ 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. diff --git a/shell/lib/src/app_runner.dart b/shell/lib/src/app_runner.dart index 5926ecc9..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,7 +121,7 @@ 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, says so, and opens @@ -136,8 +137,8 @@ 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', @@ -145,9 +146,33 @@ class _ReplicaGate extends ConsumerWidget { 'This browser can only use the app in one tab at a time. ' '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/web/docs/how-it-works/the-client-app.md b/web/docs/how-it-works/the-client-app.md index 31962105..6e5c029e 100644 --- a/web/docs/how-it-works/the-client-app.md +++ b/web/docs/how-it-works/the-client-app.md @@ -267,6 +267,11 @@ The same code runs, with these differences a browser forces: 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.