From 01dc3f387ac9e2eea881c3c10c9291ba53f0e748 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Tue, 3 May 2022 19:48:06 +0100 Subject: [PATCH 1/7] refactor: moved gravity logic to `BallGravitatingBehavior` (#314) --- .../lib/src/components/ball/ball.dart | 27 +------- .../behaviors/ball_gravitating_behavior.dart | 35 +++++++++++ .../components/ball/behaviors/behaviors.dart | 1 + .../test/src/components/ball/ball_test.dart | 25 +++++--- .../ball_gravitating_behavior_test.dart | 63 +++++++++++++++++++ .../behaviors/ball_scaling_behavior_test.dart | 18 +----- 6 files changed, 121 insertions(+), 48 deletions(-) create mode 100644 packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart create mode 100644 packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart diff --git a/packages/pinball_components/lib/src/components/ball/ball.dart b/packages/pinball_components/lib/src/components/ball/ball.dart index 4f913c2c..dea4c0b4 100644 --- a/packages/pinball_components/lib/src/components/ball/ball.dart +++ b/packages/pinball_components/lib/src/components/ball/ball.dart @@ -5,6 +5,7 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/widgets.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/ball_gravitating_behavior.dart'; import 'package:pinball_components/src/components/ball/behaviors/ball_scaling_behavior.dart'; import 'package:pinball_flame/pinball_flame.dart'; @@ -21,6 +22,7 @@ class Ball extends BodyComponent children: [ _BallSpriteComponent()..tint(baseColor.withOpacity(0.5)), BallScalingBehavior(), + BallGravitatingBehavior(), ], ) { // TODO(ruimiguel): while developing Ball can be launched by clicking mouse, @@ -86,31 +88,6 @@ class Ball extends BodyComponent body.linearVelocity = impulse; await add(_TurboChargeSpriteAnimationComponent()); } - - @override - void update(double dt) { - super.update(dt); - - _setPositionalGravity(); - } - - void _setPositionalGravity() { - final defaultGravity = gameRef.world.gravity.y; - final maxXDeviationFromCenter = BoardDimensions.bounds.width / 2; - const maxXGravityPercentage = - (1 - BoardDimensions.perspectiveShrinkFactor) / 2; - final xDeviationFromCenter = body.position.x; - - final positionalXForce = ((xDeviationFromCenter / maxXDeviationFromCenter) * - maxXGravityPercentage) * - defaultGravity; - - final positionalYForce = math.sqrt( - math.pow(defaultGravity, 2) - math.pow(positionalXForce, 2), - ); - - body.gravityOverride = Vector2(positionalXForce, positionalYForce); - } } class _BallSpriteComponent extends SpriteComponent with HasGameRef { diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart b/packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart new file mode 100644 index 00000000..bad129a6 --- /dev/null +++ b/packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart @@ -0,0 +1,35 @@ +import 'dart:math' as math; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +/// Scales the ball's gravity according to its position on the board. +class BallGravitatingBehavior extends Component + with ParentIsA, HasGameRef { + @override + void update(double dt) { + super.update(dt); + final defaultGravity = gameRef.world.gravity.y; + + final maxXDeviationFromCenter = BoardDimensions.bounds.width / 2; + const maxXGravityPercentage = + (1 - BoardDimensions.perspectiveShrinkFactor) / 2; + final xDeviationFromCenter = parent.body.position.x; + + final positionalXForce = ((xDeviationFromCenter / maxXDeviationFromCenter) * + maxXGravityPercentage) * + defaultGravity; + final positionalYForce = math.sqrt( + math.pow(defaultGravity, 2) - math.pow(positionalXForce, 2), + ); + + final gravityOverride = parent.body.gravityOverride; + if (gravityOverride != null) { + gravityOverride.setValues(positionalXForce, positionalYForce); + } else { + parent.body.gravityOverride = Vector2(positionalXForce, positionalYForce); + } + } +} diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart index 22928734..038b7833 100644 --- a/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart +++ b/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart @@ -1 +1,2 @@ +export 'ball_gravitating_behavior.dart'; export 'ball_scaling_behavior.dart'; diff --git a/packages/pinball_components/test/src/components/ball/ball_test.dart b/packages/pinball_components/test/src/components/ball/ball_test.dart index 321e137b..02175f16 100644 --- a/packages/pinball_components/test/src/components/ball/ball_test.dart +++ b/packages/pinball_components/test/src/components/ball/ball_test.dart @@ -36,13 +36,24 @@ void main() { }, ); - flameTester.test('add a BallScalingBehavior', (game) async { - final ball = Ball(baseColor: baseColor); - await game.ensureAdd(ball); - expect( - ball.descendants().whereType().length, - equals(1), - ); + group('adds', () { + flameTester.test('a BallScalingBehavior', (game) async { + final ball = Ball(baseColor: baseColor); + await game.ensureAdd(ball); + expect( + ball.descendants().whereType().length, + equals(1), + ); + }); + + flameTester.test('a BallGravitatingBehavior', (game) async { + final ball = Ball(baseColor: baseColor); + await game.ensureAdd(ball); + expect( + ball.descendants().whereType().length, + equals(1), + ); + }); }); group('body', () { diff --git a/packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart b/packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart new file mode 100644 index 00000000..de291f21 --- /dev/null +++ b/packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart @@ -0,0 +1,63 @@ +// ignore_for_file: cascade_invocations + +import 'dart:ui'; + +import 'package:flame/components.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/behaviors.dart'; + +import '../../../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final asset = Assets.images.ball.ball.keyName; + final flameTester = FlameTester(() => TestGame([asset])); + + group('BallGravitatingBehavior', () { + const baseColor = Color(0xFFFFFFFF); + test('can be instantiated', () { + expect( + BallGravitatingBehavior(), + isA(), + ); + }); + + flameTester.test('can be loaded', (game) async { + final ball = Ball.test(baseColor: baseColor); + final behavior = BallGravitatingBehavior(); + await ball.add(behavior); + await game.ensureAdd(ball); + expect( + ball.firstChild(), + equals(behavior), + ); + }); + + flameTester.test( + "overrides the body's horizontal gravity symmetrically", + (game) async { + final ball1 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(10, 0); + await ball1.add(BallGravitatingBehavior()); + + final ball2 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(-10, 0); + await ball2.add(BallGravitatingBehavior()); + + await game.ensureAddAll([ball1, ball2]); + game.update(1); + + expect( + ball1.body.gravityOverride!.x, + equals(-ball2.body.gravityOverride!.x), + ); + expect( + ball1.body.gravityOverride!.y, + equals(ball2.body.gravityOverride!.y), + ); + }, + ); + }); +} diff --git a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart index 42cd9073..cd0a0486 100644 --- a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart +++ b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart @@ -35,17 +35,6 @@ void main() { ); }); - flameTester.test('can be loaded', (game) async { - final ball = Ball.test(baseColor: baseColor); - final behavior = BallScalingBehavior(); - await ball.add(behavior); - await game.ensureAdd(ball); - expect( - ball.firstChild(), - equals(behavior), - ); - }); - flameTester.test('scales the shape radius', (game) async { final ball1 = Ball.test(baseColor: baseColor) ..initialPosition = Vector2(0, 10); @@ -66,9 +55,9 @@ void main() { ); }); - flameTester.testGameWidget( + flameTester.test( 'scales the sprite', - setUp: (game, tester) async { + (game) async { final ball1 = Ball.test(baseColor: baseColor) ..initialPosition = Vector2(0, 10); await ball1.add(BallScalingBehavior()); @@ -80,9 +69,6 @@ void main() { await game.ensureAddAll([ball1, ball2]); game.update(1); - await tester.pump(); - await game.ready(); - final sprite1 = ball1.firstChild()!; final sprite2 = ball2.firstChild()!; expect( From 40104d037dd0bd92d4a23a7962c640f4c6dd8445 Mon Sep 17 00:00:00 2001 From: Tom Arra Date: Tue, 3 May 2022 14:01:43 -0500 Subject: [PATCH 2/7] first config changes for release --- .firebaserc | 5 +++++ firebase.json | 8 ++------ web/__/firebase/8.10.1/firebase-app.js | 2 -- web/__/firebase/8.10.1/firebase-auth.js | 2 -- web/__/firebase/8.10.1/firebase-firestore.js | 2 -- web/__/firebase/init.js | 11 ----------- 6 files changed, 7 insertions(+), 23 deletions(-) create mode 100644 .firebaserc delete mode 100644 web/__/firebase/8.10.1/firebase-app.js delete mode 100644 web/__/firebase/8.10.1/firebase-auth.js delete mode 100644 web/__/firebase/8.10.1/firebase-firestore.js delete mode 100644 web/__/firebase/init.js diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 00000000..98857542 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "io-pinball" + } +} diff --git a/firebase.json b/firebase.json index 80e2ae69..99025785 100644 --- a/firebase.json +++ b/firebase.json @@ -1,11 +1,7 @@ { "hosting": { "public": "build/web", - "site": "ashehwkdkdjruejdnensjsjdne", - "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**" - ] + "site": "io-pinball", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] } } diff --git a/web/__/firebase/8.10.1/firebase-app.js b/web/__/firebase/8.10.1/firebase-app.js deleted file mode 100644 index c688d1c4..00000000 --- a/web/__/firebase/8.10.1/firebase-app.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).firebase=t()}(this,function(){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var n=function(){return(n=Object.assign||function(e){for(var t,n=1,r=arguments.length;na[0]&&t[1]=e.length?void 0:e)&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function f(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||0"})):"Error",e=this.serviceName+": "+e+" ("+o+").";return new c(o,e,i)},v);function v(e,t,n){this.service=e,this.serviceName=t,this.errors=n}var m=/\{\$([^}]+)}/g;function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){t=new b(e,t);return t.subscribe.bind(t)}var b=(I.prototype.next=function(t){this.forEachObserver(function(e){e.next(t)})},I.prototype.error=function(t){this.forEachObserver(function(e){e.error(t)}),this.close(t)},I.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},I.prototype.subscribe=function(e,t,n){var r,i=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n=(null!=o?o:e.logLevel)&&a({level:R[t].toLowerCase(),message:i,args:n,type:e.name})}}(n[e])}var H=((H={})["no-app"]="No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()",H["bad-app-name"]="Illegal App name: '{$appName}",H["duplicate-app"]="Firebase App named '{$appName}' already exists",H["app-deleted"]="Firebase App named '{$appName}' already deleted",H["invalid-app-argument"]="firebase.{$appName}() takes either no argument or a Firebase App instance.",H["invalid-log-argument"]="First argument to `onLog` must be null or a function.",H),V=new d("app","Firebase",H),B="@firebase/app",M="[DEFAULT]",U=((H={})[B]="fire-core",H["@firebase/analytics"]="fire-analytics",H["@firebase/app-check"]="fire-app-check",H["@firebase/auth"]="fire-auth",H["@firebase/database"]="fire-rtdb",H["@firebase/functions"]="fire-fn",H["@firebase/installations"]="fire-iid",H["@firebase/messaging"]="fire-fcm",H["@firebase/performance"]="fire-perf",H["@firebase/remote-config"]="fire-rc",H["@firebase/storage"]="fire-gcs",H["@firebase/firestore"]="fire-fst",H["fire-js"]="fire-js",H["firebase-wrapper"]="fire-js-all",H),W=new z("@firebase/app"),G=(Object.defineProperty($.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this.automaticDataCollectionEnabled_},set:function(e){this.checkDestroyed_(),this.automaticDataCollectionEnabled_=e},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!1,configurable:!0}),$.prototype.delete=function(){var t=this;return new Promise(function(e){t.checkDestroyed_(),e()}).then(function(){return t.firebase_.INTERNAL.removeApp(t.name_),Promise.all(t.container.getProviders().map(function(e){return e.delete()}))}).then(function(){t.isDeleted_=!0})},$.prototype._getService=function(e,t){void 0===t&&(t=M),this.checkDestroyed_();var n=this.container.getProvider(e);return n.isInitialized()||"EXPLICIT"!==(null===(e=n.getComponent())||void 0===e?void 0:e.instantiationMode)||n.initialize(),n.getImmediate({identifier:t})},$.prototype._removeServiceInstance=function(e,t){void 0===t&&(t=M),this.container.getProvider(e).clearInstance(t)},$.prototype._addComponent=function(t){try{this.container.addComponent(t)}catch(e){W.debug("Component "+t.name+" failed to register with FirebaseApp "+this.name,e)}},$.prototype._addOrOverwriteComponent=function(e){this.container.addOrOverwriteComponent(e)},$.prototype.toJSON=function(){return{name:this.name,automaticDataCollectionEnabled:this.automaticDataCollectionEnabled,options:this.options}},$.prototype.checkDestroyed_=function(){if(this.isDeleted_)throw V.create("app-deleted",{appName:this.name_})},$);function $(e,t,n){var r=this;this.firebase_=n,this.isDeleted_=!1,this.name_=t.name,this.automaticDataCollectionEnabled_=t.automaticDataCollectionEnabled||!1,this.options_=h(void 0,e),this.container=new S(t.name),this._addComponent(new O("app",function(){return r},"PUBLIC")),this.firebase_.INTERNAL.components.forEach(function(e){return r._addComponent(e)})}G.prototype.name&&G.prototype.options||G.prototype.delete||console.log("dc");var K="8.10.1";function Y(a){var s={},l=new Map,c={__esModule:!0,initializeApp:function(e,t){void 0===t&&(t={});"object"==typeof t&&null!==t||(t={name:t});var n=t;void 0===n.name&&(n.name=M);t=n.name;if("string"!=typeof t||!t)throw V.create("bad-app-name",{appName:String(t)});if(y(s,t))throw V.create("duplicate-app",{appName:t});n=new a(e,n,c);return s[t]=n},app:u,registerVersion:function(e,t,n){var r=null!==(i=U[e])&&void 0!==i?i:e;n&&(r+="-"+n);var i=r.match(/\s|\//),e=t.match(/\s|\//);i||e?(n=['Unable to register library "'+r+'" with version "'+t+'":'],i&&n.push('library name "'+r+'" contains illegal characters (whitespace or "/")'),i&&e&&n.push("and"),e&&n.push('version name "'+t+'" contains illegal characters (whitespace or "/")'),W.warn(n.join(" "))):o(new O(r+"-version",function(){return{library:r,version:t}},"VERSION"))},setLogLevel:T,onLog:function(e,t){if(null!==e&&"function"!=typeof e)throw V.create("invalid-log-argument");x(e,t)},apps:null,SDK_VERSION:K,INTERNAL:{registerComponent:o,removeApp:function(e){delete s[e]},components:l,useAsService:function(e,t){return"serverAuth"!==t?t:null}}};function u(e){if(!y(s,e=e||M))throw V.create("no-app",{appName:e});return s[e]}function o(n){var e,r=n.name;if(l.has(r))return W.debug("There were multiple attempts to register component "+r+"."),"PUBLIC"===n.type?c[r]:null;l.set(r,n),"PUBLIC"===n.type&&(e=function(e){if("function"!=typeof(e=void 0===e?u():e)[r])throw V.create("invalid-app-argument",{appName:r});return e[r]()},void 0!==n.serviceProps&&h(e,n.serviceProps),c[r]=e,a.prototype[r]=function(){for(var e=[],t=0;t>>0),i=0;function r(t,e,n){return t.call.apply(t.bind,arguments)}function g(e,n,t){if(!e)throw Error();if(2/g,Q=/"/g,tt=/'/g,et=/\x00/g,nt=/[\x00&<>"']/;function it(t,e){return-1!=t.indexOf(e)}function rt(t,e){return t"}else o=void 0===t?"undefined":null===t?"null":typeof t;D("Argument is not a %s (or a non-Element, non-Location mock); got: %s",e,o)}}function dt(t,e){this.a=t===gt&&e||"",this.b=mt}function pt(t){return t instanceof dt&&t.constructor===dt&&t.b===mt?t.a:(D("expected object of type Const, got '"+t+"'"),"type_error:Const")}dt.prototype.ta=!0,dt.prototype.sa=function(){return this.a},dt.prototype.toString=function(){return"Const{"+this.a+"}"};var vt,mt={},gt={};function bt(){if(void 0===vt){var t=null,e=l.trustedTypes;if(e&&e.createPolicy){try{t=e.createPolicy("goog#html",{createHTML:I,createScript:I,createScriptURL:I})}catch(t){l.console&&l.console.error(t.message)}vt=t}else vt=t}return vt}function yt(t,e){this.a=e===At?t:""}function wt(t){return t instanceof yt&&t.constructor===yt?t.a:(D("expected object of type TrustedResourceUrl, got '"+t+"' of type "+d(t)),"type_error:TrustedResourceUrl")}function It(t,n){var e,i=pt(t);if(!Et.test(i))throw Error("Invalid TrustedResourceUrl format: "+i);return t=i.replace(Tt,function(t,e){if(!Object.prototype.hasOwnProperty.call(n,e))throw Error('Found marker, "'+e+'", in format string, "'+i+'", but no valid label mapping found in args: '+JSON.stringify(n));return(t=n[e])instanceof dt?pt(t):encodeURIComponent(String(t))}),e=t,t=bt(),new yt(e=t?t.createScriptURL(e):e,At)}yt.prototype.ta=!0,yt.prototype.sa=function(){return this.a.toString()},yt.prototype.toString=function(){return"TrustedResourceUrl{"+this.a+"}"};var Tt=/%{(\w+)}/g,Et=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i,At={};function kt(t,e){this.a=e===Dt?t:""}function St(t){return t instanceof kt&&t.constructor===kt?t.a:(D("expected object of type SafeUrl, got '"+t+"' of type "+d(t)),"type_error:SafeUrl")}kt.prototype.ta=!0,kt.prototype.sa=function(){return this.a.toString()},kt.prototype.toString=function(){return"SafeUrl{"+this.a+"}"};var Nt=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,_t=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Ot=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ct(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),t=Ot.test(t)||(e=(t=(t=String(t)).replace(/(%0A|%0D)/g,"")).match(_t))&&Nt.test(e[1])?new kt(t,Dt):null);var e}function Rt(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),new kt(t=!Ot.test(t)?"about:invalid#zClosurez":t,Dt))}var Dt={},Pt=new kt("about:invalid#zClosurez",Dt);function Lt(t,e,n){this.a=n===xt?t:""}Lt.prototype.ta=!0,Lt.prototype.sa=function(){return this.a.toString()},Lt.prototype.toString=function(){return"SafeHtml{"+this.a+"}"};var xt={};function Mt(t,e,n,i){return t=t instanceof kt?t:Rt(t),e=e||l,n=n instanceof dt?pt(n):n||"",e.open(St(t),n,i,void 0)}function jt(t){for(var e=t.split("%s"),n="",i=Array.prototype.slice.call(arguments,1);i.length&&1")?t.replace(Z,">"):t).indexOf('"')?t.replace(Q,"""):t).indexOf("'")?t.replace(tt,"'"):t).indexOf("\0")&&(t=t.replace(et,"�"))),t}function Vt(t){return Vt[" "](t),t}Vt[" "]=a;var Ft,qt=at("Opera"),Ht=at("Trident")||at("MSIE"),Kt=at("Edge"),Gt=Kt||Ht,Bt=at("Gecko")&&!(it(J.toLowerCase(),"webkit")&&!at("Edge"))&&!(at("Trident")||at("MSIE"))&&!at("Edge"),Wt=it(J.toLowerCase(),"webkit")&&!at("Edge");function Xt(){var t=l.document;return t?t.documentMode:void 0}t:{var Jt="",Yt=(Yt=J,Bt?/rv:([^\);]+)(\)|;)/.exec(Yt):Kt?/Edge\/([\d\.]+)/.exec(Yt):Ht?/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(Yt):Wt?/WebKit\/(\S+)/.exec(Yt):qt?/(?:Version)[ \/]?(\S+)/.exec(Yt):void 0);if(Yt&&(Jt=Yt?Yt[1]:""),Ht){Yt=Xt();if(null!=Yt&&Yt>parseFloat(Jt)){Ft=String(Yt);break t}}Ft=Jt}var zt={};function $t(s){return t=s,e=function(){for(var t=0,e=Y(String(Ft)).split("."),n=Y(String(s)).split("."),i=Math.max(e.length,n.length),r=0;0==t&&r"),i=i.join("")),i=ae(n,i),r&&("string"==typeof r?i.className=r:Array.isArray(r)?i.className=r.join(" "):ee(i,r)),2>>0);function ln(e){return v(e)?e:(e[hn]||(e[hn]=function(t){return e.handleEvent(t)}),e[hn])}function fn(){Pe.call(this),this.v=new Je(this),(this.bc=this).hb=null}function dn(t,e,n,i,r){t.v.add(String(e),n,!1,i,r)}function pn(t,e,n,i,r){t.v.add(String(e),n,!0,i,r)}function vn(t,e,n,i){if(!(e=t.v.a[String(e)]))return!0;e=e.concat();for(var r=!0,o=0;o>4&15).toString(16)+(15&t).toString(16)}An.prototype.toString=function(){var t=[],e=this.c;e&&t.push(Pn(e,xn,!0),":");var n=this.a;return!n&&"file"!=e||(t.push("//"),(e=this.l)&&t.push(Pn(e,xn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.g)&&t.push(":",String(n))),(n=this.f)&&(this.a&&"/"!=n.charAt(0)&&t.push("/"),t.push(Pn(n,"/"==n.charAt(0)?jn:Mn,!0))),(n=this.b.toString())&&t.push("?",n),(n=this.h)&&t.push("#",Pn(n,Vn)),t.join("")},An.prototype.resolve=function(t){var e=new An(this),n=!!t.c;n?kn(e,t.c):n=!!t.l,n?e.l=t.l:n=!!t.a,n?e.a=t.a:n=null!=t.g;var i=t.f;if(n)Sn(e,t.g);else if(n=!!t.f)if("/"!=i.charAt(0)&&(this.a&&!this.f?i="/"+i:-1!=(r=e.f.lastIndexOf("/"))&&(i=e.f.substr(0,r+1)+i)),".."==(r=i)||"."==r)i="";else if(it(r,"./")||it(r,"/.")){for(var i=0==r.lastIndexOf("/",0),r=r.split("/"),o=[],a=0;a2*t.c&&In(t)))}function Gn(t,e){return qn(t),e=Xn(t,e),Tn(t.a.b,e)}function Bn(t,e,n){Kn(t,e),0',t=new Lt(t=(i=bt())?i.createHTML(t):t,0,xt),i=a.document)&&(i.write((o=t)instanceof Lt&&o.constructor===Lt?o.a:(D("expected object of type SafeHtml, got '"+o+"' of type "+d(o)),"type_error:SafeHtml")),i.close())):(a=Mt(e,i,n,a))&&t.noopener&&(a.opener=null),a)try{a.focus()}catch(t){}return a}var oi=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,ai=/^[^@]+@[^@]+$/;function si(){var e=null;return new fe(function(t){"complete"==l.document.readyState?t():(e=function(){t()},en(window,"load",e))}).o(function(t){throw nn(window,"load",e),t})}function ui(t){return t=t||bi(),!("file:"!==Ei()&&"ionic:"!==Ei()||!t.toLowerCase().match(/iphone|ipad|ipod|android/))}function ci(){var t=l.window;try{return t&&t!=t.top}catch(t){return}}function hi(){return void 0!==l.WorkerGlobalScope&&"function"==typeof l.importScripts}function li(){return Zl.default.INTERNAL.hasOwnProperty("reactNative")?"ReactNative":Zl.default.INTERNAL.hasOwnProperty("node")?"Node":hi()?"Worker":"Browser"}function fi(){var t=li();return"ReactNative"===t||"Node"===t}var di="Firefox",pi="Chrome";function vi(t){var e=t.toLowerCase();return it(e,"opera/")||it(e,"opr/")||it(e,"opios/")?"Opera":it(e,"iemobile")?"IEMobile":it(e,"msie")||it(e,"trident/")?"IE":it(e,"edge/")?"Edge":it(e,"firefox/")?di:it(e,"silk/")?"Silk":it(e,"blackberry")?"Blackberry":it(e,"webos")?"Webos":!it(e,"safari/")||it(e,"chrome/")||it(e,"crios/")||it(e,"android")?!it(e,"chrome/")&&!it(e,"crios/")||it(e,"edge/")?it(e,"android")?"Android":(t=t.match(/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/))&&2==t.length?t[1]:"Other":pi:"Safari"}var mi={md:"FirebaseCore-web",od:"FirebaseUI-web"};function gi(t,e){e=e||[];var n,i=[],r={};for(n in mi)r[mi[n]]=!0;for(n=0;n>4),64!=a&&(t(o<<4&240|a>>2),64!=s&&t(a<<6&192|s))}}(t,function(t){e.push(t)}),e}function Pr(t){var e=xr(t);if(!(e&&e.sub&&e.iss&&e.aud&&e.exp))throw Error("Invalid JWT");this.h=t,this.a=e.exp,this.i=e.sub,t=Date.now()/1e3,this.g=e.iat||(t>this.a?this.a:t),this.b=e.provider_id||e.firebase&&e.firebase.sign_in_provider||null,this.f=e.firebase&&e.firebase.tenant||null,this.c=!!e.is_anonymous||"anonymous"==this.b}function Lr(t){try{return new Pr(t)}catch(t){return null}}function xr(t){if(!t)return null;if(3!=(t=t.split(".")).length)return null;for(var e=(4-(t=t[1]).length%4)%4,n=0;n>10)),t[n++]=String.fromCharCode(56320+(1023&a))):(r=i[e++],o=i[e++],t[n++]=String.fromCharCode((15&s)<<12|(63&r)<<6|63&o))}return JSON.parse(t.join(""))}catch(t){}return null}Pr.prototype.T=function(){return this.f},Pr.prototype.l=function(){return this.c},Pr.prototype.toString=function(){return this.h};var Mr="oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token oauth_version".split(" "),jr=["client_id","response_type","scope","redirect_uri","state"],Ur={nd:{Ja:"locale",va:700,ua:600,fa:"facebook.com",Ya:jr},pd:{Ja:null,va:500,ua:750,fa:"github.com",Ya:jr},qd:{Ja:"hl",va:515,ua:680,fa:"google.com",Ya:jr},wd:{Ja:"lang",va:485,ua:705,fa:"twitter.com",Ya:Mr},kd:{Ja:"locale",va:640,ua:600,fa:"apple.com",Ya:[]}};function Vr(t){for(var e in Ur)if(Ur[e].fa==t)return Ur[e];return null}function Fr(t){var e={};e["facebook.com"]=Br,e["google.com"]=Xr,e["github.com"]=Wr,e["twitter.com"]=Jr;var n=t&&t[Hr];try{if(n)return new(e[n]||Gr)(t);if(void 0!==t[qr])return new Kr(t)}catch(t){}return null}var qr="idToken",Hr="providerId";function Kr(t){var e,n=t[Hr];if(n||!t[qr]||(e=Lr(t[qr]))&&e.b&&(n=e.b),!n)throw Error("Invalid additional user info!");e=!1,void 0!==t.isNewUser?e=!!t.isNewUser:"identitytoolkit#SignupNewUserResponse"===t.kind&&(e=!0),Fi(this,"providerId",n="anonymous"==n||"custom"==n?null:n),Fi(this,"isNewUser",e)}function Gr(t){Kr.call(this,t),Fi(this,"profile",Ki((t=Ni(t.rawUserInfo||"{}"))||{}))}function Br(t){if(Gr.call(this,t),"facebook.com"!=this.providerId)throw Error("Invalid provider ID!")}function Wr(t){if(Gr.call(this,t),"github.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",this.profile&&this.profile.login||null)}function Xr(t){if(Gr.call(this,t),"google.com"!=this.providerId)throw Error("Invalid provider ID!")}function Jr(t){if(Gr.call(this,t),"twitter.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",t.screenName||null)}function Yr(t){var e=On(i=Cn(t),"link"),n=On(Cn(e),"link"),i=On(i,"deep_link_id");return On(Cn(i),"link")||i||n||e||t}function zr(t,e){if(!t&&!e)throw new T("internal-error","Internal assert: no raw session string available");if(t&&e)throw new T("internal-error","Internal assert: unable to determine the session type");this.a=t||null,this.b=e||null,this.type=this.a?$r:Zr}w(Gr,Kr),w(Br,Gr),w(Wr,Gr),w(Xr,Gr),w(Jr,Gr);var $r="enroll",Zr="signin";function Qr(){}function to(t,n){return t.then(function(t){if(t[Ka]){var e=Lr(t[Ka]);if(!e||n!=e.i)throw new T("user-mismatch");return t}throw new T("user-mismatch")}).o(function(t){throw t&&t.code&&t.code==k+"user-not-found"?new T("user-mismatch"):t})}function eo(t,e){if(!e)throw new T("internal-error","failed to construct a credential");this.a=e,Fi(this,"providerId",t),Fi(this,"signInMethod",t)}function no(t){return{pendingToken:t.a,requestUri:"http://localhost"}}function io(t){if(t&&t.providerId&&t.signInMethod&&0==t.providerId.indexOf("saml.")&&t.pendingToken)try{return new eo(t.providerId,t.pendingToken)}catch(t){}return null}function ro(t,e,n){if(this.a=null,e.idToken||e.accessToken)e.idToken&&Fi(this,"idToken",e.idToken),e.accessToken&&Fi(this,"accessToken",e.accessToken),e.nonce&&!e.pendingToken&&Fi(this,"nonce",e.nonce),e.pendingToken&&(this.a=e.pendingToken);else{if(!e.oauthToken||!e.oauthTokenSecret)throw new T("internal-error","failed to construct a credential");Fi(this,"accessToken",e.oauthToken),Fi(this,"secret",e.oauthTokenSecret)}Fi(this,"providerId",t),Fi(this,"signInMethod",n)}function oo(t){var e={};return t.idToken&&(e.id_token=t.idToken),t.accessToken&&(e.access_token=t.accessToken),t.secret&&(e.oauth_token_secret=t.secret),e.providerId=t.providerId,t.nonce&&!t.a&&(e.nonce=t.nonce),e={postBody:Hn(e).toString(),requestUri:"http://localhost"},t.a&&(delete e.postBody,e.pendingToken=t.a),e}function ao(t){if(t&&t.providerId&&t.signInMethod){var e={idToken:t.oauthIdToken,accessToken:t.oauthTokenSecret?null:t.oauthAccessToken,oauthTokenSecret:t.oauthTokenSecret,oauthToken:t.oauthTokenSecret&&t.oauthAccessToken,nonce:t.nonce,pendingToken:t.pendingToken};try{return new ro(t.providerId,e,t.signInMethod)}catch(t){}}return null}function so(t,e){this.Qc=e||[],qi(this,{providerId:t,isOAuthProvider:!0}),this.Jb={},this.qb=(Vr(t)||{}).Ja||null,this.pb=null}function uo(t){if("string"!=typeof t||0!=t.indexOf("saml."))throw new T("argument-error",'SAML provider IDs must be prefixed with "saml."');so.call(this,t,[])}function co(t){so.call(this,t,jr),this.a=[]}function ho(){co.call(this,"facebook.com")}function lo(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new ho).credential({accessToken:e})}function fo(){co.call(this,"github.com")}function po(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new fo).credential({accessToken:e})}function vo(){co.call(this,"google.com"),this.Ca("profile")}function mo(t,e){var n=t;return m(t)&&(n=t.idToken,e=t.accessToken),(new vo).credential({idToken:n,accessToken:e})}function go(){so.call(this,"twitter.com",Mr)}function bo(t,e){var n=t;if(!(n=!m(n)?{oauthToken:t,oauthTokenSecret:e}:n).oauthToken||!n.oauthTokenSecret)throw new T("argument-error","credential failed: expected 2 arguments (the OAuth access token and secret).");return new ro("twitter.com",n,"twitter.com")}function yo(t,e,n){this.a=t,this.f=e,Fi(this,"providerId","password"),Fi(this,"signInMethod",n===Io.EMAIL_LINK_SIGN_IN_METHOD?Io.EMAIL_LINK_SIGN_IN_METHOD:Io.EMAIL_PASSWORD_SIGN_IN_METHOD)}function wo(t){return t&&t.email&&t.password?new yo(t.email,t.password,t.signInMethod):null}function Io(){qi(this,{providerId:"password",isOAuthProvider:!1})}function To(t,e){if(!(e=Eo(e)))throw new T("argument-error","Invalid email link!");return new yo(t,e.code,Io.EMAIL_LINK_SIGN_IN_METHOD)}function Eo(t){return(t=yr(t=Yr(t)))&&t.operation===Qi?t:null}function Ao(t){if(!(t.fb&&t.eb||t.La&&t.ea))throw new T("internal-error");this.a=t,Fi(this,"providerId","phone"),this.fa="phone",Fi(this,"signInMethod","phone")}function ko(e){if(e&&"phone"===e.providerId&&(e.verificationId&&e.verificationCode||e.temporaryProof&&e.phoneNumber)){var n={};return V(["verificationId","verificationCode","temporaryProof","phoneNumber"],function(t){e[t]&&(n[t]=e[t])}),new Ao(n)}return null}function So(t){return t.a.La&&t.a.ea?{temporaryProof:t.a.La,phoneNumber:t.a.ea}:{sessionInfo:t.a.fb,code:t.a.eb}}function No(t){try{this.a=t||Zl.default.auth()}catch(t){throw new T("argument-error","Either an instance of firebase.auth.Auth must be passed as an argument to the firebase.auth.PhoneAuthProvider constructor, or the default firebase App instance must be initialized via firebase.initializeApp().")}qi(this,{providerId:"phone",isOAuthProvider:!1})}function _o(t,e){if(!t)throw new T("missing-verification-id");if(!e)throw new T("missing-verification-code");return new Ao({fb:t,eb:e})}function Oo(t){if(t.temporaryProof&&t.phoneNumber)return new Ao({La:t.temporaryProof,ea:t.phoneNumber});var e=t&&t.providerId;if(!e||"password"===e)return null;var n=t&&t.oauthAccessToken,i=t&&t.oauthTokenSecret,r=t&&t.nonce,o=t&&t.oauthIdToken,a=t&&t.pendingToken;try{switch(e){case"google.com":return mo(o,n);case"facebook.com":return lo(n);case"github.com":return po(n);case"twitter.com":return bo(n,i);default:return n||i||o||a?a?0==e.indexOf("saml.")?new eo(e,a):new ro(e,{pendingToken:a,idToken:t.oauthIdToken,accessToken:t.oauthAccessToken},e):new co(e).credential({idToken:o,accessToken:n,rawNonce:r}):null}}catch(t){return null}}function Co(t){if(!t.isOAuthProvider)throw new T("invalid-oauth-provider")}function Ro(t,e,n,i,r,o,a){if(this.c=t,this.b=e||null,this.g=n||null,this.f=i||null,this.i=o||null,this.h=a||null,this.a=r||null,!this.g&&!this.a)throw new T("invalid-auth-event");if(this.g&&this.a)throw new T("invalid-auth-event");if(this.g&&!this.f)throw new T("invalid-auth-event")}function Do(t){return(t=t||{}).type?new Ro(t.type,t.eventId,t.urlResponse,t.sessionId,t.error&&E(t.error),t.postBody,t.tenantId):null}function Po(){this.b=null,this.a=[]}zr.prototype.Ha=function(){return this.a?ye(this.a):ye(this.b)},zr.prototype.w=function(){return this.type==$r?{multiFactorSession:{idToken:this.a}}:{multiFactorSession:{pendingCredential:this.b}}},Qr.prototype.ka=function(){},Qr.prototype.b=function(){},Qr.prototype.c=function(){},Qr.prototype.w=function(){},eo.prototype.ka=function(t){return ls(t,no(this))},eo.prototype.b=function(t,e){var n=no(this);return n.idToken=e,fs(t,n)},eo.prototype.c=function(t,e){return to(ds(t,no(this)),e)},eo.prototype.w=function(){return{providerId:this.providerId,signInMethod:this.signInMethod,pendingToken:this.a}},ro.prototype.ka=function(t){return ls(t,oo(this))},ro.prototype.b=function(t,e){var n=oo(this);return n.idToken=e,fs(t,n)},ro.prototype.c=function(t,e){return to(ds(t,oo(this)),e)},ro.prototype.w=function(){var t={providerId:this.providerId,signInMethod:this.signInMethod};return this.idToken&&(t.oauthIdToken=this.idToken),this.accessToken&&(t.oauthAccessToken=this.accessToken),this.secret&&(t.oauthTokenSecret=this.secret),this.nonce&&(t.nonce=this.nonce),this.a&&(t.pendingToken=this.a),t},so.prototype.Ka=function(t){return this.Jb=ct(t),this},w(uo,so),w(co,so),co.prototype.Ca=function(t){return K(this.a,t)||this.a.push(t),this},co.prototype.Rb=function(){return X(this.a)},co.prototype.credential=function(t,e){e=m(t)?{idToken:t.idToken||null,accessToken:t.accessToken||null,nonce:t.rawNonce||null}:{idToken:t||null,accessToken:e||null};if(!e.idToken&&!e.accessToken)throw new T("argument-error","credential failed: must provide the ID token and/or the access token.");return new ro(this.providerId,e,this.providerId)},w(ho,co),Fi(ho,"PROVIDER_ID","facebook.com"),Fi(ho,"FACEBOOK_SIGN_IN_METHOD","facebook.com"),w(fo,co),Fi(fo,"PROVIDER_ID","github.com"),Fi(fo,"GITHUB_SIGN_IN_METHOD","github.com"),w(vo,co),Fi(vo,"PROVIDER_ID","google.com"),Fi(vo,"GOOGLE_SIGN_IN_METHOD","google.com"),w(go,so),Fi(go,"PROVIDER_ID","twitter.com"),Fi(go,"TWITTER_SIGN_IN_METHOD","twitter.com"),yo.prototype.ka=function(t){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Is,{email:this.a,oobCode:this.f}):Js(t,Ks,{email:this.a,password:this.f})},yo.prototype.b=function(t,e){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Ts,{idToken:e,email:this.a,oobCode:this.f}):Js(t,xs,{idToken:e,email:this.a,password:this.f})},yo.prototype.c=function(t,e){return to(this.ka(t),e)},yo.prototype.w=function(){return{email:this.a,password:this.f,signInMethod:this.signInMethod}},qi(Io,{PROVIDER_ID:"password"}),qi(Io,{EMAIL_LINK_SIGN_IN_METHOD:"emailLink"}),qi(Io,{EMAIL_PASSWORD_SIGN_IN_METHOD:"password"}),Ao.prototype.ka=function(t){return t.gb(So(this))},Ao.prototype.b=function(t,e){var n=So(this);return n.idToken=e,Js(t,Bs,n)},Ao.prototype.c=function(t,e){var n=So(this);return n.operation="REAUTH",to(t=Js(t,Ws,n),e)},Ao.prototype.w=function(){var t={providerId:"phone"};return this.a.fb&&(t.verificationId=this.a.fb),this.a.eb&&(t.verificationCode=this.a.eb),this.a.La&&(t.temporaryProof=this.a.La),this.a.ea&&(t.phoneNumber=this.a.ea),t},No.prototype.gb=function(i,r){var o=this.a.a;return ye(r.verify()).then(function(e){if("string"!=typeof e)throw new T("argument-error","An implementation of firebase.auth.ApplicationVerifier.prototype.verify() must return a firebase.Promise that resolves with a string.");if("recaptcha"!==r.type)throw new T("argument-error",'Only firebase.auth.ApplicationVerifiers with type="recaptcha" are currently supported.');var t=m(i)?i.session:null,n=m(i)?i.phoneNumber:i,t=t&&t.type==$r?t.Ha().then(function(t){return Js(o,js,{idToken:t,phoneEnrollmentInfo:{phoneNumber:n,recaptchaToken:e}}).then(function(t){return t.phoneSessionInfo.sessionInfo})}):t&&t.type==Zr?t.Ha().then(function(t){return t={mfaPendingCredential:t,mfaEnrollmentId:i.multiFactorHint&&i.multiFactorHint.uid||i.multiFactorUid,phoneSignInInfo:{recaptchaToken:e}},Js(o,Us,t).then(function(t){return t.phoneResponseInfo.sessionInfo})}):Js(o,Ps,{phoneNumber:n,recaptchaToken:e});return t.then(function(t){return"function"==typeof r.reset&&r.reset(),t},function(t){throw"function"==typeof r.reset&&r.reset(),t})})},qi(No,{PROVIDER_ID:"phone"}),qi(No,{PHONE_SIGN_IN_METHOD:"phone"}),Ro.prototype.getUid=function(){var t=[];return t.push(this.c),this.b&&t.push(this.b),this.f&&t.push(this.f),this.h&&t.push(this.h),t.join("-")},Ro.prototype.T=function(){return this.h},Ro.prototype.w=function(){return{type:this.c,eventId:this.b,urlResponse:this.g,sessionId:this.f,postBody:this.i,tenantId:this.h,error:this.a&&this.a.w()}};var Lo,xo=null;function Mo(t){var e="unauthorized-domain",n=void 0,i=Cn(t);t=i.a,"chrome-extension"==(i=i.c)?n=jt("This chrome extension ID (chrome-extension://%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):"http"==i||"https"==i?n=jt("This domain (%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):e="operation-not-supported-in-this-environment",T.call(this,e,n)}function jo(t,e,n){T.call(this,t,n),(t=e||{}).Kb&&Fi(this,"email",t.Kb),t.ea&&Fi(this,"phoneNumber",t.ea),t.credential&&Fi(this,"credential",t.credential),t.$b&&Fi(this,"tenantId",t.$b)}function Uo(t){if(t.code){var e=t.code||"";0==e.indexOf(k)&&(e=e.substring(k.length));var n={credential:Oo(t),$b:t.tenantId};if(t.email)n.Kb=t.email;else if(t.phoneNumber)n.ea=t.phoneNumber;else if(!n.credential)return new T(e,t.message||void 0);return new jo(e,n,t.message)}return null}function Vo(){}function Fo(t){return t.c||(t.c=t.b())}function qo(){}function Ho(t){if(t.f||"undefined"!=typeof XMLHttpRequest||"undefined"==typeof ActiveXObject)return t.f;for(var e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],n=0;n=function t(e){return e.c||(e.a?t(e.a):(D("Root logger has no level set."),null))}(this).value)for(v(e)&&(e=e()),t=new Wo(t,String(e),this.f),n&&(t.a=n),n=this;n;)n=n.a};var Qo,ta={},ea=null;function na(t){var e,n,i;return ea||(ea=new Xo(""),(ta[""]=ea).c=$o),(e=ta[t])||(e=new Xo(t),i=t.lastIndexOf("."),n=t.substr(i+1),(i=na(t.substr(0,i))).b||(i.b={}),(i.b[n]=e).a=i,ta[t]=e),e}function ia(t,e){t&&t.log(Zo,e,void 0)}function ra(t){this.f=t}function oa(t){fn.call(this),this.u=t,this.h=void 0,this.readyState=aa,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.l=new Headers,this.b=null,this.s="GET",this.f="",this.a=!1,this.i=na("goog.net.FetchXmlHttp"),this.m=this.c=this.g=null}w(ra,Vo),ra.prototype.a=function(){return new oa(this.f)},ra.prototype.b=(Qo={},function(){return Qo}),w(oa,fn);var aa=0;function sa(t){t.c.read().then(t.pc.bind(t)).catch(t.Va.bind(t))}function ua(t){t.readyState=4,t.g=null,t.c=null,t.m=null,ca(t)}function ca(t){t.onreadystatechange&&t.onreadystatechange.call(t)}function ha(t){fn.call(this),this.headers=new wn,this.D=t||null,this.c=!1,this.C=this.a=null,this.h=this.P=this.l="",this.f=this.N=this.i=this.J=!1,this.g=0,this.s=null,this.m=la,this.u=this.S=!1}(t=oa.prototype).open=function(t,e){if(this.readyState!=aa)throw this.abort(),Error("Error reopening a connection");this.s=t,this.f=e,this.readyState=1,ca(this)},t.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.a=!0;var e={headers:this.l,method:this.s,credentials:this.h,cache:void 0};t&&(e.body=t),this.u.fetch(new Request(this.f,e)).then(this.uc.bind(this),this.Va.bind(this))},t.abort=function(){this.response=this.responseText="",this.l=new Headers,this.status=0,this.c&&this.c.cancel("Request was aborted."),1<=this.readyState&&this.a&&4!=this.readyState&&(this.a=!1,ua(this)),this.readyState=aa},t.uc=function(t){this.a&&(this.g=t,this.b||(this.status=this.g.status,this.statusText=this.g.statusText,this.b=t.headers,this.readyState=2,ca(this)),this.a&&(this.readyState=3,ca(this),this.a&&("arraybuffer"===this.responseType?t.arrayBuffer().then(this.sc.bind(this),this.Va.bind(this)):void 0!==l.ReadableStream&&"body"in t?(this.response=this.responseText="",this.c=t.body.getReader(),this.m=new TextDecoder,sa(this)):t.text().then(this.tc.bind(this),this.Va.bind(this)))))},t.pc=function(t){var e;this.a&&((e=this.m.decode(t.value||new Uint8Array(0),{stream:!t.done}))&&(this.response=this.responseText+=e),(t.done?ua:ca)(this),3==this.readyState&&sa(this))},t.tc=function(t){this.a&&(this.response=this.responseText=t,ua(this))},t.sc=function(t){this.a&&(this.response=t,ua(this))},t.Va=function(t){var e=this.i;e&&e.log(zo,"Failed to fetch url "+this.f,t instanceof Error?t:Error(t)),this.a&&ua(this)},t.setRequestHeader=function(t,e){this.l.append(t,e)},t.getResponseHeader=function(t){return this.b?this.b.get(t.toLowerCase())||"":((t=this.i)&&t.log(zo,"Attempting to get response header but no headers have been received for url: "+this.f,void 0),"")},t.getAllResponseHeaders=function(){if(!this.b){var t=this.i;return t&&t.log(zo,"Attempting to get all response headers but no headers have been received for url: "+this.f,void 0),""}for(var t=[],e=this.b.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(oa.prototype,"withCredentials",{get:function(){return"include"===this.h},set:function(t){this.h=t?"include":"same-origin"}}),w(ha,fn);var la="";ha.prototype.b=na("goog.net.XhrIo");var fa=/^https?$/i,da=["POST","PUT"];function pa(e,t,n,i,r){if(e.a)throw Error("[goog.net.XhrIo] Object is active with another request="+e.l+"; newUri="+t);n=n?n.toUpperCase():"GET",e.l=t,e.h="",e.P=n,e.J=!1,e.c=!0,e.a=(e.D||Lo).a(),e.C=e.D?Fo(e.D):Fo(Lo),e.a.onreadystatechange=b(e.Wb,e);try{ia(e.b,Ea(e,"Opening Xhr")),e.N=!0,e.a.open(n,String(t),!0),e.N=!1}catch(t){return ia(e.b,Ea(e,"Error opening Xhr: "+t.message)),void ma(e,t)}t=i||"";var o,a=new wn(e.headers);r&&function(t,e){if(t.forEach&&"function"==typeof t.forEach)t.forEach(e,void 0);else if(p(t)||"string"==typeof t)V(t,e,void 0);else for(var n=yn(t),i=bn(t),r=i.length,o=0;o>>7|r<<25)^(r>>>18|r<<14)^r>>>3)|0,a=(0|n[e-7])+((i>>>17|i<<15)^(i>>>19|i<<13)^i>>>10)|0;n[e]=o+a|0}i=0|t.a[0],r=0|t.a[1];var s=0|t.a[2],u=0|t.a[3],c=0|t.a[4],h=0|t.a[5],l=0|t.a[6];for(o=0|t.a[7],e=0;e<64;e++){var f=((i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10))+(i&r^i&s^r&s)|0;a=(o=o+((c>>>6|c<<26)^(c>>>11|c<<21)^(c>>>25|c<<7))|0)+((a=(a=c&h^~c&l)+(0|Zu[e])|0)+(0|n[e])|0)|0,o=l,l=h,h=c,c=u+a|0,u=s,s=r,r=i,i=a+f|0}t.a[0]=t.a[0]+i|0,t.a[1]=t.a[1]+r|0,t.a[2]=t.a[2]+s|0,t.a[3]=t.a[3]+u|0,t.a[4]=t.a[4]+c|0,t.a[5]=t.a[5]+h|0,t.a[6]=t.a[6]+l|0,t.a[7]=t.a[7]+o|0}function uc(t,e,n){void 0===n&&(n=e.length);var i=0,r=t.c;if("string"==typeof e)for(;i>r&255;return q(t,function(t){return 1<(t=t.toString(16)).length?t:"0"+t}).join("")}function vc(t,e){for(var n=0;nt.f&&(t.a=t.f),e)}function oh(t){this.f=t,this.b=this.a=null,this.c=Date.now()}function ah(t,e){void 0===e&&(e=t.b?(e=t.b).a-e.g:0),t.c=Date.now()+1e3*e}function sh(t,e){t.b=Lr(e[Ka]||""),t.a=e.refreshToken,ah(t,void 0!==(e=e.expiresIn)?Number(e):void 0)}function uh(e,t){return i=e.f,r=t,new fe(function(e,n){"refresh_token"==r.grant_type&&r.refresh_token||"authorization_code"==r.grant_type&&r.code?Za(i,i.l+"?key="+encodeURIComponent(i.c),function(t){t?t.error?n(zs(t)):t.access_token&&t.refresh_token?e(t):n(new T("internal-error")):n(new T("network-request-failed"))},"POST",Hn(r).toString(),i.g,i.m.get()):n(new T("internal-error"))}).then(function(t){return e.b=Lr(t.access_token),e.a=t.refresh_token,ah(e,t.expires_in),{accessToken:e.b.toString(),refreshToken:e.a}}).o(function(t){throw"auth/user-token-expired"==t.code&&(e.a=null),t});var i,r}function ch(t,e){this.a=t||null,this.b=e||null,qi(this,{lastSignInTime:Li(e||null),creationTime:Li(t||null)})}function hh(t,e,n,i,r,o){qi(this,{uid:t,displayName:i||null,photoURL:r||null,email:n||null,phoneNumber:o||null,providerId:e})}function lh(t,e,n){this.N=[],this.l=t.apiKey,this.m=t.appName,this.s=t.authDomain||null;var i,r=Zl.default.SDK_VERSION?gi(Zl.default.SDK_VERSION):null;this.a=new qa(this.l,_(A),r),(this.u=t.emulatorConfig||null)&&Ya(this.a,this.u),this.h=new oh(this.a),wh(this,e[Ka]),sh(this.h,e),Fi(this,"refreshToken",this.h.a),Eh(this,n||{}),fn.call(this),this.P=!1,this.s&&Ii()&&(this.b=xc(this.s,this.l,this.m,this.u)),this.W=[],this.i=null,this.D=(i=this,new ih(function(){return i.I(!0)},function(t){return!(!t||"auth/network-request-failed"!=t.code)},function(){var t=i.h.c-Date.now()-3e5;return 0this.c-3e4?this.a?uh(this,{grant_type:"refresh_token",refresh_token:this.a}):ye(null):ye({accessToken:this.b.toString(),refreshToken:this.a})},ch.prototype.w=function(){return{lastLoginAt:this.b,createdAt:this.a}},w(lh,fn),lh.prototype.xa=function(t){this.za=t,Ja(this.a,t)},lh.prototype.la=function(){return this.za},lh.prototype.Ga=function(){return X(this.aa)},lh.prototype.ib=function(){this.D.b&&(this.D.stop(),this.D.start())},Fi(lh.prototype,"providerId","firebase"),(t=lh.prototype).reload=function(){var t=this;return Vh(this,kh(this).then(function(){return Rh(t).then(function(){return Ih(t)}).then(Ah)}))},t.oc=function(t){return this.I(t).then(function(t){return new Bc(t)})},t.I=function(t){var e=this;return Vh(this,kh(this).then(function(){return e.h.getToken(t)}).then(function(t){if(!t)throw new T("internal-error");return t.accessToken!=e.Aa&&(wh(e,t.accessToken),e.dispatchEvent(new th("tokenChanged"))),Oh(e,"refreshToken",t.refreshToken),t.accessToken}))},t.Kc=function(t){if(!(t=t.users)||!t.length)throw new T("internal-error");Eh(this,{uid:(t=t[0]).localId,displayName:t.displayName,photoURL:t.photoUrl,email:t.email,emailVerified:!!t.emailVerified,phoneNumber:t.phoneNumber,lastLoginAt:t.lastLoginAt,createdAt:t.createdAt,tenantId:t.tenantId});for(var e,n=(e=(e=t).providerUserInfo)&&e.length?q(e,function(t){return new hh(t.rawId,t.providerId,t.email,t.displayName,t.photoUrl,t.phoneNumber)}):[],i=0;i=xl.length)throw new T("internal-error","Argument validator received an unsupported number of arguments.");n=xl[r],i=(i?"":n+" argument ")+(e.name?'"'+e.name+'" ':"")+"must be "+e.K+".";break t}i=null}}if(i)throw new T("argument-error",t+" failed: "+i)}(t=kl.prototype).Ia=function(){var e=this;return this.f||(this.f=Rl(this,ye().then(function(){if(Ti()&&!hi())return si();throw new T("operation-not-supported-in-this-environment","RecaptchaVerifier is only supported in a browser HTTP/HTTPS environment.")}).then(function(){return e.m.g(e.u())}).then(function(t){return e.g=t,Js(e.s,Rs,{})}).then(function(t){e.a[_l]=t.recaptchaSiteKey}).o(function(t){throw e.f=null,t})))},t.render=function(){Dl(this);var n=this;return Rl(this,this.Ia().then(function(){var t,e;return null===n.c&&(e=n.v,n.i||(t=te(e),e=oe("DIV"),t.appendChild(e)),n.c=n.g.render(e,n.a)),n.c}))},t.verify=function(){Dl(this);var r=this;return Rl(this,this.render().then(function(e){return new fe(function(n){var i,t=r.g.getResponse(e);t?n(t):(r.l.push(i=function(t){var e;t&&(e=i,B(r.l,function(t){return t==e}),n(t))}),r.i&&r.g.execute(r.c))})}))},t.reset=function(){Dl(this),null!==this.c&&this.g.reset(this.c)},t.clear=function(){Dl(this),this.J=!0,this.m.c();for(var t,e=0;es[0]&&e[1]>6|192:(55296==(64512&i)&&r+1>18|240,e[n++]=i>>12&63|128):e[n++]=i>>12|224,e[n++]=i>>6&63|128),e[n++]=63&i|128)}return e}function u(t){return function(t){t=i(t);return o.encodeByteArray(t,!0)}(t).replace(/\./g,"")}var o={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray:function(t,e){if(!Array.isArray(t))throw Error("encodeByteArray takes an array as a parameter");this.init_();for(var n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[],i=0;i>6,c=63&c;u||(c=64,s||(h=64)),r.push(n[o>>2],n[(3&o)<<4|a>>4],n[h],n[c])}return r.join("")},encodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?btoa(t):this.encodeByteArray(i(t),e)},decodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?atob(t):function(t){for(var e=[],n=0,r=0;n>10)),e[r++]=String.fromCharCode(56320+(1023&i))):(o=t[n++],s=t[n++],e[r++]=String.fromCharCode((15&a)<<12|(63&o)<<6|63&s))}return e.join("")}(this.decodeStringToByteArray(t,e))},decodeStringToByteArray:function(t,e){this.init_();for(var n=e?this.charToByteMapWebSafe_:this.charToByteMap_,r=[],i=0;i>4),64!==a&&(r.push(s<<4&240|a>>2),64!==u&&r.push(a<<6&192|u))}return r},init_:function(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(var t=0;t=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(t)]=t,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(t)]=t)}}};function h(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function c(){return!function(){try{return"[object process]"===Object.prototype.toString.call(global.process)}catch(t){return}}()&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}var l,f="FirebaseError",d=(n(p,l=Error),p);function p(t,e,n){e=l.call(this,e)||this;return e.code=t,e.customData=n,e.name=f,Object.setPrototypeOf(e,p.prototype),Error.captureStackTrace&&Error.captureStackTrace(e,m.prototype.create),e}var m=(v.prototype.create=function(t){for(var e=[],n=1;n"})):"Error",t=this.serviceName+": "+t+" ("+o+").";return new d(o,t,i)},v);function v(t,e,n){this.service=t,this.serviceName=e,this.errors=n}var w,b=/\{\$([^}]+)}/g;function E(t){return t&&t._delegate?t._delegate:t}(k=w=w||{})[k.DEBUG=0]="DEBUG",k[k.VERBOSE=1]="VERBOSE",k[k.INFO=2]="INFO",k[k.WARN=3]="WARN",k[k.ERROR=4]="ERROR",k[k.SILENT=5]="SILENT";function T(t,e){for(var n=[],r=2;r=t.length?void 0:t)&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}var k,R="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},x={},O=R||self;function L(){}function P(t){var e=typeof t;return"array"==(e="object"!=e?e:t?Array.isArray(t)?"array":e:"null")||"object"==e&&"number"==typeof t.length}function M(t){var e=typeof t;return"object"==e&&null!=t||"function"==e}var F="closure_uid_"+(1e9*Math.random()>>>0),V=0;function U(t,e,n){return t.call.apply(t.bind,arguments)}function q(e,n,t){if(!e)throw Error();if(2parseFloat(yt)){at=String(gt);break t}}at=yt}var mt={};function vt(){return t=function(){for(var t=0,e=J(String(at)).split("."),n=J("9").split("."),r=Math.max(e.length,n.length),i=0;0==t&&i>>0);function qt(e){return"function"==typeof e?e:(e[Ut]||(e[Ut]=function(t){return e.handleEvent(t)}),e[Ut])}function Bt(){G.call(this),this.i=new Nt(this),(this.P=this).I=null}function jt(t,e){var n,r=t.I;if(r)for(n=[];r;r=r.I)n.push(r);if(t=t.P,r=e.type||e,"string"==typeof e?e=new Et(e,t):e instanceof Et?e.target=e.target||t:(s=e,ot(e=new Et(r,t),s)),s=!0,n)for(var i=n.length-1;0<=i;i--)var o=e.g=n[i],s=Kt(o,r,!0,e)&&s;if(s=Kt(o=e.g=t,r,!0,e)&&s,s=Kt(o,r,!1,e)&&s,n)for(i=0;io.length?Pe:(o=o.substr(a,s),i.C=a+s,o)))==Pe){4==e&&(t.o=4,be(14),u=!1),de(t.j,t.m,null,"[Incomplete Response]");break}if(r==Le){t.o=4,be(15),de(t.j,t.m,n,"[Invalid Chunk]"),u=!1;break}de(t.j,t.m,r,null),Qe(t,r)}Ve(t)&&r!=Pe&&r!=Le&&(t.h.g="",t.C=0),4!=e||0!=n.length||t.h.h||(t.o=1,be(16),u=!1),t.i=t.i&&u,u?0>4&15).toString(16)+(15&t).toString(16)}$e.prototype.toString=function(){var t=[],e=this.j;e&&t.push(an(e,cn,!0),":");var n=this.i;return!n&&"file"!=e||(t.push("//"),(e=this.s)&&t.push(an(e,cn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.m)&&t.push(":",String(n))),(n=this.l)&&(this.i&&"/"!=n.charAt(0)&&t.push("/"),t.push(an(n,"/"==n.charAt(0)?ln:hn,!0))),(n=this.h.toString())&&t.push("?",n),(n=this.o)&&t.push("#",an(n,dn)),t.join("")};var cn=/[#\/\?@]/g,hn=/[#\?:]/g,ln=/[#\?]/g,fn=/[#\?@]/g,dn=/#/g;function pn(t,e){this.h=this.g=null,this.i=t||null,this.j=!!e}function yn(n){n.g||(n.g=new ze,n.h=0,n.i&&function(t,e){if(t){t=t.split("&");for(var n=0;n2*t.i&&We(t)))}function mn(t,e){return yn(t),e=wn(t,e),Ye(t.g.h,e)}function vn(t,e,n){gn(t,e),0=t.j}function Sn(t){return t.h?1:t.g?t.g.size:0}function An(t,e){return t.h?t.h==e:t.g&&t.g.has(e)}function Dn(t,e){t.g?t.g.add(e):t.h=e}function Nn(t,e){t.h&&t.h==e?t.h=null:t.g&&t.g.has(e)&&t.g.delete(e)}function Cn(t){var e,n;if(null!=t.h)return t.i.concat(t.h.D);if(null==t.g||0===t.g.size)return Y(t.i);var r=t.i;try{for(var i=C(t.g.values()),o=i.next();!o.done;o=i.next())var s=o.value,r=r.concat(s.D)}catch(t){e={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return r}function kn(){}function Rn(){this.g=new kn}function xn(t,e,n,r,i){try{e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null,i(r)}catch(t){}}function On(t){this.l=t.$b||null,this.j=t.ib||!1}function Ln(t,e){Bt.call(this),this.D=t,this.u=e,this.m=void 0,this.readyState=Pn,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.v=new Headers,this.h=null,this.C="GET",this.B="",this.g=!1,this.A=this.j=this.l=null}En.prototype.cancel=function(){var e,t;if(this.i=Cn(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){try{for(var n=C(this.g.values()),r=n.next();!r.done;r=n.next())r.value.cancel()}catch(t){e={error:t}}finally{try{r&&!r.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.g.clear()}},kn.prototype.stringify=function(t){return O.JSON.stringify(t,void 0)},kn.prototype.parse=function(t){return O.JSON.parse(t,void 0)},K(On,_e),On.prototype.g=function(){return new Ln(this.l,this.j)},On.prototype.i=(Tn={},function(){return Tn}),K(Ln,Bt);var Pn=0;function Mn(t){t.j.read().then(t.Sa.bind(t)).catch(t.ha.bind(t))}function Fn(t){t.readyState=4,t.l=null,t.j=null,t.A=null,Vn(t)}function Vn(t){t.onreadystatechange&&t.onreadystatechange.call(t)}(k=Ln.prototype).open=function(t,e){if(this.readyState!=Pn)throw this.abort(),Error("Error reopening a connection");this.C=t,this.B=e,this.readyState=1,Vn(this)},k.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;var e={headers:this.v,method:this.C,credentials:this.m,cache:void 0};t&&(e.body=t),(this.D||O).fetch(new Request(this.B,e)).then(this.Va.bind(this),this.ha.bind(this))},k.abort=function(){this.response=this.responseText="",this.v=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted."),1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Fn(this)),this.readyState=Pn},k.Va=function(t){if(this.g&&(this.l=t,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=t.headers,this.readyState=2,Vn(this)),this.g&&(this.readyState=3,Vn(this),this.g)))if("arraybuffer"===this.responseType)t.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if(void 0!==O.ReadableStream&&"body"in t){if(this.j=t.body.getReader(),this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.A=new TextDecoder;Mn(this)}else t.text().then(this.Ua.bind(this),this.ha.bind(this))},k.Sa=function(t){var e;this.g&&(this.u&&t.value?this.response.push(t.value):this.u||(e=t.value||new Uint8Array(0),(e=this.A.decode(e,{stream:!t.done}))&&(this.response=this.responseText+=e)),(t.done?Fn:Vn)(this),3==this.readyState&&Mn(this))},k.Ua=function(t){this.g&&(this.response=this.responseText=t,Fn(this))},k.Ta=function(t){this.g&&(this.response=t,Fn(this))},k.ha=function(){this.g&&Fn(this)},k.setRequestHeader=function(t,e){this.v.append(t,e)},k.getResponseHeader=function(t){return this.h&&this.h.get(t.toLowerCase())||""},k.getAllResponseHeaders=function(){if(!this.h)return"";for(var t=[],e=this.h.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(Ln.prototype,"withCredentials",{get:function(){return"include"===this.m},set:function(t){this.m=t?"include":"same-origin"}});var Un=O.JSON.parse;function qn(t){Bt.call(this),this.headers=new ze,this.u=t||null,this.h=!1,this.C=this.g=null,this.H="",this.m=0,this.j="",this.l=this.F=this.v=this.D=!1,this.B=0,this.A=null,this.J=Bn,this.K=this.L=!1}K(qn,Bt);var Bn="",jn=/^https?$/i,Kn=["POST","PUT"];function Gn(t){return"content-type"==t.toLowerCase()}function Qn(t,e){t.h=!1,t.g&&(t.l=!0,t.g.abort(),t.l=!1),t.j=e,t.m=5,Hn(t),Wn(t)}function Hn(t){t.D||(t.D=!0,jt(t,"complete"),jt(t,"error"))}function zn(t){if(t.h&&void 0!==x&&(!t.C[1]||4!=Xn(t)||2!=t.ba()))if(t.v&&4==Xn(t))ie(t.Fa,0,t);else if(jt(t,"readystatechange"),4==Xn(t)){t.h=!1;try{var e,n,r,i,o=t.ba();t:switch(o){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var s=!0;break t;default:s=!1}if((e=s)||((n=0===o)&&(!(i=String(t.H).match(Xe)[1]||null)&&O.self&&O.self.location&&(i=(r=O.self.location.protocol).substr(0,r.length-1)),n=!jn.test(i?i.toLowerCase():"")),e=n),e)jt(t,"complete"),jt(t,"success");else{t.m=6;try{var a=2=r.i.j-(r.m?1:0)||(r.m?(r.l=i.D.concat(r.l),0):1==r.G||2==r.G||r.C>=(r.Xa?0:r.Ya)||(r.m=Te(B(r.Ha,r,i),yr(r,r.C)),r.C++,0))))&&(2!=s||!hr(t)))switch(o&&0e.length?1:0},vi),ci=(n(mi,ui=R),mi.prototype.construct=function(t,e,n){return new mi(t,e,n)},mi.prototype.canonicalString=function(){return this.toArray().join("/")},mi.prototype.toString=function(){return this.canonicalString()},mi.fromString=function(){for(var t=[],e=0;et.length&&zr(),void 0===n?n=t.length-e:n>t.length-e&&zr(),this.segments=t,this.offset=e,this.len=n}di.EMPTY_BYTE_STRING=new di("");var wi=new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);function bi(t){if(Wr(!!t),"string"!=typeof t)return{seconds:Ei(t.seconds),nanos:Ei(t.nanos)};var e=0,n=wi.exec(t);Wr(!!n),n[1]&&(n=((n=n[1])+"000000000").substr(0,9),e=Number(n));t=new Date(t);return{seconds:Math.floor(t.getTime()/1e3),nanos:e}}function Ei(t){return"number"==typeof t?t:"string"==typeof t?Number(t):0}function Ti(t){return"string"==typeof t?di.fromBase64String(t):di.fromUint8Array(t)}function Ii(t){return"server_timestamp"===(null===(t=((null===(t=null==t?void 0:t.mapValue)||void 0===t?void 0:t.fields)||{}).__type__)||void 0===t?void 0:t.stringValue)}function _i(t){t=bi(t.mapValue.fields.__local_write_time__.timestampValue);return new ti(t.seconds,t.nanos)}function Si(t){return null==t}function Ai(t){return 0===t&&1/t==-1/0}function Di(t){return"number"==typeof t&&Number.isInteger(t)&&!Ai(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER}var Ni=(Ci.fromPath=function(t){return new Ci(ci.fromString(t))},Ci.fromName=function(t){return new Ci(ci.fromString(t).popFirst(5))},Ci.prototype.hasCollectionId=function(t){return 2<=this.path.length&&this.path.get(this.path.length-2)===t},Ci.prototype.isEqual=function(t){return null!==t&&0===ci.comparator(this.path,t.path)},Ci.prototype.toString=function(){return this.path.toString()},Ci.comparator=function(t,e){return ci.comparator(t.path,e.path)},Ci.isDocumentKey=function(t){return t.length%2==0},Ci.fromSegments=function(t){return new Ci(new ci(t.slice()))},Ci);function Ci(t){this.path=t}function ki(t){return"nullValue"in t?0:"booleanValue"in t?1:"integerValue"in t||"doubleValue"in t?2:"timestampValue"in t?3:"stringValue"in t?5:"bytesValue"in t?6:"referenceValue"in t?7:"geoPointValue"in t?8:"arrayValue"in t?9:"mapValue"in t?Ii(t)?4:10:zr()}function Ri(r,i){var t,e,n=ki(r);if(n!==ki(i))return!1;switch(n){case 0:return!0;case 1:return r.booleanValue===i.booleanValue;case 4:return _i(r).isEqual(_i(i));case 3:return function(t){if("string"==typeof r.timestampValue&&"string"==typeof t.timestampValue&&r.timestampValue.length===t.timestampValue.length)return r.timestampValue===t.timestampValue;var e=bi(r.timestampValue),t=bi(t.timestampValue);return e.seconds===t.seconds&&e.nanos===t.nanos}(i);case 5:return r.stringValue===i.stringValue;case 6:return e=i,Ti(r.bytesValue).isEqual(Ti(e.bytesValue));case 7:return r.referenceValue===i.referenceValue;case 8:return t=i,Ei((e=r).geoPointValue.latitude)===Ei(t.geoPointValue.latitude)&&Ei(e.geoPointValue.longitude)===Ei(t.geoPointValue.longitude);case 2:return function(t,e){if("integerValue"in t&&"integerValue"in e)return Ei(t.integerValue)===Ei(e.integerValue);if("doubleValue"in t&&"doubleValue"in e){t=Ei(t.doubleValue),e=Ei(e.doubleValue);return t===e?Ai(t)===Ai(e):isNaN(t)&&isNaN(e)}return!1}(r,i);case 9:return Jr(r.arrayValue.values||[],i.arrayValue.values||[],Ri);case 10:return function(){var t,e=r.mapValue.fields||{},n=i.mapValue.fields||{};if(ii(e)!==ii(n))return!1;for(t in e)if(e.hasOwnProperty(t)&&(void 0===n[t]||!Ri(e[t],n[t])))return!1;return!0}();default:return zr()}}function xi(t,e){return void 0!==(t.values||[]).find(function(t){return Ri(t,e)})}function Oi(t,e){var n,r,i,o=ki(t),s=ki(e);if(o!==s)return $r(o,s);switch(o){case 0:return 0;case 1:return $r(t.booleanValue,e.booleanValue);case 2:return r=e,i=Ei(t.integerValue||t.doubleValue),r=Ei(r.integerValue||r.doubleValue),i":return 0=":return 0<=t;default:return zr()}},to.prototype.g=function(){return 0<=["<","<=",">",">=","!=","not-in"].indexOf(this.op)},to);function to(t,e,n){var r=this;return(r=Ji.call(this)||this).field=t,r.op=e,r.value=n,r}var eo,no,ro,io=(n(co,ro=Zi),co.prototype.matches=function(t){t=Ni.comparator(t.key,this.key);return this.m(t)},co),oo=(n(uo,no=Zi),uo.prototype.matches=function(e){return this.keys.some(function(t){return t.isEqual(e.key)})},uo),so=(n(ao,eo=Zi),ao.prototype.matches=function(e){return!this.keys.some(function(t){return t.isEqual(e.key)})},ao);function ao(t,e){var n=this;return(n=eo.call(this,t,"not-in",e)||this).keys=ho(0,e),n}function uo(t,e){var n=this;return(n=no.call(this,t,"in",e)||this).keys=ho(0,e),n}function co(t,e,n){var r=this;return(r=ro.call(this,t,e,n)||this).key=Ni.fromName(n.referenceValue),r}function ho(t,e){return((null===(e=e.arrayValue)||void 0===e?void 0:e.values)||[]).map(function(t){return Ni.fromName(t.referenceValue)})}var lo,fo,po,yo,go=(n(_o,yo=Zi),_o.prototype.matches=function(t){t=t.data.field(this.field);return Vi(t)&&xi(t.arrayValue,this.value)},_o),mo=(n(Io,po=Zi),Io.prototype.matches=function(t){t=t.data.field(this.field);return null!==t&&xi(this.value.arrayValue,t)},Io),vo=(n(To,fo=Zi),To.prototype.matches=function(t){if(xi(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;t=t.data.field(this.field);return null!==t&&!xi(this.value.arrayValue,t)},To),wo=(n(Eo,lo=Zi),Eo.prototype.matches=function(t){var e=this,t=t.data.field(this.field);return!(!Vi(t)||!t.arrayValue.values)&&t.arrayValue.values.some(function(t){return xi(e.value.arrayValue,t)})},Eo),bo=function(t,e){this.position=t,this.before=e};function Eo(t,e){return lo.call(this,t,"array-contains-any",e)||this}function To(t,e){return fo.call(this,t,"not-in",e)||this}function Io(t,e){return po.call(this,t,"in",e)||this}function _o(t,e){return yo.call(this,t,"array-contains",e)||this}function So(t){return(t.before?"b":"a")+":"+t.position.map(Pi).join(",")}var Ao=function(t,e){void 0===e&&(e="asc"),this.field=t,this.dir=e};function Do(t,e,n){for(var r=0,i=0;i":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"},ga=function(t,e){this.databaseId=t,this.I=e};function ma(t,e){return t.I?new Date(1e3*e.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")+"."+("000000000"+e.nanoseconds).slice(-9)+"Z":{seconds:""+e.seconds,nanos:e.nanoseconds}}function va(t,e){return t.I?e.toBase64():e.toUint8Array()}function wa(t){return Wr(!!t),ei.fromTimestamp((t=bi(t),new ti(t.seconds,t.nanos)))}function ba(t,e){return new ci(["projects",t.projectId,"databases",t.database]).child("documents").child(e).canonicalString()}function Ea(t){t=ci.fromString(t);return Wr(Ba(t)),t}function Ta(t,e){return ba(t.databaseId,e.path)}function Ia(t,e){e=Ea(e);if(e.get(1)!==t.databaseId.projectId)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+e.get(1)+" vs "+t.databaseId.projectId);if(e.get(3)!==t.databaseId.database)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+e.get(3)+" vs "+t.databaseId.database);return new Ni(Da(e))}function _a(t,e){return ba(t.databaseId,e)}function Sa(t){t=Ea(t);return 4===t.length?ci.emptyPath():Da(t)}function Aa(t){return new ci(["projects",t.databaseId.projectId,"databases",t.databaseId.database]).canonicalString()}function Da(t){return Wr(4";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";case"OPERATOR_UNSPECIFIED":default:return zr()}}(),t.fieldFilter.value)}function qa(t){switch(t.unaryFilter.op){case"IS_NAN":var e=Va(t.unaryFilter.field);return Zi.create(e,"==",{doubleValue:NaN});case"IS_NULL":e=Va(t.unaryFilter.field);return Zi.create(e,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":var n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{doubleValue:NaN});case"IS_NOT_NULL":n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{nullValue:"NULL_VALUE"});case"OPERATOR_UNSPECIFIED":default:return zr()}}function Ba(t){return 4<=t.length&&"projects"===t.get(0)&&"databases"===t.get(2)}function ja(t){for(var e="",n=0;n",t),this.store.put(t));return Au(t)},Su.prototype.add=function(t){return Kr("SimpleDb","ADD",this.store.name,t,t),Au(this.store.add(t))},Su.prototype.get=function(e){var n=this;return Au(this.store.get(e)).next(function(t){return Kr("SimpleDb","GET",n.store.name,e,t=void 0===t?null:t),t})},Su.prototype.delete=function(t){return Kr("SimpleDb","DELETE",this.store.name,t),Au(this.store.delete(t))},Su.prototype.count=function(){return Kr("SimpleDb","COUNT",this.store.name),Au(this.store.count())},Su.prototype.Nt=function(t,e){var e=this.cursor(this.options(t,e)),n=[];return this.xt(e,function(t,e){n.push(e)}).next(function(){return n})},Su.prototype.kt=function(t,e){Kr("SimpleDb","DELETE ALL",this.store.name);e=this.options(t,e);e.Ft=!1;e=this.cursor(e);return this.xt(e,function(t,e,n){return n.delete()})},Su.prototype.$t=function(t,e){e?n=t:(n={},e=t);var n=this.cursor(n);return this.xt(n,e)},Su.prototype.Ot=function(r){var t=this.cursor({});return new fu(function(n,e){t.onerror=function(t){t=Nu(t.target.error);e(t)},t.onsuccess=function(t){var e=t.target.result;e?r(e.primaryKey,e.value).next(function(t){t?e.continue():n()}):n()}})},Su.prototype.xt=function(t,i){var o=[];return new fu(function(r,e){t.onerror=function(t){e(t.target.error)},t.onsuccess=function(t){var e,n=t.target.result;n?(e=new yu(n),(t=i(n.primaryKey,n.value,e))instanceof fu&&(t=t.catch(function(t){return e.done(),fu.reject(t)}),o.push(t)),e.isDone?r():null===e.Dt?n.continue():n.continue(e.Dt)):r()}}).next(function(){return fu.waitFor(o)})},Su.prototype.options=function(t,e){var n;return void 0!==t&&("string"==typeof t?n=t:e=t),{index:n,range:e}},Su.prototype.cursor=function(t){var e="next";if(t.reverse&&(e="prev"),t.index){var n=this.store.index(t.index);return t.Ft?n.openKeyCursor(t.range,e):n.openCursor(t.range,e)}return this.store.openCursor(t.range,e)},Su);function Su(t){this.store=t}function Au(t){return new fu(function(e,n){t.onsuccess=function(t){t=t.target.result;e(t)},t.onerror=function(t){t=Nu(t.target.error);n(t)}})}var Du=!1;function Nu(t){var e=pu._t(h());if(12.2<=e&&e<13){e="An internal error was encountered in the Indexed Database server";if(0<=t.message.indexOf(e)){var n=new Ur("internal","IOS_INDEXEDDB_BUG1: IndexedDb has thrown '"+e+"'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.");return Du||(Du=!0,setTimeout(function(){throw n},0)),n}}return t}var Cu,ku=(n(Ru,Cu=R),Ru);function Ru(t,e){var n=this;return(n=Cu.call(this)||this).Mt=t,n.currentSequenceNumber=e,n}function xu(t,e){return pu.It(t.Mt,e)}var Ou=(Uu.prototype.applyToRemoteDocument=function(t,e){for(var n,r,i,o,s,a,u=e.mutationResults,c=0;c=i),o=Hu(r.R,e)),n.done()}).next(function(){return o})},dc.prototype.getHighestUnacknowledgedBatchId=function(t){var e=IDBKeyRange.upperBound([this.userId,Number.POSITIVE_INFINITY]),r=-1;return yc(t).$t({index:Wa.userMutationsIndex,range:e,reverse:!0},function(t,e,n){r=e.batchId,n.done()}).next(function(){return r})},dc.prototype.getAllMutationBatches=function(t){var e=this,n=IDBKeyRange.bound([this.userId,-1],[this.userId,Number.POSITIVE_INFINITY]);return yc(t).Nt(Wa.userMutationsIndex,n).next(function(t){return t.map(function(t){return Hu(e.R,t)})})},dc.prototype.getAllMutationBatchesAffectingDocumentKey=function(o,s){var a=this,t=Ya.prefixForPath(this.userId,s.path),t=IDBKeyRange.lowerBound(t),u=[];return gc(o).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);if(r===a.userId&&s.path.isEqual(i))return yc(o).get(t).next(function(t){if(!t)throw zr();Wr(t.userId===a.userId),u.push(Hu(a.R,t))});n.done()}).next(function(){return u})},dc.prototype.getAllMutationBatchesAffectingDocumentKeys=function(e,t){var s=this,a=new Qs($r),n=[];return t.forEach(function(o){var t=Ya.prefixForPath(s.userId,o.path),t=IDBKeyRange.lowerBound(t),t=gc(e).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===s.userId&&o.path.isEqual(i)?a=a.add(t):n.done()});n.push(t)}),fu.waitFor(n).next(function(){return s.Wt(e,a)})},dc.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var o=this,s=e.path,a=s.length+1,e=Ya.prefixForPath(this.userId,s),e=IDBKeyRange.lowerBound(e),u=new Qs($r);return gc(t).$t({range:e},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===o.userId&&s.isPrefixOf(i)?i.length===a&&(u=u.add(t)):n.done()}).next(function(){return o.Wt(t,u)})},dc.prototype.Wt=function(e,t){var n=this,r=[],i=[];return t.forEach(function(t){i.push(yc(e).get(t).next(function(t){if(null===t)throw zr();Wr(t.userId===n.userId),r.push(Hu(n.R,t))}))}),fu.waitFor(i).next(function(){return r})},dc.prototype.removeMutationBatch=function(e,n){var r=this;return hc(e.Mt,this.userId,n).next(function(t){return e.addOnCommittedListener(function(){r.Gt(n.batchId)}),fu.forEach(t,function(t){return r.referenceDelegate.markPotentiallyOrphaned(e,t)})})},dc.prototype.Gt=function(t){delete this.Kt[t]},dc.prototype.performConsistencyCheck=function(e){var i=this;return this.checkEmpty(e).next(function(t){if(!t)return fu.resolve();var t=IDBKeyRange.lowerBound(Ya.prefixForUser(i.userId)),r=[];return gc(e).$t({range:t},function(t,e,n){t[0]===i.userId?(t=Ga(t[1]),r.push(t)):n.done()}).next(function(){Wr(0===r.length)})})},dc.prototype.containsKey=function(t,e){return pc(t,this.userId,e)},dc.prototype.zt=function(t){var e=this;return mc(t).get(this.userId).next(function(t){return t||new za(e.userId,-1,"")})},dc);function dc(t,e,n,r){this.userId=t,this.R=e,this.Ut=n,this.referenceDelegate=r,this.Kt={}}function pc(t,o,e){var e=Ya.prefixForPath(o,e.path),s=e[1],e=IDBKeyRange.lowerBound(e),a=!1;return gc(t).$t({range:e,Ft:!0},function(t,e,n){var r=t[0],i=t[1];t[2],r===o&&i===s&&(a=!0),n.done()}).next(function(){return a})}function yc(t){return xu(t,Wa.store)}function gc(t){return xu(t,Ya.store)}function mc(t){return xu(t,za.store)}var vc=(Ec.prototype.next=function(){return this.Ht+=2,this.Ht},Ec.Jt=function(){return new Ec(0)},Ec.Yt=function(){return new Ec(-1)},Ec),wc=(bc.prototype.allocateTargetId=function(n){var r=this;return this.Xt(n).next(function(t){var e=new vc(t.highestTargetId);return t.highestTargetId=e.next(),r.Zt(n,t).next(function(){return t.highestTargetId})})},bc.prototype.getLastRemoteSnapshotVersion=function(t){return this.Xt(t).next(function(t){return ei.fromTimestamp(new ti(t.lastRemoteSnapshotVersion.seconds,t.lastRemoteSnapshotVersion.nanoseconds))})},bc.prototype.getHighestSequenceNumber=function(t){return this.Xt(t).next(function(t){return t.highestListenSequenceNumber})},bc.prototype.setTargetsMetadata=function(e,n,r){var i=this;return this.Xt(e).next(function(t){return t.highestListenSequenceNumber=n,r&&(t.lastRemoteSnapshotVersion=r.toTimestamp()),n>t.highestListenSequenceNumber&&(t.highestListenSequenceNumber=n),i.Zt(e,t)})},bc.prototype.addTargetData=function(e,n){var r=this;return this.te(e,n).next(function(){return r.Xt(e).next(function(t){return t.targetCount+=1,r.ee(n,t),r.Zt(e,t)})})},bc.prototype.updateTargetData=function(t,e){return this.te(t,e)},bc.prototype.removeTargetData=function(e,t){var n=this;return this.removeMatchingKeysForTargetId(e,t.targetId).next(function(){return Tc(e).delete(t.targetId)}).next(function(){return n.Xt(e)}).next(function(t){return Wr(0e.highestTargetId&&(e.highestTargetId=t.targetId,n=!0),t.sequenceNumber>e.highestListenSequenceNumber&&(e.highestListenSequenceNumber=t.sequenceNumber,n=!0),n},bc.prototype.getTargetCount=function(t){return this.Xt(t).next(function(t){return t.targetCount})},bc.prototype.getTargetData=function(t,r){var e=Yi(r),e=IDBKeyRange.bound([e,Number.NEGATIVE_INFINITY],[e,Number.POSITIVE_INFINITY]),i=null;return Tc(t).$t({range:e,index:eu.queryTargetsIndexName},function(t,e,n){e=zu(e);Xi(r,e.target)&&(i=e,n.done())}).next(function(){return i})},bc.prototype.addMatchingKeys=function(n,t,r){var i=this,o=[],s=_c(n);return t.forEach(function(t){var e=ja(t.path);o.push(s.put(new nu(r,e))),o.push(i.referenceDelegate.addReference(n,r,t))}),fu.waitFor(o)},bc.prototype.removeMatchingKeys=function(n,t,r){var i=this,o=_c(n);return fu.forEach(t,function(t){var e=ja(t.path);return fu.waitFor([o.delete([r,e]),i.referenceDelegate.removeReference(n,r,t)])})},bc.prototype.removeMatchingKeysForTargetId=function(t,e){t=_c(t),e=IDBKeyRange.bound([e],[e+1],!1,!0);return t.delete(e)},bc.prototype.getMatchingKeysForTargetId=function(t,e){var e=IDBKeyRange.bound([e],[e+1],!1,!0),t=_c(t),r=Zs();return t.$t({range:e,Ft:!0},function(t,e,n){t=Ga(t[1]),t=new Ni(t);r=r.add(t)}).next(function(){return r})},bc.prototype.containsKey=function(t,e){var e=ja(e.path),e=IDBKeyRange.bound([e],[Zr(e)],!1,!0),i=0;return _c(t).$t({index:nu.documentTargetsIndex,Ft:!0,range:e},function(t,e,n){var r=t[0];t[1],0!==r&&(i++,n.done())}).next(function(){return 0h.params.maximumSequenceNumbersToCollect?(Kr("LruGarbageCollector","Capping sequence numbers to collect down to the maximum of "+h.params.maximumSequenceNumbersToCollect+" from "+t),h.params.maximumSequenceNumbersToCollect):t,s=Date.now(),h.nthSequenceNumber(e,i)}).next(function(t){return r=t,a=Date.now(),h.removeTargets(e,r,n)}).next(function(t){return o=t,u=Date.now(),h.removeOrphanedDocuments(e,r)}).next(function(t){return c=Date.now(),jr()<=w.DEBUG&&Kr("LruGarbageCollector","LRU Garbage Collection\n\tCounted targets in "+(s-l)+"ms\n\tDetermined least recently used "+i+" in "+(a-s)+"ms\n\tRemoved "+o+" targets in "+(u-a)+"ms\n\tRemoved "+t+" documents in "+(c-u)+"ms\nTotal Duration: "+(c-l)+"ms"),fu.resolve({didRun:!0,sequenceNumbersCollected:i,targetsRemoved:o,documentsRemoved:t})})},xc),kc=(Rc.prototype.he=function(t){var n=this.de(t);return this.db.getTargetCache().getTargetCount(t).next(function(e){return n.next(function(t){return e+t})})},Rc.prototype.de=function(t){var e=0;return this.le(t,function(t){e++}).next(function(){return e})},Rc.prototype.forEachTarget=function(t,e){return this.db.getTargetCache().forEachTarget(t,e)},Rc.prototype.le=function(t,n){return this.we(t,function(t,e){return n(e)})},Rc.prototype.addReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeTargets=function(t,e,n){return this.db.getTargetCache().removeTargets(t,e,n)},Rc.prototype.markPotentiallyOrphaned=Pc,Rc.prototype._e=function(t,e){return r=e,i=!1,mc(n=t).Ot(function(t){return pc(n,t,r).next(function(t){return t&&(i=!0),fu.resolve(!t)})}).next(function(){return i});var n,r,i},Rc.prototype.removeOrphanedDocuments=function(n,r){var i=this,o=this.db.getRemoteDocumentCache().newChangeBuffer(),s=[],a=0;return this.we(n,function(e,t){t<=r&&(t=i._e(n,e).next(function(t){if(!t)return a++,o.getEntry(n,e).next(function(){return o.removeEntry(e),_c(n).delete([0,ja(e.path)])})}),s.push(t))}).next(function(){return fu.waitFor(s)}).next(function(){return o.apply(n)}).next(function(){return a})},Rc.prototype.removeTarget=function(t,e){e=e.withSequenceNumber(t.currentSequenceNumber);return this.db.getTargetCache().updateTargetData(t,e)},Rc.prototype.updateLimboDocument=Pc,Rc.prototype.we=function(t,r){var i,t=_c(t),o=Pr.o;return t.$t({index:nu.documentTargetsIndex},function(t,e){var n=t[0];t[1];t=e.path,e=e.sequenceNumber;0===n?(o!==Pr.o&&r(new Ni(Ga(i)),o),o=e,i=t):o=Pr.o}).next(function(){o!==Pr.o&&r(new Ni(Ga(i)),o)})},Rc.prototype.getCacheSize=function(t){return this.db.getRemoteDocumentCache().getSize(t)},Rc);function Rc(t,e){this.db=t,this.garbageCollector=new Cc(this,e)}function xc(t,e){this.ae=t,this.params=e}function Oc(t,e){this.garbageCollector=t,this.asyncQueue=e,this.oe=!1,this.ce=null}function Lc(t){this.ne=t,this.buffer=new Qs(Ac),this.se=0}function Pc(t,e){return _c(t).put((t=t.currentSequenceNumber,new nu(0,ja(e.path),t)))}var Mc,Fc=(Kc.prototype.get=function(t){var e=this.mapKeyFn(t),e=this.inner[e];if(void 0!==e)for(var n=0,r=e;n "+n),1))},Jc.prototype.We=function(){var t=this;null!==this.document&&"function"==typeof this.document.addEventListener&&(this.Fe=function(){t.Se.enqueueAndForget(function(){return t.inForeground="visible"===t.document.visibilityState,t.je()})},this.document.addEventListener("visibilitychange",this.Fe),this.inForeground="visible"===this.document.visibilityState)},Jc.prototype.an=function(){this.Fe&&(this.document.removeEventListener("visibilitychange",this.Fe),this.Fe=null)},Jc.prototype.Ge=function(){var t,e=this;"function"==typeof(null===(t=this.window)||void 0===t?void 0:t.addEventListener)&&(this.ke=function(){e.un(),c()&&navigator.appVersion.match("Version/14")&&e.Se.enterRestrictedMode(!0),e.Se.enqueueAndForget(function(){return e.shutdown()})},this.window.addEventListener("pagehide",this.ke))},Jc.prototype.hn=function(){this.ke&&(this.window.removeEventListener("pagehide",this.ke),this.ke=null)},Jc.prototype.cn=function(t){var e;try{var n=null!==(null===(e=this.Qe)||void 0===e?void 0:e.getItem(this.on(t)));return Kr("IndexedDbPersistence","Client '"+t+"' "+(n?"is":"is not")+" zombied in LocalStorage"),n}catch(t){return Gr("IndexedDbPersistence","Failed to get zombied client id.",t),!1}},Jc.prototype.un=function(){if(this.Qe)try{this.Qe.setItem(this.on(this.clientId),String(Date.now()))}catch(t){Gr("Failed to set zombie client id.",t)}},Jc.prototype.ln=function(){if(this.Qe)try{this.Qe.removeItem(this.on(this.clientId))}catch(t){}},Jc.prototype.on=function(t){return"firestore_zombie_"+this.persistenceKey+"_"+t},Jc);function Jc(t,e,n,r,i,o,s,a,u,c){if(this.allowTabSynchronization=t,this.persistenceKey=e,this.clientId=n,this.Se=i,this.window=o,this.document=s,this.De=u,this.Ce=c,this.Ne=null,this.xe=!1,this.isPrimary=!1,this.networkEnabled=!0,this.ke=null,this.inForeground=!1,this.Fe=null,this.$e=null,this.Oe=Number.NEGATIVE_INFINITY,this.Me=function(t){return Promise.resolve()},!Jc.yt())throw new Ur(Vr.UNIMPLEMENTED,"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.");this.referenceDelegate=new kc(this,r),this.Le=e+"main",this.R=new Mu(a),this.Be=new pu(this.Le,11,new zc(this.R)),this.qe=new wc(this.referenceDelegate,this.R),this.Ut=new nc,this.Ue=(e=this.R,a=this.Ut,new Vc(e,a)),this.Ke=new Xu,this.window&&this.window.localStorage?this.Qe=this.window.localStorage:(this.Qe=null,!1===c&&Gr("IndexedDbPersistence","LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page."))}function Zc(t){return xu(t,Qa.store)}function th(t){return xu(t,ou.store)}function eh(t,e){var n=t.projectId;return t.isDefaultDatabase||(n+="."+t.database),"firestore/"+e+"/"+n+"/"}function nh(t,e){this.progress=t,this.wn=e}var rh=(hh.prototype.mn=function(e,n){var r=this;return this._n.getAllMutationBatchesAffectingDocumentKey(e,n).next(function(t){return r.yn(e,n,t)})},hh.prototype.yn=function(t,e,r){return this.Ue.getEntry(t,e).next(function(t){for(var e=0,n=r;ee?this._n[e]:null)},Kh.prototype.getHighestUnacknowledgedBatchId=function(){return fu.resolve(0===this._n.length?-1:this.ss-1)},Kh.prototype.getAllMutationBatches=function(t){return fu.resolve(this._n.slice())},Kh.prototype.getAllMutationBatchesAffectingDocumentKey=function(t,e){var n=this,r=new Dh(e,0),e=new Dh(e,Number.POSITIVE_INFINITY),i=[];return this.rs.forEachInRange([r,e],function(t){t=n.os(t.ns);i.push(t)}),fu.resolve(i)},Kh.prototype.getAllMutationBatchesAffectingDocumentKeys=function(t,e){var n=this,r=new Qs($r);return e.forEach(function(t){var e=new Dh(t,0),t=new Dh(t,Number.POSITIVE_INFINITY);n.rs.forEachInRange([e,t],function(t){r=r.add(t.ns)})}),fu.resolve(this.us(r))},Kh.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var n=e.path,r=n.length+1,e=n;Ni.isDocumentKey(e)||(e=e.child(""));var e=new Dh(new Ni(e),0),i=new Qs($r);return this.rs.forEachWhile(function(t){var e=t.key.path;return!!n.isPrefixOf(e)&&(e.length===r&&(i=i.add(t.ns)),!0)},e),fu.resolve(this.us(i))},Kh.prototype.us=function(t){var e=this,n=[];return t.forEach(function(t){t=e.os(t);null!==t&&n.push(t)}),n},Kh.prototype.removeMutationBatch=function(n,r){var i=this;Wr(0===this.hs(r.batchId,"removed")),this._n.shift();var o=this.rs;return fu.forEach(r.mutations,function(t){var e=new Dh(t.key,r.batchId);return o=o.delete(e),i.referenceDelegate.markPotentiallyOrphaned(n,t.key)}).next(function(){i.rs=o})},Kh.prototype.Gt=function(t){},Kh.prototype.containsKey=function(t,e){var n=new Dh(e,0),n=this.rs.firstAfterOrEqual(n);return fu.resolve(e.isEqual(n&&n.key))},Kh.prototype.performConsistencyCheck=function(t){return this._n.length,fu.resolve()},Kh.prototype.hs=function(t,e){return this.cs(t)},Kh.prototype.cs=function(t){return 0===this._n.length?0:t-this._n[0].batchId},Kh.prototype.os=function(t){t=this.cs(t);return t<0||t>=this._n.length?null:this._n[t]},Kh),Ch=(jh.prototype.addEntry=function(t,e,n){var r=e.key,i=this.docs.get(r),o=i?i.size:0,i=this.ls(e);return this.docs=this.docs.insert(r,{document:e.clone(),size:i,readTime:n}),this.size+=i-o,this.Ut.addToCollectionParentIndex(t,r.path.popLast())},jh.prototype.removeEntry=function(t){var e=this.docs.get(t);e&&(this.docs=this.docs.remove(t),this.size-=e.size)},jh.prototype.getEntry=function(t,e){var n=this.docs.get(e);return fu.resolve(n?n.document.clone():Qi.newInvalidDocument(e))},jh.prototype.getEntries=function(t,e){var n=this,r=zs;return e.forEach(function(t){var e=n.docs.get(t);r=r.insert(t,e?e.document.clone():Qi.newInvalidDocument(t))}),fu.resolve(r)},jh.prototype.getDocumentsMatchingQuery=function(t,e,n){for(var r=zs,i=new Ni(e.path.child("")),o=this.docs.getIteratorFrom(i);o.hasNext();){var s=o.getNext(),a=s.key,u=s.value,s=u.document,u=u.readTime;if(!e.path.isPrefixOf(a.path))break;u.compareTo(n)<=0||Ko(e,s)&&(r=r.insert(s.key,s.clone()))}return fu.resolve(r)},jh.prototype.fs=function(t,e){return fu.forEach(this.docs,function(t){return e(t)})},jh.prototype.newChangeBuffer=function(t){return new kh(this)},jh.prototype.getSize=function(t){return fu.resolve(this.size)},jh),kh=(n(Bh,_h=A),Bh.prototype.applyChanges=function(n){var r=this,i=[];return this.changes.forEach(function(t,e){e.document.isValidDocument()?i.push(r.Ie.addEntry(n,e.document,r.getReadTime(t))):r.Ie.removeEntry(t)}),fu.waitFor(i)},Bh.prototype.getFromCache=function(t,e){return this.Ie.getEntry(t,e)},Bh.prototype.getAllFromCache=function(t,e){return this.Ie.getEntries(t,e)},Bh),Rh=(qh.prototype.forEachTarget=function(t,n){return this.ds.forEach(function(t,e){return n(e)}),fu.resolve()},qh.prototype.getLastRemoteSnapshotVersion=function(t){return fu.resolve(this.lastRemoteSnapshotVersion)},qh.prototype.getHighestSequenceNumber=function(t){return fu.resolve(this.ws)},qh.prototype.allocateTargetId=function(t){return this.highestTargetId=this.ys.next(),fu.resolve(this.highestTargetId)},qh.prototype.setTargetsMetadata=function(t,e,n){return n&&(this.lastRemoteSnapshotVersion=n),e>this.ws&&(this.ws=e),fu.resolve()},qh.prototype.te=function(t){this.ds.set(t.target,t);var e=t.targetId;e>this.highestTargetId&&(this.ys=new vc(e),this.highestTargetId=e),t.sequenceNumber>this.ws&&(this.ws=t.sequenceNumber)},qh.prototype.addTargetData=function(t,e){return this.te(e),this.targetCount+=1,fu.resolve()},qh.prototype.updateTargetData=function(t,e){return this.te(e),fu.resolve()},qh.prototype.removeTargetData=function(t,e){return this.ds.delete(e.target),this._s.Zn(e.targetId),--this.targetCount,fu.resolve()},qh.prototype.removeTargets=function(n,r,i){var o=this,s=0,a=[];return this.ds.forEach(function(t,e){e.sequenceNumber<=r&&null===i.get(e.targetId)&&(o.ds.delete(t),a.push(o.removeMatchingKeysForTargetId(n,e.targetId)),s++)}),fu.waitFor(a).next(function(){return s})},qh.prototype.getTargetCount=function(t){return fu.resolve(this.targetCount)},qh.prototype.getTargetData=function(t,e){e=this.ds.get(e)||null;return fu.resolve(e)},qh.prototype.addMatchingKeys=function(t,e,n){return this._s.Jn(e,n),fu.resolve()},qh.prototype.removeMatchingKeys=function(e,t,n){this._s.Xn(t,n);var r=this.persistence.referenceDelegate,i=[];return r&&t.forEach(function(t){i.push(r.markPotentiallyOrphaned(e,t))}),fu.waitFor(i)},qh.prototype.removeMatchingKeysForTargetId=function(t,e){return this._s.Zn(e),fu.resolve()},qh.prototype.getMatchingKeysForTargetId=function(t,e){e=this._s.es(e);return fu.resolve(e)},qh.prototype.containsKey=function(t,e){return fu.resolve(this._s.containsKey(e))},qh),xh=(Uh.prototype.start=function(){return Promise.resolve()},Uh.prototype.shutdown=function(){return this.xe=!1,Promise.resolve()},Object.defineProperty(Uh.prototype,"started",{get:function(){return this.xe},enumerable:!1,configurable:!0}),Uh.prototype.setDatabaseDeletedListener=function(){},Uh.prototype.setNetworkEnabled=function(){},Uh.prototype.getIndexManager=function(){return this.Ut},Uh.prototype.getMutationQueue=function(t){var e=this.gs[t.toKey()];return e||(e=new Nh(this.Ut,this.referenceDelegate),this.gs[t.toKey()]=e),e},Uh.prototype.getTargetCache=function(){return this.qe},Uh.prototype.getRemoteDocumentCache=function(){return this.Ue},Uh.prototype.getBundleCache=function(){return this.Ke},Uh.prototype.runTransaction=function(t,e,n){var r=this;Kr("MemoryPersistence","Starting transaction:",t);var i=new Oh(this.Ne.next());return this.referenceDelegate.Es(),n(i).next(function(t){return r.referenceDelegate.Ts(i).next(function(){return t})}).toPromise().then(function(t){return i.raiseOnCommittedEvent(),t})},Uh.prototype.Is=function(e,n){return fu.or(Object.values(this.gs).map(function(t){return function(){return t.containsKey(e,n)}}))},Uh),Oh=(n(Vh,Ih=R),Vh),Lh=(Fh.bs=function(t){return new Fh(t)},Object.defineProperty(Fh.prototype,"vs",{get:function(){if(this.Rs)return this.Rs;throw zr()},enumerable:!1,configurable:!0}),Fh.prototype.addReference=function(t,e,n){return this.As.addReference(n,e),this.vs.delete(n.toString()),fu.resolve()},Fh.prototype.removeReference=function(t,e,n){return this.As.removeReference(n,e),this.vs.add(n.toString()),fu.resolve()},Fh.prototype.markPotentiallyOrphaned=function(t,e){return this.vs.add(e.toString()),fu.resolve()},Fh.prototype.removeTarget=function(t,e){var n=this;this.As.Zn(e.targetId).forEach(function(t){return n.vs.add(t.toString())});var r=this.persistence.getTargetCache();return r.getMatchingKeysForTargetId(t,e.targetId).next(function(t){t.forEach(function(t){return n.vs.add(t.toString())})}).next(function(){return r.removeTargetData(t,e)})},Fh.prototype.Es=function(){this.Rs=new Set},Fh.prototype.Ts=function(n){var r=this,i=this.persistence.getRemoteDocumentCache().newChangeBuffer();return fu.forEach(this.vs,function(t){var e=Ni.fromPath(t);return r.Ps(n,e).next(function(t){t||i.removeEntry(e)})}).next(function(){return r.Rs=null,i.apply(n)})},Fh.prototype.updateLimboDocument=function(t,e){var n=this;return this.Ps(t,e).next(function(t){t?n.vs.delete(e.toString()):n.vs.add(e.toString())})},Fh.prototype.ps=function(t){return 0},Fh.prototype.Ps=function(t,e){var n=this;return fu.or([function(){return fu.resolve(n.As.containsKey(e))},function(){return n.persistence.getTargetCache().containsKey(t,e)},function(){return n.persistence.Is(t,e)}])},Fh),Ph=(Mh.prototype.isAuthenticated=function(){return null!=this.uid},Mh.prototype.toKey=function(){return this.isAuthenticated()?"uid:"+this.uid:"anonymous-user"},Mh.prototype.isEqual=function(t){return t.uid===this.uid},Mh);function Mh(t){this.uid=t}function Fh(t){this.persistence=t,this.As=new Ah,this.Rs=null}function Vh(t){var e=this;return(e=Ih.call(this)||this).currentSequenceNumber=t,e}function Uh(t,e){var n=this;this.gs={},this.Ne=new Pr(0),this.xe=!1,this.xe=!0,this.referenceDelegate=t(this),this.qe=new Rh(this),this.Ut=new tc,this.Ue=(t=this.Ut,new Ch(t,function(t){return n.referenceDelegate.ps(t)})),this.R=new Mu(e),this.Ke=new Sh(this.R)}function qh(t){this.persistence=t,this.ds=new Fc(Yi,Xi),this.lastRemoteSnapshotVersion=ei.min(),this.highestTargetId=0,this.ws=0,this._s=new Ah,this.targetCount=0,this.ys=vc.Jt()}function Bh(t){var e=this;return(e=_h.call(this)||this).Ie=t,e}function jh(t,e){this.Ut=t,this.ls=e,this.docs=new Vs(Ni.comparator),this.size=0}function Kh(t,e){this.Ut=t,this.referenceDelegate=e,this._n=[],this.ss=1,this.rs=new Qs(Dh.Gn)}function Gh(t,e){this.key=t,this.ns=e}function Qh(){this.Wn=new Qs(Dh.Gn),this.zn=new Qs(Dh.Hn)}function Hh(t){this.R=t,this.Qn=new Map,this.jn=new Map}function zh(t,e){return"firestore_clients_"+t+"_"+e}function Wh(t,e,n){n="firestore_mutations_"+t+"_"+n;return e.isAuthenticated()&&(n+="_"+e.uid),n}function Yh(t,e){return"firestore_targets_"+t+"_"+e}Ph.UNAUTHENTICATED=new Ph(null),Ph.GOOGLE_CREDENTIALS=new Ph("google-credentials-uid"),Ph.FIRST_PARTY=new Ph("first-party-uid"),Ph.MOCK_USER=new Ph("mock-user");var Xh,$h=(bl.Vs=function(t,e,n){var r,i=JSON.parse(n),o="object"==typeof i&&-1!==["pending","acknowledged","rejected"].indexOf(i.state)&&(void 0===i.error||"object"==typeof i.error);return o&&i.error&&(o="string"==typeof i.error.message&&"string"==typeof i.error.code)&&(r=new Ur(i.error.code,i.error.message)),o?new bl(t,e,i.state,r):(Gr("SharedClientState","Failed to parse mutation state for ID '"+e+"': "+n),null)},bl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},bl),Jh=(wl.Vs=function(t,e){var n,r=JSON.parse(e),i="object"==typeof r&&-1!==["not-current","current","rejected"].indexOf(r.state)&&(void 0===r.error||"object"==typeof r.error);return i&&r.error&&(i="string"==typeof r.error.message&&"string"==typeof r.error.code)&&(n=new Ur(r.error.code,r.error.message)),i?new wl(t,r.state,n):(Gr("SharedClientState","Failed to parse target state for ID '"+t+"': "+e),null)},wl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},wl),Zh=(vl.Vs=function(t,e){for(var n=JSON.parse(e),r="object"==typeof n&&n.activeTargetIds instanceof Array,i=ta,o=0;r&&othis.Bi&&(this.qi=this.Bi)},Vl.prototype.Gi=function(){null!==this.Ui&&(this.Ui.skipDelay(),this.Ui=null)},Vl.prototype.cancel=function(){null!==this.Ui&&(this.Ui.cancel(),this.Ui=null)},Vl.prototype.Wi=function(){return(Math.random()-.5)*this.qi},Vl),A=(Fl.prototype.tr=function(){return 1===this.state||2===this.state||4===this.state},Fl.prototype.er=function(){return 2===this.state},Fl.prototype.start=function(){3!==this.state?this.auth():this.nr()},Fl.prototype.stop=function(){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.tr()?[4,this.close(0)]:[3,2];case 1:t.sent(),t.label=2;case 2:return[2]}})})},Fl.prototype.sr=function(){this.state=0,this.Zi.reset()},Fl.prototype.ir=function(){var t=this;this.er()&&null===this.Xi&&(this.Xi=this.Se.enqueueAfterDelay(this.zi,6e4,function(){return t.rr()}))},Fl.prototype.cr=function(t){this.ur(),this.stream.send(t)},Fl.prototype.rr=function(){return y(this,void 0,void 0,function(){return g(this,function(t){return this.er()?[2,this.close(0)]:[2]})})},Fl.prototype.ur=function(){this.Xi&&(this.Xi.cancel(),this.Xi=null)},Fl.prototype.close=function(e,n){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.ur(),this.Zi.cancel(),this.Yi++,3!==e?this.Zi.reset():n&&n.code===Vr.RESOURCE_EXHAUSTED?(Gr(n.toString()),Gr("Using maximum backoff delay to prevent overloading the backend."),this.Zi.Qi()):n&&n.code===Vr.UNAUTHENTICATED&&this.Ji.invalidateToken(),null!==this.stream&&(this.ar(),this.stream.close(),this.stream=null),this.state=e,[4,this.listener.Ri(n)];case 1:return t.sent(),[2]}})})},Fl.prototype.ar=function(){},Fl.prototype.auth=function(){var n=this;this.state=1;var t=this.hr(this.Yi),e=this.Yi;this.Ji.getToken().then(function(t){n.Yi===e&&n.lr(t)},function(e){t(function(){var t=new Ur(Vr.UNKNOWN,"Fetching auth token failed: "+e.message);return n.dr(t)})})},Fl.prototype.lr=function(t){var e=this,n=this.hr(this.Yi);this.stream=this.wr(t),this.stream.Ii(function(){n(function(){return e.state=2,e.listener.Ii()})}),this.stream.Ri(function(t){n(function(){return e.dr(t)})}),this.stream.onMessage(function(t){n(function(){return e.onMessage(t)})})},Fl.prototype.nr=function(){var t=this;this.state=4,this.Zi.ji(function(){return y(t,void 0,void 0,function(){return g(this,function(t){return this.state=0,this.start(),[2]})})})},Fl.prototype.dr=function(t){return Kr("PersistentStream","close with error: "+t),this.stream=null,this.close(3,t)},Fl.prototype.hr=function(e){var n=this;return function(t){n.Se.enqueueAndForget(function(){return n.Yi===e?t():(Kr("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve())})}},Fl),Cl=(n(Ml,Dl=A),Ml.prototype.wr=function(t){return this.Hi.Oi("Listen",t)},Ml.prototype.onMessage=function(t){this.Zi.reset();var e=function(t,e){if("targetChange"in e){e.targetChange;var n="NO_CHANGE"===(o=e.targetChange.targetChangeType||"NO_CHANGE")?0:"ADD"===o?1:"REMOVE"===o?2:"CURRENT"===o?3:"RESET"===o?4:zr(),r=e.targetChange.targetIds||[],i=(s=e.targetChange.resumeToken,t.I?(Wr(void 0===s||"string"==typeof s),di.fromBase64String(s||"")):(Wr(void 0===s||s instanceof Uint8Array),di.fromUint8Array(s||new Uint8Array))),o=(a=e.targetChange.cause)&&(u=void 0===(c=a).code?Vr.UNKNOWN:Fs(c.code),new Ur(u,c.message||"")),s=new oa(n,r,i,o||null)}else if("documentChange"in e){e.documentChange,(n=e.documentChange).document,n.document.name,n.document.updateTime;var r=Ia(t,n.document.name),i=wa(n.document.updateTime),a=new Ki({mapValue:{fields:n.document.fields}}),u=(o=Qi.newFoundDocument(r,i,a),n.targetIds||[]),c=n.removedTargetIds||[];s=new ra(u,c,o.key,o)}else if("documentDelete"in e)e.documentDelete,(n=e.documentDelete).document,r=Ia(t,n.document),i=n.readTime?wa(n.readTime):ei.min(),a=Qi.newNoDocument(r,i),o=n.removedTargetIds||[],s=new ra([],o,a.key,a);else if("documentRemove"in e)e.documentRemove,(n=e.documentRemove).document,r=Ia(t,n.document),i=n.removedTargetIds||[],s=new ra([],i,r,null);else{if(!("filter"in e))return zr();e.filter;e=e.filter;e.targetId,n=e.count||0,r=new Ns(n),i=e.targetId,s=new ia(i,r)}return s}(this.R,t),t=function(t){if(!("targetChange"in t))return ei.min();t=t.targetChange;return(!t.targetIds||!t.targetIds.length)&&t.readTime?wa(t.readTime):ei.min()}(t);return this.listener._r(e,t)},Ml.prototype.mr=function(t){var e,n,r,i={};i.database=Aa(this.R),i.addTarget=(e=this.R,(r=$i(r=(n=t).target)?{documents:xa(e,r)}:{query:Oa(e,r)}).targetId=n.targetId,0this.query.limit;){var n=xo(this.query)?h.last():h.first(),h=h.delete(n.key),c=c.delete(n.key);a.track({type:1,doc:n})}return{fo:h,mo:a,Nn:l,mutatedKeys:c}},Pf.prototype.yo=function(t,e){return t.hasLocalMutations&&e.hasCommittedMutations&&!e.hasLocalMutations},Pf.prototype.applyChanges=function(t,e,n){var o=this,r=this.fo;this.fo=t.fo,this.mutatedKeys=t.mutatedKeys;var i=t.mo.jr();i.sort(function(t,e){return r=t.type,i=e.type,n(r)-n(i)||o.lo(t.doc,e.doc);function n(t){switch(t){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return zr()}}var r,i}),this.po(n);var s=e?this.Eo():[],n=0===this.ho.size&&this.current?1:0,e=n!==this.ao;return this.ao=n,0!==i.length||e?{snapshot:new lf(this.query,t.fo,r,i,t.mutatedKeys,0==n,e,!1),To:s}:{To:s}},Pf.prototype.zr=function(t){return this.current&&"Offline"===t?(this.current=!1,this.applyChanges({fo:this.fo,mo:new hf,mutatedKeys:this.mutatedKeys,Nn:!1},!1)):{To:[]}},Pf.prototype.Io=function(t){return!this.uo.has(t)&&!!this.fo.has(t)&&!this.fo.get(t).hasLocalMutations},Pf.prototype.po=function(t){var e=this;t&&(t.addedDocuments.forEach(function(t){return e.uo=e.uo.add(t)}),t.modifiedDocuments.forEach(function(t){}),t.removedDocuments.forEach(function(t){return e.uo=e.uo.delete(t)}),this.current=t.current)},Pf.prototype.Eo=function(){var e=this;if(!this.current)return[];var n=this.ho;this.ho=Zs(),this.fo.forEach(function(t){e.Io(t.key)&&(e.ho=e.ho.add(t.key))});var r=[];return n.forEach(function(t){e.ho.has(t)||r.push(new Cf(t))}),this.ho.forEach(function(t){n.has(t)||r.push(new Nf(t))}),r},Pf.prototype.Ao=function(t){this.uo=t.Bn,this.ho=Zs();t=this._o(t.documents);return this.applyChanges(t,!0)},Pf.prototype.Ro=function(){return lf.fromInitialDocuments(this.query,this.fo,this.mutatedKeys,0===this.ao)},Pf),Rf=function(t,e,n){this.query=t,this.targetId=e,this.view=n},xf=function(t){this.key=t,this.bo=!1},Of=(Object.defineProperty(Lf.prototype,"isPrimaryClient",{get:function(){return!0===this.$o},enumerable:!1,configurable:!0}),Lf);function Lf(t,e,n,r,i,o){this.localStore=t,this.remoteStore=e,this.eventManager=n,this.sharedClientState=r,this.currentUser=i,this.maxConcurrentLimboResolutions=o,this.vo={},this.Po=new Fc(Bo,qo),this.Vo=new Map,this.So=new Set,this.Do=new Vs(Ni.comparator),this.Co=new Map,this.No=new Ah,this.xo={},this.ko=new Map,this.Fo=vc.Yt(),this.onlineState="Unknown",this.$o=void 0}function Pf(t,e){this.query=t,this.uo=e,this.ao=null,this.current=!1,this.ho=Zs(),this.mutatedKeys=Zs(),this.lo=Go(t),this.fo=new cf(this.lo)}function Mf(i,o,s,a){return y(this,void 0,void 0,function(){var e,n,r;return g(this,function(t){switch(t.label){case 0:return i.Oo=function(t,e,n){return function(r,i,o,s){return y(this,void 0,void 0,function(){var e,n;return g(this,function(t){switch(t.label){case 0:return(e=i.view._o(o)).Nn?[4,wh(r.localStore,i.query,!1).then(function(t){t=t.documents;return i.view._o(t,e)})]:[3,2];case 1:e=t.sent(),t.label=2;case 2:return n=s&&s.targetChanges.get(i.targetId),n=i.view.applyChanges(e,r.isPrimaryClient,n),[2,(Hf(r,i.targetId,n.To),n.snapshot)]}})})}(i,t,e,n)},[4,wh(i.localStore,o,!0)];case 1:return n=t.sent(),r=new kf(o,n.Bn),e=r._o(n.documents),n=na.createSynthesizedTargetChangeForCurrentChange(s,a&&"Offline"!==i.onlineState),n=r.applyChanges(e,i.isPrimaryClient,n),Hf(i,s,n.To),r=new Rf(o,s,r),[2,(i.Po.set(o,r),i.Vo.has(s)?i.Vo.get(s).push(o):i.Vo.set(s,[o]),n.snapshot)]}})})}function Ff(f,d,p){return y(this,void 0,void 0,function(){var s,l;return g(this,function(t){switch(t.label){case 0:l=ed(f),t.label=1;case 1:return t.trys.push([1,5,,6]),[4,(i=l.localStore,a=d,c=i,h=ti.now(),o=a.reduce(function(t,e){return t.add(e.key)},Zs()),c.persistence.runTransaction("Locally write mutations","readwrite",function(s){return c.Mn.pn(s,o).next(function(t){u=t;for(var e=[],n=0,r=a;n, or >=) must be on the same field. But you have inequality filters on '"+n.toString()+"' and '"+e.field.toString()+"'");n=Lo(t);null!==n&&ag(0,e.field,n)}t=function(t,e){for(var n=0,r=t.filters;ns.length)throw new Ur(Vr.INVALID_ARGUMENT,"Too many arguments provided to "+r+"(). The number of arguments must be less than or equal to the number of orderBy() clauses");for(var a=[],u=0;u, or >=) on field '"+e.toString()+"' and so you must also use '"+e.toString()+"' as your first argument to orderBy(), but your first orderBy() is on field '"+n.toString()+"' instead.")}ug.prototype.convertValue=function(t,e){switch(void 0===e&&(e="none"),ki(t)){case 0:return null;case 1:return t.booleanValue;case 2:return Ei(t.integerValue||t.doubleValue);case 3:return this.convertTimestamp(t.timestampValue);case 4:return this.convertServerTimestamp(t,e);case 5:return t.stringValue;case 6:return this.convertBytes(Ti(t.bytesValue));case 7:return this.convertReference(t.referenceValue);case 8:return this.convertGeoPoint(t.geoPointValue);case 9:return this.convertArray(t.arrayValue,e);case 10:return this.convertObject(t.mapValue,e);default:throw zr()}},ug.prototype.convertObject=function(t,n){var r=this,i={};return oi(t.fields,function(t,e){i[t]=r.convertValue(e,n)}),i},ug.prototype.convertGeoPoint=function(t){return new Lp(Ei(t.latitude),Ei(t.longitude))},ug.prototype.convertArray=function(t,e){var n=this;return(t.values||[]).map(function(t){return n.convertValue(t,e)})},ug.prototype.convertServerTimestamp=function(t,e){switch(e){case"previous":var n=function t(e){e=e.mapValue.fields.__previous_value__;return Ii(e)?t(e):e}(t);return null==n?null:this.convertValue(n,e);case"estimate":return this.convertTimestamp(_i(t));default:return null}},ug.prototype.convertTimestamp=function(t){t=bi(t);return new ti(t.seconds,t.nanos)},ug.prototype.convertDocumentKey=function(t,e){var n=ci.fromString(t);Wr(Ba(n));t=new Fd(n.get(1),n.get(3)),n=new Ni(n.popFirst(5));return t.isEqual(e)||Gr("Document "+n+" contains a document reference within a different database ("+t.projectId+"/"+t.database+") which is not supported. It will be treated as a reference in the current database ("+e.projectId+"/"+e.database+") instead."),n},A=ug;function ug(){}function cg(t,e,n){return t?n&&(n.merge||n.mergeFields)?t.toFirestore(e,n):t.toFirestore(e):e}var hg,lg=(n(pg,hg=A),pg.prototype.convertBytes=function(t){return new xp(t)},pg.prototype.convertReference=function(t){t=this.convertDocumentKey(t,this.firestore._databaseId);return new ap(this.firestore,null,t)},pg),fg=(dg.prototype.set=function(t,e,n){this._verifyNotCommitted();t=yg(t,this._firestore),e=cg(t.converter,e,n),n=Yp(this._dataReader,"WriteBatch.set",t._key,e,null!==t.converter,n);return this._mutations.push(n.toMutation(t._key,ds.none())),this},dg.prototype.update=function(t,e,n){for(var r=[],i=3;i Date: Tue, 3 May 2022 14:02:58 -0500 Subject: [PATCH 3/7] Revert "first config changes for release" This reverts commit 40104d037dd0bd92d4a23a7962c640f4c6dd8445. --- .firebaserc | 5 ----- firebase.json | 8 ++++++-- web/__/firebase/8.10.1/firebase-app.js | 2 ++ web/__/firebase/8.10.1/firebase-auth.js | 2 ++ web/__/firebase/8.10.1/firebase-firestore.js | 2 ++ web/__/firebase/init.js | 11 +++++++++++ 6 files changed, 23 insertions(+), 7 deletions(-) delete mode 100644 .firebaserc create mode 100644 web/__/firebase/8.10.1/firebase-app.js create mode 100644 web/__/firebase/8.10.1/firebase-auth.js create mode 100644 web/__/firebase/8.10.1/firebase-firestore.js create mode 100644 web/__/firebase/init.js diff --git a/.firebaserc b/.firebaserc deleted file mode 100644 index 98857542..00000000 --- a/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "io-pinball" - } -} diff --git a/firebase.json b/firebase.json index 99025785..80e2ae69 100644 --- a/firebase.json +++ b/firebase.json @@ -1,7 +1,11 @@ { "hosting": { "public": "build/web", - "site": "io-pinball", - "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] + "site": "ashehwkdkdjruejdnensjsjdne", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] } } diff --git a/web/__/firebase/8.10.1/firebase-app.js b/web/__/firebase/8.10.1/firebase-app.js new file mode 100644 index 00000000..c688d1c4 --- /dev/null +++ b/web/__/firebase/8.10.1/firebase-app.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).firebase=t()}(this,function(){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var n=function(){return(n=Object.assign||function(e){for(var t,n=1,r=arguments.length;na[0]&&t[1]=e.length?void 0:e)&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function f(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||0"})):"Error",e=this.serviceName+": "+e+" ("+o+").";return new c(o,e,i)},v);function v(e,t,n){this.service=e,this.serviceName=t,this.errors=n}var m=/\{\$([^}]+)}/g;function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){t=new b(e,t);return t.subscribe.bind(t)}var b=(I.prototype.next=function(t){this.forEachObserver(function(e){e.next(t)})},I.prototype.error=function(t){this.forEachObserver(function(e){e.error(t)}),this.close(t)},I.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},I.prototype.subscribe=function(e,t,n){var r,i=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n=(null!=o?o:e.logLevel)&&a({level:R[t].toLowerCase(),message:i,args:n,type:e.name})}}(n[e])}var H=((H={})["no-app"]="No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()",H["bad-app-name"]="Illegal App name: '{$appName}",H["duplicate-app"]="Firebase App named '{$appName}' already exists",H["app-deleted"]="Firebase App named '{$appName}' already deleted",H["invalid-app-argument"]="firebase.{$appName}() takes either no argument or a Firebase App instance.",H["invalid-log-argument"]="First argument to `onLog` must be null or a function.",H),V=new d("app","Firebase",H),B="@firebase/app",M="[DEFAULT]",U=((H={})[B]="fire-core",H["@firebase/analytics"]="fire-analytics",H["@firebase/app-check"]="fire-app-check",H["@firebase/auth"]="fire-auth",H["@firebase/database"]="fire-rtdb",H["@firebase/functions"]="fire-fn",H["@firebase/installations"]="fire-iid",H["@firebase/messaging"]="fire-fcm",H["@firebase/performance"]="fire-perf",H["@firebase/remote-config"]="fire-rc",H["@firebase/storage"]="fire-gcs",H["@firebase/firestore"]="fire-fst",H["fire-js"]="fire-js",H["firebase-wrapper"]="fire-js-all",H),W=new z("@firebase/app"),G=(Object.defineProperty($.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this.automaticDataCollectionEnabled_},set:function(e){this.checkDestroyed_(),this.automaticDataCollectionEnabled_=e},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!1,configurable:!0}),$.prototype.delete=function(){var t=this;return new Promise(function(e){t.checkDestroyed_(),e()}).then(function(){return t.firebase_.INTERNAL.removeApp(t.name_),Promise.all(t.container.getProviders().map(function(e){return e.delete()}))}).then(function(){t.isDeleted_=!0})},$.prototype._getService=function(e,t){void 0===t&&(t=M),this.checkDestroyed_();var n=this.container.getProvider(e);return n.isInitialized()||"EXPLICIT"!==(null===(e=n.getComponent())||void 0===e?void 0:e.instantiationMode)||n.initialize(),n.getImmediate({identifier:t})},$.prototype._removeServiceInstance=function(e,t){void 0===t&&(t=M),this.container.getProvider(e).clearInstance(t)},$.prototype._addComponent=function(t){try{this.container.addComponent(t)}catch(e){W.debug("Component "+t.name+" failed to register with FirebaseApp "+this.name,e)}},$.prototype._addOrOverwriteComponent=function(e){this.container.addOrOverwriteComponent(e)},$.prototype.toJSON=function(){return{name:this.name,automaticDataCollectionEnabled:this.automaticDataCollectionEnabled,options:this.options}},$.prototype.checkDestroyed_=function(){if(this.isDeleted_)throw V.create("app-deleted",{appName:this.name_})},$);function $(e,t,n){var r=this;this.firebase_=n,this.isDeleted_=!1,this.name_=t.name,this.automaticDataCollectionEnabled_=t.automaticDataCollectionEnabled||!1,this.options_=h(void 0,e),this.container=new S(t.name),this._addComponent(new O("app",function(){return r},"PUBLIC")),this.firebase_.INTERNAL.components.forEach(function(e){return r._addComponent(e)})}G.prototype.name&&G.prototype.options||G.prototype.delete||console.log("dc");var K="8.10.1";function Y(a){var s={},l=new Map,c={__esModule:!0,initializeApp:function(e,t){void 0===t&&(t={});"object"==typeof t&&null!==t||(t={name:t});var n=t;void 0===n.name&&(n.name=M);t=n.name;if("string"!=typeof t||!t)throw V.create("bad-app-name",{appName:String(t)});if(y(s,t))throw V.create("duplicate-app",{appName:t});n=new a(e,n,c);return s[t]=n},app:u,registerVersion:function(e,t,n){var r=null!==(i=U[e])&&void 0!==i?i:e;n&&(r+="-"+n);var i=r.match(/\s|\//),e=t.match(/\s|\//);i||e?(n=['Unable to register library "'+r+'" with version "'+t+'":'],i&&n.push('library name "'+r+'" contains illegal characters (whitespace or "/")'),i&&e&&n.push("and"),e&&n.push('version name "'+t+'" contains illegal characters (whitespace or "/")'),W.warn(n.join(" "))):o(new O(r+"-version",function(){return{library:r,version:t}},"VERSION"))},setLogLevel:T,onLog:function(e,t){if(null!==e&&"function"!=typeof e)throw V.create("invalid-log-argument");x(e,t)},apps:null,SDK_VERSION:K,INTERNAL:{registerComponent:o,removeApp:function(e){delete s[e]},components:l,useAsService:function(e,t){return"serverAuth"!==t?t:null}}};function u(e){if(!y(s,e=e||M))throw V.create("no-app",{appName:e});return s[e]}function o(n){var e,r=n.name;if(l.has(r))return W.debug("There were multiple attempts to register component "+r+"."),"PUBLIC"===n.type?c[r]:null;l.set(r,n),"PUBLIC"===n.type&&(e=function(e){if("function"!=typeof(e=void 0===e?u():e)[r])throw V.create("invalid-app-argument",{appName:r});return e[r]()},void 0!==n.serviceProps&&h(e,n.serviceProps),c[r]=e,a.prototype[r]=function(){for(var e=[],t=0;t>>0),i=0;function r(t,e,n){return t.call.apply(t.bind,arguments)}function g(e,n,t){if(!e)throw Error();if(2/g,Q=/"/g,tt=/'/g,et=/\x00/g,nt=/[\x00&<>"']/;function it(t,e){return-1!=t.indexOf(e)}function rt(t,e){return t"}else o=void 0===t?"undefined":null===t?"null":typeof t;D("Argument is not a %s (or a non-Element, non-Location mock); got: %s",e,o)}}function dt(t,e){this.a=t===gt&&e||"",this.b=mt}function pt(t){return t instanceof dt&&t.constructor===dt&&t.b===mt?t.a:(D("expected object of type Const, got '"+t+"'"),"type_error:Const")}dt.prototype.ta=!0,dt.prototype.sa=function(){return this.a},dt.prototype.toString=function(){return"Const{"+this.a+"}"};var vt,mt={},gt={};function bt(){if(void 0===vt){var t=null,e=l.trustedTypes;if(e&&e.createPolicy){try{t=e.createPolicy("goog#html",{createHTML:I,createScript:I,createScriptURL:I})}catch(t){l.console&&l.console.error(t.message)}vt=t}else vt=t}return vt}function yt(t,e){this.a=e===At?t:""}function wt(t){return t instanceof yt&&t.constructor===yt?t.a:(D("expected object of type TrustedResourceUrl, got '"+t+"' of type "+d(t)),"type_error:TrustedResourceUrl")}function It(t,n){var e,i=pt(t);if(!Et.test(i))throw Error("Invalid TrustedResourceUrl format: "+i);return t=i.replace(Tt,function(t,e){if(!Object.prototype.hasOwnProperty.call(n,e))throw Error('Found marker, "'+e+'", in format string, "'+i+'", but no valid label mapping found in args: '+JSON.stringify(n));return(t=n[e])instanceof dt?pt(t):encodeURIComponent(String(t))}),e=t,t=bt(),new yt(e=t?t.createScriptURL(e):e,At)}yt.prototype.ta=!0,yt.prototype.sa=function(){return this.a.toString()},yt.prototype.toString=function(){return"TrustedResourceUrl{"+this.a+"}"};var Tt=/%{(\w+)}/g,Et=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i,At={};function kt(t,e){this.a=e===Dt?t:""}function St(t){return t instanceof kt&&t.constructor===kt?t.a:(D("expected object of type SafeUrl, got '"+t+"' of type "+d(t)),"type_error:SafeUrl")}kt.prototype.ta=!0,kt.prototype.sa=function(){return this.a.toString()},kt.prototype.toString=function(){return"SafeUrl{"+this.a+"}"};var Nt=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,_t=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Ot=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ct(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),t=Ot.test(t)||(e=(t=(t=String(t)).replace(/(%0A|%0D)/g,"")).match(_t))&&Nt.test(e[1])?new kt(t,Dt):null);var e}function Rt(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),new kt(t=!Ot.test(t)?"about:invalid#zClosurez":t,Dt))}var Dt={},Pt=new kt("about:invalid#zClosurez",Dt);function Lt(t,e,n){this.a=n===xt?t:""}Lt.prototype.ta=!0,Lt.prototype.sa=function(){return this.a.toString()},Lt.prototype.toString=function(){return"SafeHtml{"+this.a+"}"};var xt={};function Mt(t,e,n,i){return t=t instanceof kt?t:Rt(t),e=e||l,n=n instanceof dt?pt(n):n||"",e.open(St(t),n,i,void 0)}function jt(t){for(var e=t.split("%s"),n="",i=Array.prototype.slice.call(arguments,1);i.length&&1")?t.replace(Z,">"):t).indexOf('"')?t.replace(Q,"""):t).indexOf("'")?t.replace(tt,"'"):t).indexOf("\0")&&(t=t.replace(et,"�"))),t}function Vt(t){return Vt[" "](t),t}Vt[" "]=a;var Ft,qt=at("Opera"),Ht=at("Trident")||at("MSIE"),Kt=at("Edge"),Gt=Kt||Ht,Bt=at("Gecko")&&!(it(J.toLowerCase(),"webkit")&&!at("Edge"))&&!(at("Trident")||at("MSIE"))&&!at("Edge"),Wt=it(J.toLowerCase(),"webkit")&&!at("Edge");function Xt(){var t=l.document;return t?t.documentMode:void 0}t:{var Jt="",Yt=(Yt=J,Bt?/rv:([^\);]+)(\)|;)/.exec(Yt):Kt?/Edge\/([\d\.]+)/.exec(Yt):Ht?/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(Yt):Wt?/WebKit\/(\S+)/.exec(Yt):qt?/(?:Version)[ \/]?(\S+)/.exec(Yt):void 0);if(Yt&&(Jt=Yt?Yt[1]:""),Ht){Yt=Xt();if(null!=Yt&&Yt>parseFloat(Jt)){Ft=String(Yt);break t}}Ft=Jt}var zt={};function $t(s){return t=s,e=function(){for(var t=0,e=Y(String(Ft)).split("."),n=Y(String(s)).split("."),i=Math.max(e.length,n.length),r=0;0==t&&r"),i=i.join("")),i=ae(n,i),r&&("string"==typeof r?i.className=r:Array.isArray(r)?i.className=r.join(" "):ee(i,r)),2>>0);function ln(e){return v(e)?e:(e[hn]||(e[hn]=function(t){return e.handleEvent(t)}),e[hn])}function fn(){Pe.call(this),this.v=new Je(this),(this.bc=this).hb=null}function dn(t,e,n,i,r){t.v.add(String(e),n,!1,i,r)}function pn(t,e,n,i,r){t.v.add(String(e),n,!0,i,r)}function vn(t,e,n,i){if(!(e=t.v.a[String(e)]))return!0;e=e.concat();for(var r=!0,o=0;o>4&15).toString(16)+(15&t).toString(16)}An.prototype.toString=function(){var t=[],e=this.c;e&&t.push(Pn(e,xn,!0),":");var n=this.a;return!n&&"file"!=e||(t.push("//"),(e=this.l)&&t.push(Pn(e,xn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.g)&&t.push(":",String(n))),(n=this.f)&&(this.a&&"/"!=n.charAt(0)&&t.push("/"),t.push(Pn(n,"/"==n.charAt(0)?jn:Mn,!0))),(n=this.b.toString())&&t.push("?",n),(n=this.h)&&t.push("#",Pn(n,Vn)),t.join("")},An.prototype.resolve=function(t){var e=new An(this),n=!!t.c;n?kn(e,t.c):n=!!t.l,n?e.l=t.l:n=!!t.a,n?e.a=t.a:n=null!=t.g;var i=t.f;if(n)Sn(e,t.g);else if(n=!!t.f)if("/"!=i.charAt(0)&&(this.a&&!this.f?i="/"+i:-1!=(r=e.f.lastIndexOf("/"))&&(i=e.f.substr(0,r+1)+i)),".."==(r=i)||"."==r)i="";else if(it(r,"./")||it(r,"/.")){for(var i=0==r.lastIndexOf("/",0),r=r.split("/"),o=[],a=0;a2*t.c&&In(t)))}function Gn(t,e){return qn(t),e=Xn(t,e),Tn(t.a.b,e)}function Bn(t,e,n){Kn(t,e),0',t=new Lt(t=(i=bt())?i.createHTML(t):t,0,xt),i=a.document)&&(i.write((o=t)instanceof Lt&&o.constructor===Lt?o.a:(D("expected object of type SafeHtml, got '"+o+"' of type "+d(o)),"type_error:SafeHtml")),i.close())):(a=Mt(e,i,n,a))&&t.noopener&&(a.opener=null),a)try{a.focus()}catch(t){}return a}var oi=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,ai=/^[^@]+@[^@]+$/;function si(){var e=null;return new fe(function(t){"complete"==l.document.readyState?t():(e=function(){t()},en(window,"load",e))}).o(function(t){throw nn(window,"load",e),t})}function ui(t){return t=t||bi(),!("file:"!==Ei()&&"ionic:"!==Ei()||!t.toLowerCase().match(/iphone|ipad|ipod|android/))}function ci(){var t=l.window;try{return t&&t!=t.top}catch(t){return}}function hi(){return void 0!==l.WorkerGlobalScope&&"function"==typeof l.importScripts}function li(){return Zl.default.INTERNAL.hasOwnProperty("reactNative")?"ReactNative":Zl.default.INTERNAL.hasOwnProperty("node")?"Node":hi()?"Worker":"Browser"}function fi(){var t=li();return"ReactNative"===t||"Node"===t}var di="Firefox",pi="Chrome";function vi(t){var e=t.toLowerCase();return it(e,"opera/")||it(e,"opr/")||it(e,"opios/")?"Opera":it(e,"iemobile")?"IEMobile":it(e,"msie")||it(e,"trident/")?"IE":it(e,"edge/")?"Edge":it(e,"firefox/")?di:it(e,"silk/")?"Silk":it(e,"blackberry")?"Blackberry":it(e,"webos")?"Webos":!it(e,"safari/")||it(e,"chrome/")||it(e,"crios/")||it(e,"android")?!it(e,"chrome/")&&!it(e,"crios/")||it(e,"edge/")?it(e,"android")?"Android":(t=t.match(/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/))&&2==t.length?t[1]:"Other":pi:"Safari"}var mi={md:"FirebaseCore-web",od:"FirebaseUI-web"};function gi(t,e){e=e||[];var n,i=[],r={};for(n in mi)r[mi[n]]=!0;for(n=0;n>4),64!=a&&(t(o<<4&240|a>>2),64!=s&&t(a<<6&192|s))}}(t,function(t){e.push(t)}),e}function Pr(t){var e=xr(t);if(!(e&&e.sub&&e.iss&&e.aud&&e.exp))throw Error("Invalid JWT");this.h=t,this.a=e.exp,this.i=e.sub,t=Date.now()/1e3,this.g=e.iat||(t>this.a?this.a:t),this.b=e.provider_id||e.firebase&&e.firebase.sign_in_provider||null,this.f=e.firebase&&e.firebase.tenant||null,this.c=!!e.is_anonymous||"anonymous"==this.b}function Lr(t){try{return new Pr(t)}catch(t){return null}}function xr(t){if(!t)return null;if(3!=(t=t.split(".")).length)return null;for(var e=(4-(t=t[1]).length%4)%4,n=0;n>10)),t[n++]=String.fromCharCode(56320+(1023&a))):(r=i[e++],o=i[e++],t[n++]=String.fromCharCode((15&s)<<12|(63&r)<<6|63&o))}return JSON.parse(t.join(""))}catch(t){}return null}Pr.prototype.T=function(){return this.f},Pr.prototype.l=function(){return this.c},Pr.prototype.toString=function(){return this.h};var Mr="oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token oauth_version".split(" "),jr=["client_id","response_type","scope","redirect_uri","state"],Ur={nd:{Ja:"locale",va:700,ua:600,fa:"facebook.com",Ya:jr},pd:{Ja:null,va:500,ua:750,fa:"github.com",Ya:jr},qd:{Ja:"hl",va:515,ua:680,fa:"google.com",Ya:jr},wd:{Ja:"lang",va:485,ua:705,fa:"twitter.com",Ya:Mr},kd:{Ja:"locale",va:640,ua:600,fa:"apple.com",Ya:[]}};function Vr(t){for(var e in Ur)if(Ur[e].fa==t)return Ur[e];return null}function Fr(t){var e={};e["facebook.com"]=Br,e["google.com"]=Xr,e["github.com"]=Wr,e["twitter.com"]=Jr;var n=t&&t[Hr];try{if(n)return new(e[n]||Gr)(t);if(void 0!==t[qr])return new Kr(t)}catch(t){}return null}var qr="idToken",Hr="providerId";function Kr(t){var e,n=t[Hr];if(n||!t[qr]||(e=Lr(t[qr]))&&e.b&&(n=e.b),!n)throw Error("Invalid additional user info!");e=!1,void 0!==t.isNewUser?e=!!t.isNewUser:"identitytoolkit#SignupNewUserResponse"===t.kind&&(e=!0),Fi(this,"providerId",n="anonymous"==n||"custom"==n?null:n),Fi(this,"isNewUser",e)}function Gr(t){Kr.call(this,t),Fi(this,"profile",Ki((t=Ni(t.rawUserInfo||"{}"))||{}))}function Br(t){if(Gr.call(this,t),"facebook.com"!=this.providerId)throw Error("Invalid provider ID!")}function Wr(t){if(Gr.call(this,t),"github.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",this.profile&&this.profile.login||null)}function Xr(t){if(Gr.call(this,t),"google.com"!=this.providerId)throw Error("Invalid provider ID!")}function Jr(t){if(Gr.call(this,t),"twitter.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",t.screenName||null)}function Yr(t){var e=On(i=Cn(t),"link"),n=On(Cn(e),"link"),i=On(i,"deep_link_id");return On(Cn(i),"link")||i||n||e||t}function zr(t,e){if(!t&&!e)throw new T("internal-error","Internal assert: no raw session string available");if(t&&e)throw new T("internal-error","Internal assert: unable to determine the session type");this.a=t||null,this.b=e||null,this.type=this.a?$r:Zr}w(Gr,Kr),w(Br,Gr),w(Wr,Gr),w(Xr,Gr),w(Jr,Gr);var $r="enroll",Zr="signin";function Qr(){}function to(t,n){return t.then(function(t){if(t[Ka]){var e=Lr(t[Ka]);if(!e||n!=e.i)throw new T("user-mismatch");return t}throw new T("user-mismatch")}).o(function(t){throw t&&t.code&&t.code==k+"user-not-found"?new T("user-mismatch"):t})}function eo(t,e){if(!e)throw new T("internal-error","failed to construct a credential");this.a=e,Fi(this,"providerId",t),Fi(this,"signInMethod",t)}function no(t){return{pendingToken:t.a,requestUri:"http://localhost"}}function io(t){if(t&&t.providerId&&t.signInMethod&&0==t.providerId.indexOf("saml.")&&t.pendingToken)try{return new eo(t.providerId,t.pendingToken)}catch(t){}return null}function ro(t,e,n){if(this.a=null,e.idToken||e.accessToken)e.idToken&&Fi(this,"idToken",e.idToken),e.accessToken&&Fi(this,"accessToken",e.accessToken),e.nonce&&!e.pendingToken&&Fi(this,"nonce",e.nonce),e.pendingToken&&(this.a=e.pendingToken);else{if(!e.oauthToken||!e.oauthTokenSecret)throw new T("internal-error","failed to construct a credential");Fi(this,"accessToken",e.oauthToken),Fi(this,"secret",e.oauthTokenSecret)}Fi(this,"providerId",t),Fi(this,"signInMethod",n)}function oo(t){var e={};return t.idToken&&(e.id_token=t.idToken),t.accessToken&&(e.access_token=t.accessToken),t.secret&&(e.oauth_token_secret=t.secret),e.providerId=t.providerId,t.nonce&&!t.a&&(e.nonce=t.nonce),e={postBody:Hn(e).toString(),requestUri:"http://localhost"},t.a&&(delete e.postBody,e.pendingToken=t.a),e}function ao(t){if(t&&t.providerId&&t.signInMethod){var e={idToken:t.oauthIdToken,accessToken:t.oauthTokenSecret?null:t.oauthAccessToken,oauthTokenSecret:t.oauthTokenSecret,oauthToken:t.oauthTokenSecret&&t.oauthAccessToken,nonce:t.nonce,pendingToken:t.pendingToken};try{return new ro(t.providerId,e,t.signInMethod)}catch(t){}}return null}function so(t,e){this.Qc=e||[],qi(this,{providerId:t,isOAuthProvider:!0}),this.Jb={},this.qb=(Vr(t)||{}).Ja||null,this.pb=null}function uo(t){if("string"!=typeof t||0!=t.indexOf("saml."))throw new T("argument-error",'SAML provider IDs must be prefixed with "saml."');so.call(this,t,[])}function co(t){so.call(this,t,jr),this.a=[]}function ho(){co.call(this,"facebook.com")}function lo(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new ho).credential({accessToken:e})}function fo(){co.call(this,"github.com")}function po(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new fo).credential({accessToken:e})}function vo(){co.call(this,"google.com"),this.Ca("profile")}function mo(t,e){var n=t;return m(t)&&(n=t.idToken,e=t.accessToken),(new vo).credential({idToken:n,accessToken:e})}function go(){so.call(this,"twitter.com",Mr)}function bo(t,e){var n=t;if(!(n=!m(n)?{oauthToken:t,oauthTokenSecret:e}:n).oauthToken||!n.oauthTokenSecret)throw new T("argument-error","credential failed: expected 2 arguments (the OAuth access token and secret).");return new ro("twitter.com",n,"twitter.com")}function yo(t,e,n){this.a=t,this.f=e,Fi(this,"providerId","password"),Fi(this,"signInMethod",n===Io.EMAIL_LINK_SIGN_IN_METHOD?Io.EMAIL_LINK_SIGN_IN_METHOD:Io.EMAIL_PASSWORD_SIGN_IN_METHOD)}function wo(t){return t&&t.email&&t.password?new yo(t.email,t.password,t.signInMethod):null}function Io(){qi(this,{providerId:"password",isOAuthProvider:!1})}function To(t,e){if(!(e=Eo(e)))throw new T("argument-error","Invalid email link!");return new yo(t,e.code,Io.EMAIL_LINK_SIGN_IN_METHOD)}function Eo(t){return(t=yr(t=Yr(t)))&&t.operation===Qi?t:null}function Ao(t){if(!(t.fb&&t.eb||t.La&&t.ea))throw new T("internal-error");this.a=t,Fi(this,"providerId","phone"),this.fa="phone",Fi(this,"signInMethod","phone")}function ko(e){if(e&&"phone"===e.providerId&&(e.verificationId&&e.verificationCode||e.temporaryProof&&e.phoneNumber)){var n={};return V(["verificationId","verificationCode","temporaryProof","phoneNumber"],function(t){e[t]&&(n[t]=e[t])}),new Ao(n)}return null}function So(t){return t.a.La&&t.a.ea?{temporaryProof:t.a.La,phoneNumber:t.a.ea}:{sessionInfo:t.a.fb,code:t.a.eb}}function No(t){try{this.a=t||Zl.default.auth()}catch(t){throw new T("argument-error","Either an instance of firebase.auth.Auth must be passed as an argument to the firebase.auth.PhoneAuthProvider constructor, or the default firebase App instance must be initialized via firebase.initializeApp().")}qi(this,{providerId:"phone",isOAuthProvider:!1})}function _o(t,e){if(!t)throw new T("missing-verification-id");if(!e)throw new T("missing-verification-code");return new Ao({fb:t,eb:e})}function Oo(t){if(t.temporaryProof&&t.phoneNumber)return new Ao({La:t.temporaryProof,ea:t.phoneNumber});var e=t&&t.providerId;if(!e||"password"===e)return null;var n=t&&t.oauthAccessToken,i=t&&t.oauthTokenSecret,r=t&&t.nonce,o=t&&t.oauthIdToken,a=t&&t.pendingToken;try{switch(e){case"google.com":return mo(o,n);case"facebook.com":return lo(n);case"github.com":return po(n);case"twitter.com":return bo(n,i);default:return n||i||o||a?a?0==e.indexOf("saml.")?new eo(e,a):new ro(e,{pendingToken:a,idToken:t.oauthIdToken,accessToken:t.oauthAccessToken},e):new co(e).credential({idToken:o,accessToken:n,rawNonce:r}):null}}catch(t){return null}}function Co(t){if(!t.isOAuthProvider)throw new T("invalid-oauth-provider")}function Ro(t,e,n,i,r,o,a){if(this.c=t,this.b=e||null,this.g=n||null,this.f=i||null,this.i=o||null,this.h=a||null,this.a=r||null,!this.g&&!this.a)throw new T("invalid-auth-event");if(this.g&&this.a)throw new T("invalid-auth-event");if(this.g&&!this.f)throw new T("invalid-auth-event")}function Do(t){return(t=t||{}).type?new Ro(t.type,t.eventId,t.urlResponse,t.sessionId,t.error&&E(t.error),t.postBody,t.tenantId):null}function Po(){this.b=null,this.a=[]}zr.prototype.Ha=function(){return this.a?ye(this.a):ye(this.b)},zr.prototype.w=function(){return this.type==$r?{multiFactorSession:{idToken:this.a}}:{multiFactorSession:{pendingCredential:this.b}}},Qr.prototype.ka=function(){},Qr.prototype.b=function(){},Qr.prototype.c=function(){},Qr.prototype.w=function(){},eo.prototype.ka=function(t){return ls(t,no(this))},eo.prototype.b=function(t,e){var n=no(this);return n.idToken=e,fs(t,n)},eo.prototype.c=function(t,e){return to(ds(t,no(this)),e)},eo.prototype.w=function(){return{providerId:this.providerId,signInMethod:this.signInMethod,pendingToken:this.a}},ro.prototype.ka=function(t){return ls(t,oo(this))},ro.prototype.b=function(t,e){var n=oo(this);return n.idToken=e,fs(t,n)},ro.prototype.c=function(t,e){return to(ds(t,oo(this)),e)},ro.prototype.w=function(){var t={providerId:this.providerId,signInMethod:this.signInMethod};return this.idToken&&(t.oauthIdToken=this.idToken),this.accessToken&&(t.oauthAccessToken=this.accessToken),this.secret&&(t.oauthTokenSecret=this.secret),this.nonce&&(t.nonce=this.nonce),this.a&&(t.pendingToken=this.a),t},so.prototype.Ka=function(t){return this.Jb=ct(t),this},w(uo,so),w(co,so),co.prototype.Ca=function(t){return K(this.a,t)||this.a.push(t),this},co.prototype.Rb=function(){return X(this.a)},co.prototype.credential=function(t,e){e=m(t)?{idToken:t.idToken||null,accessToken:t.accessToken||null,nonce:t.rawNonce||null}:{idToken:t||null,accessToken:e||null};if(!e.idToken&&!e.accessToken)throw new T("argument-error","credential failed: must provide the ID token and/or the access token.");return new ro(this.providerId,e,this.providerId)},w(ho,co),Fi(ho,"PROVIDER_ID","facebook.com"),Fi(ho,"FACEBOOK_SIGN_IN_METHOD","facebook.com"),w(fo,co),Fi(fo,"PROVIDER_ID","github.com"),Fi(fo,"GITHUB_SIGN_IN_METHOD","github.com"),w(vo,co),Fi(vo,"PROVIDER_ID","google.com"),Fi(vo,"GOOGLE_SIGN_IN_METHOD","google.com"),w(go,so),Fi(go,"PROVIDER_ID","twitter.com"),Fi(go,"TWITTER_SIGN_IN_METHOD","twitter.com"),yo.prototype.ka=function(t){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Is,{email:this.a,oobCode:this.f}):Js(t,Ks,{email:this.a,password:this.f})},yo.prototype.b=function(t,e){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Ts,{idToken:e,email:this.a,oobCode:this.f}):Js(t,xs,{idToken:e,email:this.a,password:this.f})},yo.prototype.c=function(t,e){return to(this.ka(t),e)},yo.prototype.w=function(){return{email:this.a,password:this.f,signInMethod:this.signInMethod}},qi(Io,{PROVIDER_ID:"password"}),qi(Io,{EMAIL_LINK_SIGN_IN_METHOD:"emailLink"}),qi(Io,{EMAIL_PASSWORD_SIGN_IN_METHOD:"password"}),Ao.prototype.ka=function(t){return t.gb(So(this))},Ao.prototype.b=function(t,e){var n=So(this);return n.idToken=e,Js(t,Bs,n)},Ao.prototype.c=function(t,e){var n=So(this);return n.operation="REAUTH",to(t=Js(t,Ws,n),e)},Ao.prototype.w=function(){var t={providerId:"phone"};return this.a.fb&&(t.verificationId=this.a.fb),this.a.eb&&(t.verificationCode=this.a.eb),this.a.La&&(t.temporaryProof=this.a.La),this.a.ea&&(t.phoneNumber=this.a.ea),t},No.prototype.gb=function(i,r){var o=this.a.a;return ye(r.verify()).then(function(e){if("string"!=typeof e)throw new T("argument-error","An implementation of firebase.auth.ApplicationVerifier.prototype.verify() must return a firebase.Promise that resolves with a string.");if("recaptcha"!==r.type)throw new T("argument-error",'Only firebase.auth.ApplicationVerifiers with type="recaptcha" are currently supported.');var t=m(i)?i.session:null,n=m(i)?i.phoneNumber:i,t=t&&t.type==$r?t.Ha().then(function(t){return Js(o,js,{idToken:t,phoneEnrollmentInfo:{phoneNumber:n,recaptchaToken:e}}).then(function(t){return t.phoneSessionInfo.sessionInfo})}):t&&t.type==Zr?t.Ha().then(function(t){return t={mfaPendingCredential:t,mfaEnrollmentId:i.multiFactorHint&&i.multiFactorHint.uid||i.multiFactorUid,phoneSignInInfo:{recaptchaToken:e}},Js(o,Us,t).then(function(t){return t.phoneResponseInfo.sessionInfo})}):Js(o,Ps,{phoneNumber:n,recaptchaToken:e});return t.then(function(t){return"function"==typeof r.reset&&r.reset(),t},function(t){throw"function"==typeof r.reset&&r.reset(),t})})},qi(No,{PROVIDER_ID:"phone"}),qi(No,{PHONE_SIGN_IN_METHOD:"phone"}),Ro.prototype.getUid=function(){var t=[];return t.push(this.c),this.b&&t.push(this.b),this.f&&t.push(this.f),this.h&&t.push(this.h),t.join("-")},Ro.prototype.T=function(){return this.h},Ro.prototype.w=function(){return{type:this.c,eventId:this.b,urlResponse:this.g,sessionId:this.f,postBody:this.i,tenantId:this.h,error:this.a&&this.a.w()}};var Lo,xo=null;function Mo(t){var e="unauthorized-domain",n=void 0,i=Cn(t);t=i.a,"chrome-extension"==(i=i.c)?n=jt("This chrome extension ID (chrome-extension://%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):"http"==i||"https"==i?n=jt("This domain (%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):e="operation-not-supported-in-this-environment",T.call(this,e,n)}function jo(t,e,n){T.call(this,t,n),(t=e||{}).Kb&&Fi(this,"email",t.Kb),t.ea&&Fi(this,"phoneNumber",t.ea),t.credential&&Fi(this,"credential",t.credential),t.$b&&Fi(this,"tenantId",t.$b)}function Uo(t){if(t.code){var e=t.code||"";0==e.indexOf(k)&&(e=e.substring(k.length));var n={credential:Oo(t),$b:t.tenantId};if(t.email)n.Kb=t.email;else if(t.phoneNumber)n.ea=t.phoneNumber;else if(!n.credential)return new T(e,t.message||void 0);return new jo(e,n,t.message)}return null}function Vo(){}function Fo(t){return t.c||(t.c=t.b())}function qo(){}function Ho(t){if(t.f||"undefined"!=typeof XMLHttpRequest||"undefined"==typeof ActiveXObject)return t.f;for(var e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],n=0;n=function t(e){return e.c||(e.a?t(e.a):(D("Root logger has no level set."),null))}(this).value)for(v(e)&&(e=e()),t=new Wo(t,String(e),this.f),n&&(t.a=n),n=this;n;)n=n.a};var Qo,ta={},ea=null;function na(t){var e,n,i;return ea||(ea=new Xo(""),(ta[""]=ea).c=$o),(e=ta[t])||(e=new Xo(t),i=t.lastIndexOf("."),n=t.substr(i+1),(i=na(t.substr(0,i))).b||(i.b={}),(i.b[n]=e).a=i,ta[t]=e),e}function ia(t,e){t&&t.log(Zo,e,void 0)}function ra(t){this.f=t}function oa(t){fn.call(this),this.u=t,this.h=void 0,this.readyState=aa,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.l=new Headers,this.b=null,this.s="GET",this.f="",this.a=!1,this.i=na("goog.net.FetchXmlHttp"),this.m=this.c=this.g=null}w(ra,Vo),ra.prototype.a=function(){return new oa(this.f)},ra.prototype.b=(Qo={},function(){return Qo}),w(oa,fn);var aa=0;function sa(t){t.c.read().then(t.pc.bind(t)).catch(t.Va.bind(t))}function ua(t){t.readyState=4,t.g=null,t.c=null,t.m=null,ca(t)}function ca(t){t.onreadystatechange&&t.onreadystatechange.call(t)}function ha(t){fn.call(this),this.headers=new wn,this.D=t||null,this.c=!1,this.C=this.a=null,this.h=this.P=this.l="",this.f=this.N=this.i=this.J=!1,this.g=0,this.s=null,this.m=la,this.u=this.S=!1}(t=oa.prototype).open=function(t,e){if(this.readyState!=aa)throw this.abort(),Error("Error reopening a connection");this.s=t,this.f=e,this.readyState=1,ca(this)},t.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.a=!0;var e={headers:this.l,method:this.s,credentials:this.h,cache:void 0};t&&(e.body=t),this.u.fetch(new Request(this.f,e)).then(this.uc.bind(this),this.Va.bind(this))},t.abort=function(){this.response=this.responseText="",this.l=new Headers,this.status=0,this.c&&this.c.cancel("Request was aborted."),1<=this.readyState&&this.a&&4!=this.readyState&&(this.a=!1,ua(this)),this.readyState=aa},t.uc=function(t){this.a&&(this.g=t,this.b||(this.status=this.g.status,this.statusText=this.g.statusText,this.b=t.headers,this.readyState=2,ca(this)),this.a&&(this.readyState=3,ca(this),this.a&&("arraybuffer"===this.responseType?t.arrayBuffer().then(this.sc.bind(this),this.Va.bind(this)):void 0!==l.ReadableStream&&"body"in t?(this.response=this.responseText="",this.c=t.body.getReader(),this.m=new TextDecoder,sa(this)):t.text().then(this.tc.bind(this),this.Va.bind(this)))))},t.pc=function(t){var e;this.a&&((e=this.m.decode(t.value||new Uint8Array(0),{stream:!t.done}))&&(this.response=this.responseText+=e),(t.done?ua:ca)(this),3==this.readyState&&sa(this))},t.tc=function(t){this.a&&(this.response=this.responseText=t,ua(this))},t.sc=function(t){this.a&&(this.response=t,ua(this))},t.Va=function(t){var e=this.i;e&&e.log(zo,"Failed to fetch url "+this.f,t instanceof Error?t:Error(t)),this.a&&ua(this)},t.setRequestHeader=function(t,e){this.l.append(t,e)},t.getResponseHeader=function(t){return this.b?this.b.get(t.toLowerCase())||"":((t=this.i)&&t.log(zo,"Attempting to get response header but no headers have been received for url: "+this.f,void 0),"")},t.getAllResponseHeaders=function(){if(!this.b){var t=this.i;return t&&t.log(zo,"Attempting to get all response headers but no headers have been received for url: "+this.f,void 0),""}for(var t=[],e=this.b.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(oa.prototype,"withCredentials",{get:function(){return"include"===this.h},set:function(t){this.h=t?"include":"same-origin"}}),w(ha,fn);var la="";ha.prototype.b=na("goog.net.XhrIo");var fa=/^https?$/i,da=["POST","PUT"];function pa(e,t,n,i,r){if(e.a)throw Error("[goog.net.XhrIo] Object is active with another request="+e.l+"; newUri="+t);n=n?n.toUpperCase():"GET",e.l=t,e.h="",e.P=n,e.J=!1,e.c=!0,e.a=(e.D||Lo).a(),e.C=e.D?Fo(e.D):Fo(Lo),e.a.onreadystatechange=b(e.Wb,e);try{ia(e.b,Ea(e,"Opening Xhr")),e.N=!0,e.a.open(n,String(t),!0),e.N=!1}catch(t){return ia(e.b,Ea(e,"Error opening Xhr: "+t.message)),void ma(e,t)}t=i||"";var o,a=new wn(e.headers);r&&function(t,e){if(t.forEach&&"function"==typeof t.forEach)t.forEach(e,void 0);else if(p(t)||"string"==typeof t)V(t,e,void 0);else for(var n=yn(t),i=bn(t),r=i.length,o=0;o>>7|r<<25)^(r>>>18|r<<14)^r>>>3)|0,a=(0|n[e-7])+((i>>>17|i<<15)^(i>>>19|i<<13)^i>>>10)|0;n[e]=o+a|0}i=0|t.a[0],r=0|t.a[1];var s=0|t.a[2],u=0|t.a[3],c=0|t.a[4],h=0|t.a[5],l=0|t.a[6];for(o=0|t.a[7],e=0;e<64;e++){var f=((i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10))+(i&r^i&s^r&s)|0;a=(o=o+((c>>>6|c<<26)^(c>>>11|c<<21)^(c>>>25|c<<7))|0)+((a=(a=c&h^~c&l)+(0|Zu[e])|0)+(0|n[e])|0)|0,o=l,l=h,h=c,c=u+a|0,u=s,s=r,r=i,i=a+f|0}t.a[0]=t.a[0]+i|0,t.a[1]=t.a[1]+r|0,t.a[2]=t.a[2]+s|0,t.a[3]=t.a[3]+u|0,t.a[4]=t.a[4]+c|0,t.a[5]=t.a[5]+h|0,t.a[6]=t.a[6]+l|0,t.a[7]=t.a[7]+o|0}function uc(t,e,n){void 0===n&&(n=e.length);var i=0,r=t.c;if("string"==typeof e)for(;i>r&255;return q(t,function(t){return 1<(t=t.toString(16)).length?t:"0"+t}).join("")}function vc(t,e){for(var n=0;nt.f&&(t.a=t.f),e)}function oh(t){this.f=t,this.b=this.a=null,this.c=Date.now()}function ah(t,e){void 0===e&&(e=t.b?(e=t.b).a-e.g:0),t.c=Date.now()+1e3*e}function sh(t,e){t.b=Lr(e[Ka]||""),t.a=e.refreshToken,ah(t,void 0!==(e=e.expiresIn)?Number(e):void 0)}function uh(e,t){return i=e.f,r=t,new fe(function(e,n){"refresh_token"==r.grant_type&&r.refresh_token||"authorization_code"==r.grant_type&&r.code?Za(i,i.l+"?key="+encodeURIComponent(i.c),function(t){t?t.error?n(zs(t)):t.access_token&&t.refresh_token?e(t):n(new T("internal-error")):n(new T("network-request-failed"))},"POST",Hn(r).toString(),i.g,i.m.get()):n(new T("internal-error"))}).then(function(t){return e.b=Lr(t.access_token),e.a=t.refresh_token,ah(e,t.expires_in),{accessToken:e.b.toString(),refreshToken:e.a}}).o(function(t){throw"auth/user-token-expired"==t.code&&(e.a=null),t});var i,r}function ch(t,e){this.a=t||null,this.b=e||null,qi(this,{lastSignInTime:Li(e||null),creationTime:Li(t||null)})}function hh(t,e,n,i,r,o){qi(this,{uid:t,displayName:i||null,photoURL:r||null,email:n||null,phoneNumber:o||null,providerId:e})}function lh(t,e,n){this.N=[],this.l=t.apiKey,this.m=t.appName,this.s=t.authDomain||null;var i,r=Zl.default.SDK_VERSION?gi(Zl.default.SDK_VERSION):null;this.a=new qa(this.l,_(A),r),(this.u=t.emulatorConfig||null)&&Ya(this.a,this.u),this.h=new oh(this.a),wh(this,e[Ka]),sh(this.h,e),Fi(this,"refreshToken",this.h.a),Eh(this,n||{}),fn.call(this),this.P=!1,this.s&&Ii()&&(this.b=xc(this.s,this.l,this.m,this.u)),this.W=[],this.i=null,this.D=(i=this,new ih(function(){return i.I(!0)},function(t){return!(!t||"auth/network-request-failed"!=t.code)},function(){var t=i.h.c-Date.now()-3e5;return 0this.c-3e4?this.a?uh(this,{grant_type:"refresh_token",refresh_token:this.a}):ye(null):ye({accessToken:this.b.toString(),refreshToken:this.a})},ch.prototype.w=function(){return{lastLoginAt:this.b,createdAt:this.a}},w(lh,fn),lh.prototype.xa=function(t){this.za=t,Ja(this.a,t)},lh.prototype.la=function(){return this.za},lh.prototype.Ga=function(){return X(this.aa)},lh.prototype.ib=function(){this.D.b&&(this.D.stop(),this.D.start())},Fi(lh.prototype,"providerId","firebase"),(t=lh.prototype).reload=function(){var t=this;return Vh(this,kh(this).then(function(){return Rh(t).then(function(){return Ih(t)}).then(Ah)}))},t.oc=function(t){return this.I(t).then(function(t){return new Bc(t)})},t.I=function(t){var e=this;return Vh(this,kh(this).then(function(){return e.h.getToken(t)}).then(function(t){if(!t)throw new T("internal-error");return t.accessToken!=e.Aa&&(wh(e,t.accessToken),e.dispatchEvent(new th("tokenChanged"))),Oh(e,"refreshToken",t.refreshToken),t.accessToken}))},t.Kc=function(t){if(!(t=t.users)||!t.length)throw new T("internal-error");Eh(this,{uid:(t=t[0]).localId,displayName:t.displayName,photoURL:t.photoUrl,email:t.email,emailVerified:!!t.emailVerified,phoneNumber:t.phoneNumber,lastLoginAt:t.lastLoginAt,createdAt:t.createdAt,tenantId:t.tenantId});for(var e,n=(e=(e=t).providerUserInfo)&&e.length?q(e,function(t){return new hh(t.rawId,t.providerId,t.email,t.displayName,t.photoUrl,t.phoneNumber)}):[],i=0;i=xl.length)throw new T("internal-error","Argument validator received an unsupported number of arguments.");n=xl[r],i=(i?"":n+" argument ")+(e.name?'"'+e.name+'" ':"")+"must be "+e.K+".";break t}i=null}}if(i)throw new T("argument-error",t+" failed: "+i)}(t=kl.prototype).Ia=function(){var e=this;return this.f||(this.f=Rl(this,ye().then(function(){if(Ti()&&!hi())return si();throw new T("operation-not-supported-in-this-environment","RecaptchaVerifier is only supported in a browser HTTP/HTTPS environment.")}).then(function(){return e.m.g(e.u())}).then(function(t){return e.g=t,Js(e.s,Rs,{})}).then(function(t){e.a[_l]=t.recaptchaSiteKey}).o(function(t){throw e.f=null,t})))},t.render=function(){Dl(this);var n=this;return Rl(this,this.Ia().then(function(){var t,e;return null===n.c&&(e=n.v,n.i||(t=te(e),e=oe("DIV"),t.appendChild(e)),n.c=n.g.render(e,n.a)),n.c}))},t.verify=function(){Dl(this);var r=this;return Rl(this,this.render().then(function(e){return new fe(function(n){var i,t=r.g.getResponse(e);t?n(t):(r.l.push(i=function(t){var e;t&&(e=i,B(r.l,function(t){return t==e}),n(t))}),r.i&&r.g.execute(r.c))})}))},t.reset=function(){Dl(this),null!==this.c&&this.g.reset(this.c)},t.clear=function(){Dl(this),this.J=!0,this.m.c();for(var t,e=0;es[0]&&e[1]>6|192:(55296==(64512&i)&&r+1>18|240,e[n++]=i>>12&63|128):e[n++]=i>>12|224,e[n++]=i>>6&63|128),e[n++]=63&i|128)}return e}function u(t){return function(t){t=i(t);return o.encodeByteArray(t,!0)}(t).replace(/\./g,"")}var o={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray:function(t,e){if(!Array.isArray(t))throw Error("encodeByteArray takes an array as a parameter");this.init_();for(var n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[],i=0;i>6,c=63&c;u||(c=64,s||(h=64)),r.push(n[o>>2],n[(3&o)<<4|a>>4],n[h],n[c])}return r.join("")},encodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?btoa(t):this.encodeByteArray(i(t),e)},decodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?atob(t):function(t){for(var e=[],n=0,r=0;n>10)),e[r++]=String.fromCharCode(56320+(1023&i))):(o=t[n++],s=t[n++],e[r++]=String.fromCharCode((15&a)<<12|(63&o)<<6|63&s))}return e.join("")}(this.decodeStringToByteArray(t,e))},decodeStringToByteArray:function(t,e){this.init_();for(var n=e?this.charToByteMapWebSafe_:this.charToByteMap_,r=[],i=0;i>4),64!==a&&(r.push(s<<4&240|a>>2),64!==u&&r.push(a<<6&192|u))}return r},init_:function(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(var t=0;t=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(t)]=t,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(t)]=t)}}};function h(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function c(){return!function(){try{return"[object process]"===Object.prototype.toString.call(global.process)}catch(t){return}}()&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}var l,f="FirebaseError",d=(n(p,l=Error),p);function p(t,e,n){e=l.call(this,e)||this;return e.code=t,e.customData=n,e.name=f,Object.setPrototypeOf(e,p.prototype),Error.captureStackTrace&&Error.captureStackTrace(e,m.prototype.create),e}var m=(v.prototype.create=function(t){for(var e=[],n=1;n"})):"Error",t=this.serviceName+": "+t+" ("+o+").";return new d(o,t,i)},v);function v(t,e,n){this.service=t,this.serviceName=e,this.errors=n}var w,b=/\{\$([^}]+)}/g;function E(t){return t&&t._delegate?t._delegate:t}(k=w=w||{})[k.DEBUG=0]="DEBUG",k[k.VERBOSE=1]="VERBOSE",k[k.INFO=2]="INFO",k[k.WARN=3]="WARN",k[k.ERROR=4]="ERROR",k[k.SILENT=5]="SILENT";function T(t,e){for(var n=[],r=2;r=t.length?void 0:t)&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}var k,R="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},x={},O=R||self;function L(){}function P(t){var e=typeof t;return"array"==(e="object"!=e?e:t?Array.isArray(t)?"array":e:"null")||"object"==e&&"number"==typeof t.length}function M(t){var e=typeof t;return"object"==e&&null!=t||"function"==e}var F="closure_uid_"+(1e9*Math.random()>>>0),V=0;function U(t,e,n){return t.call.apply(t.bind,arguments)}function q(e,n,t){if(!e)throw Error();if(2parseFloat(yt)){at=String(gt);break t}}at=yt}var mt={};function vt(){return t=function(){for(var t=0,e=J(String(at)).split("."),n=J("9").split("."),r=Math.max(e.length,n.length),i=0;0==t&&i>>0);function qt(e){return"function"==typeof e?e:(e[Ut]||(e[Ut]=function(t){return e.handleEvent(t)}),e[Ut])}function Bt(){G.call(this),this.i=new Nt(this),(this.P=this).I=null}function jt(t,e){var n,r=t.I;if(r)for(n=[];r;r=r.I)n.push(r);if(t=t.P,r=e.type||e,"string"==typeof e?e=new Et(e,t):e instanceof Et?e.target=e.target||t:(s=e,ot(e=new Et(r,t),s)),s=!0,n)for(var i=n.length-1;0<=i;i--)var o=e.g=n[i],s=Kt(o,r,!0,e)&&s;if(s=Kt(o=e.g=t,r,!0,e)&&s,s=Kt(o,r,!1,e)&&s,n)for(i=0;io.length?Pe:(o=o.substr(a,s),i.C=a+s,o)))==Pe){4==e&&(t.o=4,be(14),u=!1),de(t.j,t.m,null,"[Incomplete Response]");break}if(r==Le){t.o=4,be(15),de(t.j,t.m,n,"[Invalid Chunk]"),u=!1;break}de(t.j,t.m,r,null),Qe(t,r)}Ve(t)&&r!=Pe&&r!=Le&&(t.h.g="",t.C=0),4!=e||0!=n.length||t.h.h||(t.o=1,be(16),u=!1),t.i=t.i&&u,u?0>4&15).toString(16)+(15&t).toString(16)}$e.prototype.toString=function(){var t=[],e=this.j;e&&t.push(an(e,cn,!0),":");var n=this.i;return!n&&"file"!=e||(t.push("//"),(e=this.s)&&t.push(an(e,cn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.m)&&t.push(":",String(n))),(n=this.l)&&(this.i&&"/"!=n.charAt(0)&&t.push("/"),t.push(an(n,"/"==n.charAt(0)?ln:hn,!0))),(n=this.h.toString())&&t.push("?",n),(n=this.o)&&t.push("#",an(n,dn)),t.join("")};var cn=/[#\/\?@]/g,hn=/[#\?:]/g,ln=/[#\?]/g,fn=/[#\?@]/g,dn=/#/g;function pn(t,e){this.h=this.g=null,this.i=t||null,this.j=!!e}function yn(n){n.g||(n.g=new ze,n.h=0,n.i&&function(t,e){if(t){t=t.split("&");for(var n=0;n2*t.i&&We(t)))}function mn(t,e){return yn(t),e=wn(t,e),Ye(t.g.h,e)}function vn(t,e,n){gn(t,e),0=t.j}function Sn(t){return t.h?1:t.g?t.g.size:0}function An(t,e){return t.h?t.h==e:t.g&&t.g.has(e)}function Dn(t,e){t.g?t.g.add(e):t.h=e}function Nn(t,e){t.h&&t.h==e?t.h=null:t.g&&t.g.has(e)&&t.g.delete(e)}function Cn(t){var e,n;if(null!=t.h)return t.i.concat(t.h.D);if(null==t.g||0===t.g.size)return Y(t.i);var r=t.i;try{for(var i=C(t.g.values()),o=i.next();!o.done;o=i.next())var s=o.value,r=r.concat(s.D)}catch(t){e={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return r}function kn(){}function Rn(){this.g=new kn}function xn(t,e,n,r,i){try{e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null,i(r)}catch(t){}}function On(t){this.l=t.$b||null,this.j=t.ib||!1}function Ln(t,e){Bt.call(this),this.D=t,this.u=e,this.m=void 0,this.readyState=Pn,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.v=new Headers,this.h=null,this.C="GET",this.B="",this.g=!1,this.A=this.j=this.l=null}En.prototype.cancel=function(){var e,t;if(this.i=Cn(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){try{for(var n=C(this.g.values()),r=n.next();!r.done;r=n.next())r.value.cancel()}catch(t){e={error:t}}finally{try{r&&!r.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.g.clear()}},kn.prototype.stringify=function(t){return O.JSON.stringify(t,void 0)},kn.prototype.parse=function(t){return O.JSON.parse(t,void 0)},K(On,_e),On.prototype.g=function(){return new Ln(this.l,this.j)},On.prototype.i=(Tn={},function(){return Tn}),K(Ln,Bt);var Pn=0;function Mn(t){t.j.read().then(t.Sa.bind(t)).catch(t.ha.bind(t))}function Fn(t){t.readyState=4,t.l=null,t.j=null,t.A=null,Vn(t)}function Vn(t){t.onreadystatechange&&t.onreadystatechange.call(t)}(k=Ln.prototype).open=function(t,e){if(this.readyState!=Pn)throw this.abort(),Error("Error reopening a connection");this.C=t,this.B=e,this.readyState=1,Vn(this)},k.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;var e={headers:this.v,method:this.C,credentials:this.m,cache:void 0};t&&(e.body=t),(this.D||O).fetch(new Request(this.B,e)).then(this.Va.bind(this),this.ha.bind(this))},k.abort=function(){this.response=this.responseText="",this.v=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted."),1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Fn(this)),this.readyState=Pn},k.Va=function(t){if(this.g&&(this.l=t,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=t.headers,this.readyState=2,Vn(this)),this.g&&(this.readyState=3,Vn(this),this.g)))if("arraybuffer"===this.responseType)t.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if(void 0!==O.ReadableStream&&"body"in t){if(this.j=t.body.getReader(),this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.A=new TextDecoder;Mn(this)}else t.text().then(this.Ua.bind(this),this.ha.bind(this))},k.Sa=function(t){var e;this.g&&(this.u&&t.value?this.response.push(t.value):this.u||(e=t.value||new Uint8Array(0),(e=this.A.decode(e,{stream:!t.done}))&&(this.response=this.responseText+=e)),(t.done?Fn:Vn)(this),3==this.readyState&&Mn(this))},k.Ua=function(t){this.g&&(this.response=this.responseText=t,Fn(this))},k.Ta=function(t){this.g&&(this.response=t,Fn(this))},k.ha=function(){this.g&&Fn(this)},k.setRequestHeader=function(t,e){this.v.append(t,e)},k.getResponseHeader=function(t){return this.h&&this.h.get(t.toLowerCase())||""},k.getAllResponseHeaders=function(){if(!this.h)return"";for(var t=[],e=this.h.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(Ln.prototype,"withCredentials",{get:function(){return"include"===this.m},set:function(t){this.m=t?"include":"same-origin"}});var Un=O.JSON.parse;function qn(t){Bt.call(this),this.headers=new ze,this.u=t||null,this.h=!1,this.C=this.g=null,this.H="",this.m=0,this.j="",this.l=this.F=this.v=this.D=!1,this.B=0,this.A=null,this.J=Bn,this.K=this.L=!1}K(qn,Bt);var Bn="",jn=/^https?$/i,Kn=["POST","PUT"];function Gn(t){return"content-type"==t.toLowerCase()}function Qn(t,e){t.h=!1,t.g&&(t.l=!0,t.g.abort(),t.l=!1),t.j=e,t.m=5,Hn(t),Wn(t)}function Hn(t){t.D||(t.D=!0,jt(t,"complete"),jt(t,"error"))}function zn(t){if(t.h&&void 0!==x&&(!t.C[1]||4!=Xn(t)||2!=t.ba()))if(t.v&&4==Xn(t))ie(t.Fa,0,t);else if(jt(t,"readystatechange"),4==Xn(t)){t.h=!1;try{var e,n,r,i,o=t.ba();t:switch(o){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var s=!0;break t;default:s=!1}if((e=s)||((n=0===o)&&(!(i=String(t.H).match(Xe)[1]||null)&&O.self&&O.self.location&&(i=(r=O.self.location.protocol).substr(0,r.length-1)),n=!jn.test(i?i.toLowerCase():"")),e=n),e)jt(t,"complete"),jt(t,"success");else{t.m=6;try{var a=2=r.i.j-(r.m?1:0)||(r.m?(r.l=i.D.concat(r.l),0):1==r.G||2==r.G||r.C>=(r.Xa?0:r.Ya)||(r.m=Te(B(r.Ha,r,i),yr(r,r.C)),r.C++,0))))&&(2!=s||!hr(t)))switch(o&&0e.length?1:0},vi),ci=(n(mi,ui=R),mi.prototype.construct=function(t,e,n){return new mi(t,e,n)},mi.prototype.canonicalString=function(){return this.toArray().join("/")},mi.prototype.toString=function(){return this.canonicalString()},mi.fromString=function(){for(var t=[],e=0;et.length&&zr(),void 0===n?n=t.length-e:n>t.length-e&&zr(),this.segments=t,this.offset=e,this.len=n}di.EMPTY_BYTE_STRING=new di("");var wi=new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);function bi(t){if(Wr(!!t),"string"!=typeof t)return{seconds:Ei(t.seconds),nanos:Ei(t.nanos)};var e=0,n=wi.exec(t);Wr(!!n),n[1]&&(n=((n=n[1])+"000000000").substr(0,9),e=Number(n));t=new Date(t);return{seconds:Math.floor(t.getTime()/1e3),nanos:e}}function Ei(t){return"number"==typeof t?t:"string"==typeof t?Number(t):0}function Ti(t){return"string"==typeof t?di.fromBase64String(t):di.fromUint8Array(t)}function Ii(t){return"server_timestamp"===(null===(t=((null===(t=null==t?void 0:t.mapValue)||void 0===t?void 0:t.fields)||{}).__type__)||void 0===t?void 0:t.stringValue)}function _i(t){t=bi(t.mapValue.fields.__local_write_time__.timestampValue);return new ti(t.seconds,t.nanos)}function Si(t){return null==t}function Ai(t){return 0===t&&1/t==-1/0}function Di(t){return"number"==typeof t&&Number.isInteger(t)&&!Ai(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER}var Ni=(Ci.fromPath=function(t){return new Ci(ci.fromString(t))},Ci.fromName=function(t){return new Ci(ci.fromString(t).popFirst(5))},Ci.prototype.hasCollectionId=function(t){return 2<=this.path.length&&this.path.get(this.path.length-2)===t},Ci.prototype.isEqual=function(t){return null!==t&&0===ci.comparator(this.path,t.path)},Ci.prototype.toString=function(){return this.path.toString()},Ci.comparator=function(t,e){return ci.comparator(t.path,e.path)},Ci.isDocumentKey=function(t){return t.length%2==0},Ci.fromSegments=function(t){return new Ci(new ci(t.slice()))},Ci);function Ci(t){this.path=t}function ki(t){return"nullValue"in t?0:"booleanValue"in t?1:"integerValue"in t||"doubleValue"in t?2:"timestampValue"in t?3:"stringValue"in t?5:"bytesValue"in t?6:"referenceValue"in t?7:"geoPointValue"in t?8:"arrayValue"in t?9:"mapValue"in t?Ii(t)?4:10:zr()}function Ri(r,i){var t,e,n=ki(r);if(n!==ki(i))return!1;switch(n){case 0:return!0;case 1:return r.booleanValue===i.booleanValue;case 4:return _i(r).isEqual(_i(i));case 3:return function(t){if("string"==typeof r.timestampValue&&"string"==typeof t.timestampValue&&r.timestampValue.length===t.timestampValue.length)return r.timestampValue===t.timestampValue;var e=bi(r.timestampValue),t=bi(t.timestampValue);return e.seconds===t.seconds&&e.nanos===t.nanos}(i);case 5:return r.stringValue===i.stringValue;case 6:return e=i,Ti(r.bytesValue).isEqual(Ti(e.bytesValue));case 7:return r.referenceValue===i.referenceValue;case 8:return t=i,Ei((e=r).geoPointValue.latitude)===Ei(t.geoPointValue.latitude)&&Ei(e.geoPointValue.longitude)===Ei(t.geoPointValue.longitude);case 2:return function(t,e){if("integerValue"in t&&"integerValue"in e)return Ei(t.integerValue)===Ei(e.integerValue);if("doubleValue"in t&&"doubleValue"in e){t=Ei(t.doubleValue),e=Ei(e.doubleValue);return t===e?Ai(t)===Ai(e):isNaN(t)&&isNaN(e)}return!1}(r,i);case 9:return Jr(r.arrayValue.values||[],i.arrayValue.values||[],Ri);case 10:return function(){var t,e=r.mapValue.fields||{},n=i.mapValue.fields||{};if(ii(e)!==ii(n))return!1;for(t in e)if(e.hasOwnProperty(t)&&(void 0===n[t]||!Ri(e[t],n[t])))return!1;return!0}();default:return zr()}}function xi(t,e){return void 0!==(t.values||[]).find(function(t){return Ri(t,e)})}function Oi(t,e){var n,r,i,o=ki(t),s=ki(e);if(o!==s)return $r(o,s);switch(o){case 0:return 0;case 1:return $r(t.booleanValue,e.booleanValue);case 2:return r=e,i=Ei(t.integerValue||t.doubleValue),r=Ei(r.integerValue||r.doubleValue),i":return 0=":return 0<=t;default:return zr()}},to.prototype.g=function(){return 0<=["<","<=",">",">=","!=","not-in"].indexOf(this.op)},to);function to(t,e,n){var r=this;return(r=Ji.call(this)||this).field=t,r.op=e,r.value=n,r}var eo,no,ro,io=(n(co,ro=Zi),co.prototype.matches=function(t){t=Ni.comparator(t.key,this.key);return this.m(t)},co),oo=(n(uo,no=Zi),uo.prototype.matches=function(e){return this.keys.some(function(t){return t.isEqual(e.key)})},uo),so=(n(ao,eo=Zi),ao.prototype.matches=function(e){return!this.keys.some(function(t){return t.isEqual(e.key)})},ao);function ao(t,e){var n=this;return(n=eo.call(this,t,"not-in",e)||this).keys=ho(0,e),n}function uo(t,e){var n=this;return(n=no.call(this,t,"in",e)||this).keys=ho(0,e),n}function co(t,e,n){var r=this;return(r=ro.call(this,t,e,n)||this).key=Ni.fromName(n.referenceValue),r}function ho(t,e){return((null===(e=e.arrayValue)||void 0===e?void 0:e.values)||[]).map(function(t){return Ni.fromName(t.referenceValue)})}var lo,fo,po,yo,go=(n(_o,yo=Zi),_o.prototype.matches=function(t){t=t.data.field(this.field);return Vi(t)&&xi(t.arrayValue,this.value)},_o),mo=(n(Io,po=Zi),Io.prototype.matches=function(t){t=t.data.field(this.field);return null!==t&&xi(this.value.arrayValue,t)},Io),vo=(n(To,fo=Zi),To.prototype.matches=function(t){if(xi(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;t=t.data.field(this.field);return null!==t&&!xi(this.value.arrayValue,t)},To),wo=(n(Eo,lo=Zi),Eo.prototype.matches=function(t){var e=this,t=t.data.field(this.field);return!(!Vi(t)||!t.arrayValue.values)&&t.arrayValue.values.some(function(t){return xi(e.value.arrayValue,t)})},Eo),bo=function(t,e){this.position=t,this.before=e};function Eo(t,e){return lo.call(this,t,"array-contains-any",e)||this}function To(t,e){return fo.call(this,t,"not-in",e)||this}function Io(t,e){return po.call(this,t,"in",e)||this}function _o(t,e){return yo.call(this,t,"array-contains",e)||this}function So(t){return(t.before?"b":"a")+":"+t.position.map(Pi).join(",")}var Ao=function(t,e){void 0===e&&(e="asc"),this.field=t,this.dir=e};function Do(t,e,n){for(var r=0,i=0;i":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"},ga=function(t,e){this.databaseId=t,this.I=e};function ma(t,e){return t.I?new Date(1e3*e.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")+"."+("000000000"+e.nanoseconds).slice(-9)+"Z":{seconds:""+e.seconds,nanos:e.nanoseconds}}function va(t,e){return t.I?e.toBase64():e.toUint8Array()}function wa(t){return Wr(!!t),ei.fromTimestamp((t=bi(t),new ti(t.seconds,t.nanos)))}function ba(t,e){return new ci(["projects",t.projectId,"databases",t.database]).child("documents").child(e).canonicalString()}function Ea(t){t=ci.fromString(t);return Wr(Ba(t)),t}function Ta(t,e){return ba(t.databaseId,e.path)}function Ia(t,e){e=Ea(e);if(e.get(1)!==t.databaseId.projectId)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+e.get(1)+" vs "+t.databaseId.projectId);if(e.get(3)!==t.databaseId.database)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+e.get(3)+" vs "+t.databaseId.database);return new Ni(Da(e))}function _a(t,e){return ba(t.databaseId,e)}function Sa(t){t=Ea(t);return 4===t.length?ci.emptyPath():Da(t)}function Aa(t){return new ci(["projects",t.databaseId.projectId,"databases",t.databaseId.database]).canonicalString()}function Da(t){return Wr(4";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";case"OPERATOR_UNSPECIFIED":default:return zr()}}(),t.fieldFilter.value)}function qa(t){switch(t.unaryFilter.op){case"IS_NAN":var e=Va(t.unaryFilter.field);return Zi.create(e,"==",{doubleValue:NaN});case"IS_NULL":e=Va(t.unaryFilter.field);return Zi.create(e,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":var n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{doubleValue:NaN});case"IS_NOT_NULL":n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{nullValue:"NULL_VALUE"});case"OPERATOR_UNSPECIFIED":default:return zr()}}function Ba(t){return 4<=t.length&&"projects"===t.get(0)&&"databases"===t.get(2)}function ja(t){for(var e="",n=0;n",t),this.store.put(t));return Au(t)},Su.prototype.add=function(t){return Kr("SimpleDb","ADD",this.store.name,t,t),Au(this.store.add(t))},Su.prototype.get=function(e){var n=this;return Au(this.store.get(e)).next(function(t){return Kr("SimpleDb","GET",n.store.name,e,t=void 0===t?null:t),t})},Su.prototype.delete=function(t){return Kr("SimpleDb","DELETE",this.store.name,t),Au(this.store.delete(t))},Su.prototype.count=function(){return Kr("SimpleDb","COUNT",this.store.name),Au(this.store.count())},Su.prototype.Nt=function(t,e){var e=this.cursor(this.options(t,e)),n=[];return this.xt(e,function(t,e){n.push(e)}).next(function(){return n})},Su.prototype.kt=function(t,e){Kr("SimpleDb","DELETE ALL",this.store.name);e=this.options(t,e);e.Ft=!1;e=this.cursor(e);return this.xt(e,function(t,e,n){return n.delete()})},Su.prototype.$t=function(t,e){e?n=t:(n={},e=t);var n=this.cursor(n);return this.xt(n,e)},Su.prototype.Ot=function(r){var t=this.cursor({});return new fu(function(n,e){t.onerror=function(t){t=Nu(t.target.error);e(t)},t.onsuccess=function(t){var e=t.target.result;e?r(e.primaryKey,e.value).next(function(t){t?e.continue():n()}):n()}})},Su.prototype.xt=function(t,i){var o=[];return new fu(function(r,e){t.onerror=function(t){e(t.target.error)},t.onsuccess=function(t){var e,n=t.target.result;n?(e=new yu(n),(t=i(n.primaryKey,n.value,e))instanceof fu&&(t=t.catch(function(t){return e.done(),fu.reject(t)}),o.push(t)),e.isDone?r():null===e.Dt?n.continue():n.continue(e.Dt)):r()}}).next(function(){return fu.waitFor(o)})},Su.prototype.options=function(t,e){var n;return void 0!==t&&("string"==typeof t?n=t:e=t),{index:n,range:e}},Su.prototype.cursor=function(t){var e="next";if(t.reverse&&(e="prev"),t.index){var n=this.store.index(t.index);return t.Ft?n.openKeyCursor(t.range,e):n.openCursor(t.range,e)}return this.store.openCursor(t.range,e)},Su);function Su(t){this.store=t}function Au(t){return new fu(function(e,n){t.onsuccess=function(t){t=t.target.result;e(t)},t.onerror=function(t){t=Nu(t.target.error);n(t)}})}var Du=!1;function Nu(t){var e=pu._t(h());if(12.2<=e&&e<13){e="An internal error was encountered in the Indexed Database server";if(0<=t.message.indexOf(e)){var n=new Ur("internal","IOS_INDEXEDDB_BUG1: IndexedDb has thrown '"+e+"'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.");return Du||(Du=!0,setTimeout(function(){throw n},0)),n}}return t}var Cu,ku=(n(Ru,Cu=R),Ru);function Ru(t,e){var n=this;return(n=Cu.call(this)||this).Mt=t,n.currentSequenceNumber=e,n}function xu(t,e){return pu.It(t.Mt,e)}var Ou=(Uu.prototype.applyToRemoteDocument=function(t,e){for(var n,r,i,o,s,a,u=e.mutationResults,c=0;c=i),o=Hu(r.R,e)),n.done()}).next(function(){return o})},dc.prototype.getHighestUnacknowledgedBatchId=function(t){var e=IDBKeyRange.upperBound([this.userId,Number.POSITIVE_INFINITY]),r=-1;return yc(t).$t({index:Wa.userMutationsIndex,range:e,reverse:!0},function(t,e,n){r=e.batchId,n.done()}).next(function(){return r})},dc.prototype.getAllMutationBatches=function(t){var e=this,n=IDBKeyRange.bound([this.userId,-1],[this.userId,Number.POSITIVE_INFINITY]);return yc(t).Nt(Wa.userMutationsIndex,n).next(function(t){return t.map(function(t){return Hu(e.R,t)})})},dc.prototype.getAllMutationBatchesAffectingDocumentKey=function(o,s){var a=this,t=Ya.prefixForPath(this.userId,s.path),t=IDBKeyRange.lowerBound(t),u=[];return gc(o).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);if(r===a.userId&&s.path.isEqual(i))return yc(o).get(t).next(function(t){if(!t)throw zr();Wr(t.userId===a.userId),u.push(Hu(a.R,t))});n.done()}).next(function(){return u})},dc.prototype.getAllMutationBatchesAffectingDocumentKeys=function(e,t){var s=this,a=new Qs($r),n=[];return t.forEach(function(o){var t=Ya.prefixForPath(s.userId,o.path),t=IDBKeyRange.lowerBound(t),t=gc(e).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===s.userId&&o.path.isEqual(i)?a=a.add(t):n.done()});n.push(t)}),fu.waitFor(n).next(function(){return s.Wt(e,a)})},dc.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var o=this,s=e.path,a=s.length+1,e=Ya.prefixForPath(this.userId,s),e=IDBKeyRange.lowerBound(e),u=new Qs($r);return gc(t).$t({range:e},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===o.userId&&s.isPrefixOf(i)?i.length===a&&(u=u.add(t)):n.done()}).next(function(){return o.Wt(t,u)})},dc.prototype.Wt=function(e,t){var n=this,r=[],i=[];return t.forEach(function(t){i.push(yc(e).get(t).next(function(t){if(null===t)throw zr();Wr(t.userId===n.userId),r.push(Hu(n.R,t))}))}),fu.waitFor(i).next(function(){return r})},dc.prototype.removeMutationBatch=function(e,n){var r=this;return hc(e.Mt,this.userId,n).next(function(t){return e.addOnCommittedListener(function(){r.Gt(n.batchId)}),fu.forEach(t,function(t){return r.referenceDelegate.markPotentiallyOrphaned(e,t)})})},dc.prototype.Gt=function(t){delete this.Kt[t]},dc.prototype.performConsistencyCheck=function(e){var i=this;return this.checkEmpty(e).next(function(t){if(!t)return fu.resolve();var t=IDBKeyRange.lowerBound(Ya.prefixForUser(i.userId)),r=[];return gc(e).$t({range:t},function(t,e,n){t[0]===i.userId?(t=Ga(t[1]),r.push(t)):n.done()}).next(function(){Wr(0===r.length)})})},dc.prototype.containsKey=function(t,e){return pc(t,this.userId,e)},dc.prototype.zt=function(t){var e=this;return mc(t).get(this.userId).next(function(t){return t||new za(e.userId,-1,"")})},dc);function dc(t,e,n,r){this.userId=t,this.R=e,this.Ut=n,this.referenceDelegate=r,this.Kt={}}function pc(t,o,e){var e=Ya.prefixForPath(o,e.path),s=e[1],e=IDBKeyRange.lowerBound(e),a=!1;return gc(t).$t({range:e,Ft:!0},function(t,e,n){var r=t[0],i=t[1];t[2],r===o&&i===s&&(a=!0),n.done()}).next(function(){return a})}function yc(t){return xu(t,Wa.store)}function gc(t){return xu(t,Ya.store)}function mc(t){return xu(t,za.store)}var vc=(Ec.prototype.next=function(){return this.Ht+=2,this.Ht},Ec.Jt=function(){return new Ec(0)},Ec.Yt=function(){return new Ec(-1)},Ec),wc=(bc.prototype.allocateTargetId=function(n){var r=this;return this.Xt(n).next(function(t){var e=new vc(t.highestTargetId);return t.highestTargetId=e.next(),r.Zt(n,t).next(function(){return t.highestTargetId})})},bc.prototype.getLastRemoteSnapshotVersion=function(t){return this.Xt(t).next(function(t){return ei.fromTimestamp(new ti(t.lastRemoteSnapshotVersion.seconds,t.lastRemoteSnapshotVersion.nanoseconds))})},bc.prototype.getHighestSequenceNumber=function(t){return this.Xt(t).next(function(t){return t.highestListenSequenceNumber})},bc.prototype.setTargetsMetadata=function(e,n,r){var i=this;return this.Xt(e).next(function(t){return t.highestListenSequenceNumber=n,r&&(t.lastRemoteSnapshotVersion=r.toTimestamp()),n>t.highestListenSequenceNumber&&(t.highestListenSequenceNumber=n),i.Zt(e,t)})},bc.prototype.addTargetData=function(e,n){var r=this;return this.te(e,n).next(function(){return r.Xt(e).next(function(t){return t.targetCount+=1,r.ee(n,t),r.Zt(e,t)})})},bc.prototype.updateTargetData=function(t,e){return this.te(t,e)},bc.prototype.removeTargetData=function(e,t){var n=this;return this.removeMatchingKeysForTargetId(e,t.targetId).next(function(){return Tc(e).delete(t.targetId)}).next(function(){return n.Xt(e)}).next(function(t){return Wr(0e.highestTargetId&&(e.highestTargetId=t.targetId,n=!0),t.sequenceNumber>e.highestListenSequenceNumber&&(e.highestListenSequenceNumber=t.sequenceNumber,n=!0),n},bc.prototype.getTargetCount=function(t){return this.Xt(t).next(function(t){return t.targetCount})},bc.prototype.getTargetData=function(t,r){var e=Yi(r),e=IDBKeyRange.bound([e,Number.NEGATIVE_INFINITY],[e,Number.POSITIVE_INFINITY]),i=null;return Tc(t).$t({range:e,index:eu.queryTargetsIndexName},function(t,e,n){e=zu(e);Xi(r,e.target)&&(i=e,n.done())}).next(function(){return i})},bc.prototype.addMatchingKeys=function(n,t,r){var i=this,o=[],s=_c(n);return t.forEach(function(t){var e=ja(t.path);o.push(s.put(new nu(r,e))),o.push(i.referenceDelegate.addReference(n,r,t))}),fu.waitFor(o)},bc.prototype.removeMatchingKeys=function(n,t,r){var i=this,o=_c(n);return fu.forEach(t,function(t){var e=ja(t.path);return fu.waitFor([o.delete([r,e]),i.referenceDelegate.removeReference(n,r,t)])})},bc.prototype.removeMatchingKeysForTargetId=function(t,e){t=_c(t),e=IDBKeyRange.bound([e],[e+1],!1,!0);return t.delete(e)},bc.prototype.getMatchingKeysForTargetId=function(t,e){var e=IDBKeyRange.bound([e],[e+1],!1,!0),t=_c(t),r=Zs();return t.$t({range:e,Ft:!0},function(t,e,n){t=Ga(t[1]),t=new Ni(t);r=r.add(t)}).next(function(){return r})},bc.prototype.containsKey=function(t,e){var e=ja(e.path),e=IDBKeyRange.bound([e],[Zr(e)],!1,!0),i=0;return _c(t).$t({index:nu.documentTargetsIndex,Ft:!0,range:e},function(t,e,n){var r=t[0];t[1],0!==r&&(i++,n.done())}).next(function(){return 0h.params.maximumSequenceNumbersToCollect?(Kr("LruGarbageCollector","Capping sequence numbers to collect down to the maximum of "+h.params.maximumSequenceNumbersToCollect+" from "+t),h.params.maximumSequenceNumbersToCollect):t,s=Date.now(),h.nthSequenceNumber(e,i)}).next(function(t){return r=t,a=Date.now(),h.removeTargets(e,r,n)}).next(function(t){return o=t,u=Date.now(),h.removeOrphanedDocuments(e,r)}).next(function(t){return c=Date.now(),jr()<=w.DEBUG&&Kr("LruGarbageCollector","LRU Garbage Collection\n\tCounted targets in "+(s-l)+"ms\n\tDetermined least recently used "+i+" in "+(a-s)+"ms\n\tRemoved "+o+" targets in "+(u-a)+"ms\n\tRemoved "+t+" documents in "+(c-u)+"ms\nTotal Duration: "+(c-l)+"ms"),fu.resolve({didRun:!0,sequenceNumbersCollected:i,targetsRemoved:o,documentsRemoved:t})})},xc),kc=(Rc.prototype.he=function(t){var n=this.de(t);return this.db.getTargetCache().getTargetCount(t).next(function(e){return n.next(function(t){return e+t})})},Rc.prototype.de=function(t){var e=0;return this.le(t,function(t){e++}).next(function(){return e})},Rc.prototype.forEachTarget=function(t,e){return this.db.getTargetCache().forEachTarget(t,e)},Rc.prototype.le=function(t,n){return this.we(t,function(t,e){return n(e)})},Rc.prototype.addReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeTargets=function(t,e,n){return this.db.getTargetCache().removeTargets(t,e,n)},Rc.prototype.markPotentiallyOrphaned=Pc,Rc.prototype._e=function(t,e){return r=e,i=!1,mc(n=t).Ot(function(t){return pc(n,t,r).next(function(t){return t&&(i=!0),fu.resolve(!t)})}).next(function(){return i});var n,r,i},Rc.prototype.removeOrphanedDocuments=function(n,r){var i=this,o=this.db.getRemoteDocumentCache().newChangeBuffer(),s=[],a=0;return this.we(n,function(e,t){t<=r&&(t=i._e(n,e).next(function(t){if(!t)return a++,o.getEntry(n,e).next(function(){return o.removeEntry(e),_c(n).delete([0,ja(e.path)])})}),s.push(t))}).next(function(){return fu.waitFor(s)}).next(function(){return o.apply(n)}).next(function(){return a})},Rc.prototype.removeTarget=function(t,e){e=e.withSequenceNumber(t.currentSequenceNumber);return this.db.getTargetCache().updateTargetData(t,e)},Rc.prototype.updateLimboDocument=Pc,Rc.prototype.we=function(t,r){var i,t=_c(t),o=Pr.o;return t.$t({index:nu.documentTargetsIndex},function(t,e){var n=t[0];t[1];t=e.path,e=e.sequenceNumber;0===n?(o!==Pr.o&&r(new Ni(Ga(i)),o),o=e,i=t):o=Pr.o}).next(function(){o!==Pr.o&&r(new Ni(Ga(i)),o)})},Rc.prototype.getCacheSize=function(t){return this.db.getRemoteDocumentCache().getSize(t)},Rc);function Rc(t,e){this.db=t,this.garbageCollector=new Cc(this,e)}function xc(t,e){this.ae=t,this.params=e}function Oc(t,e){this.garbageCollector=t,this.asyncQueue=e,this.oe=!1,this.ce=null}function Lc(t){this.ne=t,this.buffer=new Qs(Ac),this.se=0}function Pc(t,e){return _c(t).put((t=t.currentSequenceNumber,new nu(0,ja(e.path),t)))}var Mc,Fc=(Kc.prototype.get=function(t){var e=this.mapKeyFn(t),e=this.inner[e];if(void 0!==e)for(var n=0,r=e;n "+n),1))},Jc.prototype.We=function(){var t=this;null!==this.document&&"function"==typeof this.document.addEventListener&&(this.Fe=function(){t.Se.enqueueAndForget(function(){return t.inForeground="visible"===t.document.visibilityState,t.je()})},this.document.addEventListener("visibilitychange",this.Fe),this.inForeground="visible"===this.document.visibilityState)},Jc.prototype.an=function(){this.Fe&&(this.document.removeEventListener("visibilitychange",this.Fe),this.Fe=null)},Jc.prototype.Ge=function(){var t,e=this;"function"==typeof(null===(t=this.window)||void 0===t?void 0:t.addEventListener)&&(this.ke=function(){e.un(),c()&&navigator.appVersion.match("Version/14")&&e.Se.enterRestrictedMode(!0),e.Se.enqueueAndForget(function(){return e.shutdown()})},this.window.addEventListener("pagehide",this.ke))},Jc.prototype.hn=function(){this.ke&&(this.window.removeEventListener("pagehide",this.ke),this.ke=null)},Jc.prototype.cn=function(t){var e;try{var n=null!==(null===(e=this.Qe)||void 0===e?void 0:e.getItem(this.on(t)));return Kr("IndexedDbPersistence","Client '"+t+"' "+(n?"is":"is not")+" zombied in LocalStorage"),n}catch(t){return Gr("IndexedDbPersistence","Failed to get zombied client id.",t),!1}},Jc.prototype.un=function(){if(this.Qe)try{this.Qe.setItem(this.on(this.clientId),String(Date.now()))}catch(t){Gr("Failed to set zombie client id.",t)}},Jc.prototype.ln=function(){if(this.Qe)try{this.Qe.removeItem(this.on(this.clientId))}catch(t){}},Jc.prototype.on=function(t){return"firestore_zombie_"+this.persistenceKey+"_"+t},Jc);function Jc(t,e,n,r,i,o,s,a,u,c){if(this.allowTabSynchronization=t,this.persistenceKey=e,this.clientId=n,this.Se=i,this.window=o,this.document=s,this.De=u,this.Ce=c,this.Ne=null,this.xe=!1,this.isPrimary=!1,this.networkEnabled=!0,this.ke=null,this.inForeground=!1,this.Fe=null,this.$e=null,this.Oe=Number.NEGATIVE_INFINITY,this.Me=function(t){return Promise.resolve()},!Jc.yt())throw new Ur(Vr.UNIMPLEMENTED,"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.");this.referenceDelegate=new kc(this,r),this.Le=e+"main",this.R=new Mu(a),this.Be=new pu(this.Le,11,new zc(this.R)),this.qe=new wc(this.referenceDelegate,this.R),this.Ut=new nc,this.Ue=(e=this.R,a=this.Ut,new Vc(e,a)),this.Ke=new Xu,this.window&&this.window.localStorage?this.Qe=this.window.localStorage:(this.Qe=null,!1===c&&Gr("IndexedDbPersistence","LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page."))}function Zc(t){return xu(t,Qa.store)}function th(t){return xu(t,ou.store)}function eh(t,e){var n=t.projectId;return t.isDefaultDatabase||(n+="."+t.database),"firestore/"+e+"/"+n+"/"}function nh(t,e){this.progress=t,this.wn=e}var rh=(hh.prototype.mn=function(e,n){var r=this;return this._n.getAllMutationBatchesAffectingDocumentKey(e,n).next(function(t){return r.yn(e,n,t)})},hh.prototype.yn=function(t,e,r){return this.Ue.getEntry(t,e).next(function(t){for(var e=0,n=r;ee?this._n[e]:null)},Kh.prototype.getHighestUnacknowledgedBatchId=function(){return fu.resolve(0===this._n.length?-1:this.ss-1)},Kh.prototype.getAllMutationBatches=function(t){return fu.resolve(this._n.slice())},Kh.prototype.getAllMutationBatchesAffectingDocumentKey=function(t,e){var n=this,r=new Dh(e,0),e=new Dh(e,Number.POSITIVE_INFINITY),i=[];return this.rs.forEachInRange([r,e],function(t){t=n.os(t.ns);i.push(t)}),fu.resolve(i)},Kh.prototype.getAllMutationBatchesAffectingDocumentKeys=function(t,e){var n=this,r=new Qs($r);return e.forEach(function(t){var e=new Dh(t,0),t=new Dh(t,Number.POSITIVE_INFINITY);n.rs.forEachInRange([e,t],function(t){r=r.add(t.ns)})}),fu.resolve(this.us(r))},Kh.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var n=e.path,r=n.length+1,e=n;Ni.isDocumentKey(e)||(e=e.child(""));var e=new Dh(new Ni(e),0),i=new Qs($r);return this.rs.forEachWhile(function(t){var e=t.key.path;return!!n.isPrefixOf(e)&&(e.length===r&&(i=i.add(t.ns)),!0)},e),fu.resolve(this.us(i))},Kh.prototype.us=function(t){var e=this,n=[];return t.forEach(function(t){t=e.os(t);null!==t&&n.push(t)}),n},Kh.prototype.removeMutationBatch=function(n,r){var i=this;Wr(0===this.hs(r.batchId,"removed")),this._n.shift();var o=this.rs;return fu.forEach(r.mutations,function(t){var e=new Dh(t.key,r.batchId);return o=o.delete(e),i.referenceDelegate.markPotentiallyOrphaned(n,t.key)}).next(function(){i.rs=o})},Kh.prototype.Gt=function(t){},Kh.prototype.containsKey=function(t,e){var n=new Dh(e,0),n=this.rs.firstAfterOrEqual(n);return fu.resolve(e.isEqual(n&&n.key))},Kh.prototype.performConsistencyCheck=function(t){return this._n.length,fu.resolve()},Kh.prototype.hs=function(t,e){return this.cs(t)},Kh.prototype.cs=function(t){return 0===this._n.length?0:t-this._n[0].batchId},Kh.prototype.os=function(t){t=this.cs(t);return t<0||t>=this._n.length?null:this._n[t]},Kh),Ch=(jh.prototype.addEntry=function(t,e,n){var r=e.key,i=this.docs.get(r),o=i?i.size:0,i=this.ls(e);return this.docs=this.docs.insert(r,{document:e.clone(),size:i,readTime:n}),this.size+=i-o,this.Ut.addToCollectionParentIndex(t,r.path.popLast())},jh.prototype.removeEntry=function(t){var e=this.docs.get(t);e&&(this.docs=this.docs.remove(t),this.size-=e.size)},jh.prototype.getEntry=function(t,e){var n=this.docs.get(e);return fu.resolve(n?n.document.clone():Qi.newInvalidDocument(e))},jh.prototype.getEntries=function(t,e){var n=this,r=zs;return e.forEach(function(t){var e=n.docs.get(t);r=r.insert(t,e?e.document.clone():Qi.newInvalidDocument(t))}),fu.resolve(r)},jh.prototype.getDocumentsMatchingQuery=function(t,e,n){for(var r=zs,i=new Ni(e.path.child("")),o=this.docs.getIteratorFrom(i);o.hasNext();){var s=o.getNext(),a=s.key,u=s.value,s=u.document,u=u.readTime;if(!e.path.isPrefixOf(a.path))break;u.compareTo(n)<=0||Ko(e,s)&&(r=r.insert(s.key,s.clone()))}return fu.resolve(r)},jh.prototype.fs=function(t,e){return fu.forEach(this.docs,function(t){return e(t)})},jh.prototype.newChangeBuffer=function(t){return new kh(this)},jh.prototype.getSize=function(t){return fu.resolve(this.size)},jh),kh=(n(Bh,_h=A),Bh.prototype.applyChanges=function(n){var r=this,i=[];return this.changes.forEach(function(t,e){e.document.isValidDocument()?i.push(r.Ie.addEntry(n,e.document,r.getReadTime(t))):r.Ie.removeEntry(t)}),fu.waitFor(i)},Bh.prototype.getFromCache=function(t,e){return this.Ie.getEntry(t,e)},Bh.prototype.getAllFromCache=function(t,e){return this.Ie.getEntries(t,e)},Bh),Rh=(qh.prototype.forEachTarget=function(t,n){return this.ds.forEach(function(t,e){return n(e)}),fu.resolve()},qh.prototype.getLastRemoteSnapshotVersion=function(t){return fu.resolve(this.lastRemoteSnapshotVersion)},qh.prototype.getHighestSequenceNumber=function(t){return fu.resolve(this.ws)},qh.prototype.allocateTargetId=function(t){return this.highestTargetId=this.ys.next(),fu.resolve(this.highestTargetId)},qh.prototype.setTargetsMetadata=function(t,e,n){return n&&(this.lastRemoteSnapshotVersion=n),e>this.ws&&(this.ws=e),fu.resolve()},qh.prototype.te=function(t){this.ds.set(t.target,t);var e=t.targetId;e>this.highestTargetId&&(this.ys=new vc(e),this.highestTargetId=e),t.sequenceNumber>this.ws&&(this.ws=t.sequenceNumber)},qh.prototype.addTargetData=function(t,e){return this.te(e),this.targetCount+=1,fu.resolve()},qh.prototype.updateTargetData=function(t,e){return this.te(e),fu.resolve()},qh.prototype.removeTargetData=function(t,e){return this.ds.delete(e.target),this._s.Zn(e.targetId),--this.targetCount,fu.resolve()},qh.prototype.removeTargets=function(n,r,i){var o=this,s=0,a=[];return this.ds.forEach(function(t,e){e.sequenceNumber<=r&&null===i.get(e.targetId)&&(o.ds.delete(t),a.push(o.removeMatchingKeysForTargetId(n,e.targetId)),s++)}),fu.waitFor(a).next(function(){return s})},qh.prototype.getTargetCount=function(t){return fu.resolve(this.targetCount)},qh.prototype.getTargetData=function(t,e){e=this.ds.get(e)||null;return fu.resolve(e)},qh.prototype.addMatchingKeys=function(t,e,n){return this._s.Jn(e,n),fu.resolve()},qh.prototype.removeMatchingKeys=function(e,t,n){this._s.Xn(t,n);var r=this.persistence.referenceDelegate,i=[];return r&&t.forEach(function(t){i.push(r.markPotentiallyOrphaned(e,t))}),fu.waitFor(i)},qh.prototype.removeMatchingKeysForTargetId=function(t,e){return this._s.Zn(e),fu.resolve()},qh.prototype.getMatchingKeysForTargetId=function(t,e){e=this._s.es(e);return fu.resolve(e)},qh.prototype.containsKey=function(t,e){return fu.resolve(this._s.containsKey(e))},qh),xh=(Uh.prototype.start=function(){return Promise.resolve()},Uh.prototype.shutdown=function(){return this.xe=!1,Promise.resolve()},Object.defineProperty(Uh.prototype,"started",{get:function(){return this.xe},enumerable:!1,configurable:!0}),Uh.prototype.setDatabaseDeletedListener=function(){},Uh.prototype.setNetworkEnabled=function(){},Uh.prototype.getIndexManager=function(){return this.Ut},Uh.prototype.getMutationQueue=function(t){var e=this.gs[t.toKey()];return e||(e=new Nh(this.Ut,this.referenceDelegate),this.gs[t.toKey()]=e),e},Uh.prototype.getTargetCache=function(){return this.qe},Uh.prototype.getRemoteDocumentCache=function(){return this.Ue},Uh.prototype.getBundleCache=function(){return this.Ke},Uh.prototype.runTransaction=function(t,e,n){var r=this;Kr("MemoryPersistence","Starting transaction:",t);var i=new Oh(this.Ne.next());return this.referenceDelegate.Es(),n(i).next(function(t){return r.referenceDelegate.Ts(i).next(function(){return t})}).toPromise().then(function(t){return i.raiseOnCommittedEvent(),t})},Uh.prototype.Is=function(e,n){return fu.or(Object.values(this.gs).map(function(t){return function(){return t.containsKey(e,n)}}))},Uh),Oh=(n(Vh,Ih=R),Vh),Lh=(Fh.bs=function(t){return new Fh(t)},Object.defineProperty(Fh.prototype,"vs",{get:function(){if(this.Rs)return this.Rs;throw zr()},enumerable:!1,configurable:!0}),Fh.prototype.addReference=function(t,e,n){return this.As.addReference(n,e),this.vs.delete(n.toString()),fu.resolve()},Fh.prototype.removeReference=function(t,e,n){return this.As.removeReference(n,e),this.vs.add(n.toString()),fu.resolve()},Fh.prototype.markPotentiallyOrphaned=function(t,e){return this.vs.add(e.toString()),fu.resolve()},Fh.prototype.removeTarget=function(t,e){var n=this;this.As.Zn(e.targetId).forEach(function(t){return n.vs.add(t.toString())});var r=this.persistence.getTargetCache();return r.getMatchingKeysForTargetId(t,e.targetId).next(function(t){t.forEach(function(t){return n.vs.add(t.toString())})}).next(function(){return r.removeTargetData(t,e)})},Fh.prototype.Es=function(){this.Rs=new Set},Fh.prototype.Ts=function(n){var r=this,i=this.persistence.getRemoteDocumentCache().newChangeBuffer();return fu.forEach(this.vs,function(t){var e=Ni.fromPath(t);return r.Ps(n,e).next(function(t){t||i.removeEntry(e)})}).next(function(){return r.Rs=null,i.apply(n)})},Fh.prototype.updateLimboDocument=function(t,e){var n=this;return this.Ps(t,e).next(function(t){t?n.vs.delete(e.toString()):n.vs.add(e.toString())})},Fh.prototype.ps=function(t){return 0},Fh.prototype.Ps=function(t,e){var n=this;return fu.or([function(){return fu.resolve(n.As.containsKey(e))},function(){return n.persistence.getTargetCache().containsKey(t,e)},function(){return n.persistence.Is(t,e)}])},Fh),Ph=(Mh.prototype.isAuthenticated=function(){return null!=this.uid},Mh.prototype.toKey=function(){return this.isAuthenticated()?"uid:"+this.uid:"anonymous-user"},Mh.prototype.isEqual=function(t){return t.uid===this.uid},Mh);function Mh(t){this.uid=t}function Fh(t){this.persistence=t,this.As=new Ah,this.Rs=null}function Vh(t){var e=this;return(e=Ih.call(this)||this).currentSequenceNumber=t,e}function Uh(t,e){var n=this;this.gs={},this.Ne=new Pr(0),this.xe=!1,this.xe=!0,this.referenceDelegate=t(this),this.qe=new Rh(this),this.Ut=new tc,this.Ue=(t=this.Ut,new Ch(t,function(t){return n.referenceDelegate.ps(t)})),this.R=new Mu(e),this.Ke=new Sh(this.R)}function qh(t){this.persistence=t,this.ds=new Fc(Yi,Xi),this.lastRemoteSnapshotVersion=ei.min(),this.highestTargetId=0,this.ws=0,this._s=new Ah,this.targetCount=0,this.ys=vc.Jt()}function Bh(t){var e=this;return(e=_h.call(this)||this).Ie=t,e}function jh(t,e){this.Ut=t,this.ls=e,this.docs=new Vs(Ni.comparator),this.size=0}function Kh(t,e){this.Ut=t,this.referenceDelegate=e,this._n=[],this.ss=1,this.rs=new Qs(Dh.Gn)}function Gh(t,e){this.key=t,this.ns=e}function Qh(){this.Wn=new Qs(Dh.Gn),this.zn=new Qs(Dh.Hn)}function Hh(t){this.R=t,this.Qn=new Map,this.jn=new Map}function zh(t,e){return"firestore_clients_"+t+"_"+e}function Wh(t,e,n){n="firestore_mutations_"+t+"_"+n;return e.isAuthenticated()&&(n+="_"+e.uid),n}function Yh(t,e){return"firestore_targets_"+t+"_"+e}Ph.UNAUTHENTICATED=new Ph(null),Ph.GOOGLE_CREDENTIALS=new Ph("google-credentials-uid"),Ph.FIRST_PARTY=new Ph("first-party-uid"),Ph.MOCK_USER=new Ph("mock-user");var Xh,$h=(bl.Vs=function(t,e,n){var r,i=JSON.parse(n),o="object"==typeof i&&-1!==["pending","acknowledged","rejected"].indexOf(i.state)&&(void 0===i.error||"object"==typeof i.error);return o&&i.error&&(o="string"==typeof i.error.message&&"string"==typeof i.error.code)&&(r=new Ur(i.error.code,i.error.message)),o?new bl(t,e,i.state,r):(Gr("SharedClientState","Failed to parse mutation state for ID '"+e+"': "+n),null)},bl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},bl),Jh=(wl.Vs=function(t,e){var n,r=JSON.parse(e),i="object"==typeof r&&-1!==["not-current","current","rejected"].indexOf(r.state)&&(void 0===r.error||"object"==typeof r.error);return i&&r.error&&(i="string"==typeof r.error.message&&"string"==typeof r.error.code)&&(n=new Ur(r.error.code,r.error.message)),i?new wl(t,r.state,n):(Gr("SharedClientState","Failed to parse target state for ID '"+t+"': "+e),null)},wl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},wl),Zh=(vl.Vs=function(t,e){for(var n=JSON.parse(e),r="object"==typeof n&&n.activeTargetIds instanceof Array,i=ta,o=0;r&&othis.Bi&&(this.qi=this.Bi)},Vl.prototype.Gi=function(){null!==this.Ui&&(this.Ui.skipDelay(),this.Ui=null)},Vl.prototype.cancel=function(){null!==this.Ui&&(this.Ui.cancel(),this.Ui=null)},Vl.prototype.Wi=function(){return(Math.random()-.5)*this.qi},Vl),A=(Fl.prototype.tr=function(){return 1===this.state||2===this.state||4===this.state},Fl.prototype.er=function(){return 2===this.state},Fl.prototype.start=function(){3!==this.state?this.auth():this.nr()},Fl.prototype.stop=function(){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.tr()?[4,this.close(0)]:[3,2];case 1:t.sent(),t.label=2;case 2:return[2]}})})},Fl.prototype.sr=function(){this.state=0,this.Zi.reset()},Fl.prototype.ir=function(){var t=this;this.er()&&null===this.Xi&&(this.Xi=this.Se.enqueueAfterDelay(this.zi,6e4,function(){return t.rr()}))},Fl.prototype.cr=function(t){this.ur(),this.stream.send(t)},Fl.prototype.rr=function(){return y(this,void 0,void 0,function(){return g(this,function(t){return this.er()?[2,this.close(0)]:[2]})})},Fl.prototype.ur=function(){this.Xi&&(this.Xi.cancel(),this.Xi=null)},Fl.prototype.close=function(e,n){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.ur(),this.Zi.cancel(),this.Yi++,3!==e?this.Zi.reset():n&&n.code===Vr.RESOURCE_EXHAUSTED?(Gr(n.toString()),Gr("Using maximum backoff delay to prevent overloading the backend."),this.Zi.Qi()):n&&n.code===Vr.UNAUTHENTICATED&&this.Ji.invalidateToken(),null!==this.stream&&(this.ar(),this.stream.close(),this.stream=null),this.state=e,[4,this.listener.Ri(n)];case 1:return t.sent(),[2]}})})},Fl.prototype.ar=function(){},Fl.prototype.auth=function(){var n=this;this.state=1;var t=this.hr(this.Yi),e=this.Yi;this.Ji.getToken().then(function(t){n.Yi===e&&n.lr(t)},function(e){t(function(){var t=new Ur(Vr.UNKNOWN,"Fetching auth token failed: "+e.message);return n.dr(t)})})},Fl.prototype.lr=function(t){var e=this,n=this.hr(this.Yi);this.stream=this.wr(t),this.stream.Ii(function(){n(function(){return e.state=2,e.listener.Ii()})}),this.stream.Ri(function(t){n(function(){return e.dr(t)})}),this.stream.onMessage(function(t){n(function(){return e.onMessage(t)})})},Fl.prototype.nr=function(){var t=this;this.state=4,this.Zi.ji(function(){return y(t,void 0,void 0,function(){return g(this,function(t){return this.state=0,this.start(),[2]})})})},Fl.prototype.dr=function(t){return Kr("PersistentStream","close with error: "+t),this.stream=null,this.close(3,t)},Fl.prototype.hr=function(e){var n=this;return function(t){n.Se.enqueueAndForget(function(){return n.Yi===e?t():(Kr("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve())})}},Fl),Cl=(n(Ml,Dl=A),Ml.prototype.wr=function(t){return this.Hi.Oi("Listen",t)},Ml.prototype.onMessage=function(t){this.Zi.reset();var e=function(t,e){if("targetChange"in e){e.targetChange;var n="NO_CHANGE"===(o=e.targetChange.targetChangeType||"NO_CHANGE")?0:"ADD"===o?1:"REMOVE"===o?2:"CURRENT"===o?3:"RESET"===o?4:zr(),r=e.targetChange.targetIds||[],i=(s=e.targetChange.resumeToken,t.I?(Wr(void 0===s||"string"==typeof s),di.fromBase64String(s||"")):(Wr(void 0===s||s instanceof Uint8Array),di.fromUint8Array(s||new Uint8Array))),o=(a=e.targetChange.cause)&&(u=void 0===(c=a).code?Vr.UNKNOWN:Fs(c.code),new Ur(u,c.message||"")),s=new oa(n,r,i,o||null)}else if("documentChange"in e){e.documentChange,(n=e.documentChange).document,n.document.name,n.document.updateTime;var r=Ia(t,n.document.name),i=wa(n.document.updateTime),a=new Ki({mapValue:{fields:n.document.fields}}),u=(o=Qi.newFoundDocument(r,i,a),n.targetIds||[]),c=n.removedTargetIds||[];s=new ra(u,c,o.key,o)}else if("documentDelete"in e)e.documentDelete,(n=e.documentDelete).document,r=Ia(t,n.document),i=n.readTime?wa(n.readTime):ei.min(),a=Qi.newNoDocument(r,i),o=n.removedTargetIds||[],s=new ra([],o,a.key,a);else if("documentRemove"in e)e.documentRemove,(n=e.documentRemove).document,r=Ia(t,n.document),i=n.removedTargetIds||[],s=new ra([],i,r,null);else{if(!("filter"in e))return zr();e.filter;e=e.filter;e.targetId,n=e.count||0,r=new Ns(n),i=e.targetId,s=new ia(i,r)}return s}(this.R,t),t=function(t){if(!("targetChange"in t))return ei.min();t=t.targetChange;return(!t.targetIds||!t.targetIds.length)&&t.readTime?wa(t.readTime):ei.min()}(t);return this.listener._r(e,t)},Ml.prototype.mr=function(t){var e,n,r,i={};i.database=Aa(this.R),i.addTarget=(e=this.R,(r=$i(r=(n=t).target)?{documents:xa(e,r)}:{query:Oa(e,r)}).targetId=n.targetId,0this.query.limit;){var n=xo(this.query)?h.last():h.first(),h=h.delete(n.key),c=c.delete(n.key);a.track({type:1,doc:n})}return{fo:h,mo:a,Nn:l,mutatedKeys:c}},Pf.prototype.yo=function(t,e){return t.hasLocalMutations&&e.hasCommittedMutations&&!e.hasLocalMutations},Pf.prototype.applyChanges=function(t,e,n){var o=this,r=this.fo;this.fo=t.fo,this.mutatedKeys=t.mutatedKeys;var i=t.mo.jr();i.sort(function(t,e){return r=t.type,i=e.type,n(r)-n(i)||o.lo(t.doc,e.doc);function n(t){switch(t){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return zr()}}var r,i}),this.po(n);var s=e?this.Eo():[],n=0===this.ho.size&&this.current?1:0,e=n!==this.ao;return this.ao=n,0!==i.length||e?{snapshot:new lf(this.query,t.fo,r,i,t.mutatedKeys,0==n,e,!1),To:s}:{To:s}},Pf.prototype.zr=function(t){return this.current&&"Offline"===t?(this.current=!1,this.applyChanges({fo:this.fo,mo:new hf,mutatedKeys:this.mutatedKeys,Nn:!1},!1)):{To:[]}},Pf.prototype.Io=function(t){return!this.uo.has(t)&&!!this.fo.has(t)&&!this.fo.get(t).hasLocalMutations},Pf.prototype.po=function(t){var e=this;t&&(t.addedDocuments.forEach(function(t){return e.uo=e.uo.add(t)}),t.modifiedDocuments.forEach(function(t){}),t.removedDocuments.forEach(function(t){return e.uo=e.uo.delete(t)}),this.current=t.current)},Pf.prototype.Eo=function(){var e=this;if(!this.current)return[];var n=this.ho;this.ho=Zs(),this.fo.forEach(function(t){e.Io(t.key)&&(e.ho=e.ho.add(t.key))});var r=[];return n.forEach(function(t){e.ho.has(t)||r.push(new Cf(t))}),this.ho.forEach(function(t){n.has(t)||r.push(new Nf(t))}),r},Pf.prototype.Ao=function(t){this.uo=t.Bn,this.ho=Zs();t=this._o(t.documents);return this.applyChanges(t,!0)},Pf.prototype.Ro=function(){return lf.fromInitialDocuments(this.query,this.fo,this.mutatedKeys,0===this.ao)},Pf),Rf=function(t,e,n){this.query=t,this.targetId=e,this.view=n},xf=function(t){this.key=t,this.bo=!1},Of=(Object.defineProperty(Lf.prototype,"isPrimaryClient",{get:function(){return!0===this.$o},enumerable:!1,configurable:!0}),Lf);function Lf(t,e,n,r,i,o){this.localStore=t,this.remoteStore=e,this.eventManager=n,this.sharedClientState=r,this.currentUser=i,this.maxConcurrentLimboResolutions=o,this.vo={},this.Po=new Fc(Bo,qo),this.Vo=new Map,this.So=new Set,this.Do=new Vs(Ni.comparator),this.Co=new Map,this.No=new Ah,this.xo={},this.ko=new Map,this.Fo=vc.Yt(),this.onlineState="Unknown",this.$o=void 0}function Pf(t,e){this.query=t,this.uo=e,this.ao=null,this.current=!1,this.ho=Zs(),this.mutatedKeys=Zs(),this.lo=Go(t),this.fo=new cf(this.lo)}function Mf(i,o,s,a){return y(this,void 0,void 0,function(){var e,n,r;return g(this,function(t){switch(t.label){case 0:return i.Oo=function(t,e,n){return function(r,i,o,s){return y(this,void 0,void 0,function(){var e,n;return g(this,function(t){switch(t.label){case 0:return(e=i.view._o(o)).Nn?[4,wh(r.localStore,i.query,!1).then(function(t){t=t.documents;return i.view._o(t,e)})]:[3,2];case 1:e=t.sent(),t.label=2;case 2:return n=s&&s.targetChanges.get(i.targetId),n=i.view.applyChanges(e,r.isPrimaryClient,n),[2,(Hf(r,i.targetId,n.To),n.snapshot)]}})})}(i,t,e,n)},[4,wh(i.localStore,o,!0)];case 1:return n=t.sent(),r=new kf(o,n.Bn),e=r._o(n.documents),n=na.createSynthesizedTargetChangeForCurrentChange(s,a&&"Offline"!==i.onlineState),n=r.applyChanges(e,i.isPrimaryClient,n),Hf(i,s,n.To),r=new Rf(o,s,r),[2,(i.Po.set(o,r),i.Vo.has(s)?i.Vo.get(s).push(o):i.Vo.set(s,[o]),n.snapshot)]}})})}function Ff(f,d,p){return y(this,void 0,void 0,function(){var s,l;return g(this,function(t){switch(t.label){case 0:l=ed(f),t.label=1;case 1:return t.trys.push([1,5,,6]),[4,(i=l.localStore,a=d,c=i,h=ti.now(),o=a.reduce(function(t,e){return t.add(e.key)},Zs()),c.persistence.runTransaction("Locally write mutations","readwrite",function(s){return c.Mn.pn(s,o).next(function(t){u=t;for(var e=[],n=0,r=a;n, or >=) must be on the same field. But you have inequality filters on '"+n.toString()+"' and '"+e.field.toString()+"'");n=Lo(t);null!==n&&ag(0,e.field,n)}t=function(t,e){for(var n=0,r=t.filters;ns.length)throw new Ur(Vr.INVALID_ARGUMENT,"Too many arguments provided to "+r+"(). The number of arguments must be less than or equal to the number of orderBy() clauses");for(var a=[],u=0;u, or >=) on field '"+e.toString()+"' and so you must also use '"+e.toString()+"' as your first argument to orderBy(), but your first orderBy() is on field '"+n.toString()+"' instead.")}ug.prototype.convertValue=function(t,e){switch(void 0===e&&(e="none"),ki(t)){case 0:return null;case 1:return t.booleanValue;case 2:return Ei(t.integerValue||t.doubleValue);case 3:return this.convertTimestamp(t.timestampValue);case 4:return this.convertServerTimestamp(t,e);case 5:return t.stringValue;case 6:return this.convertBytes(Ti(t.bytesValue));case 7:return this.convertReference(t.referenceValue);case 8:return this.convertGeoPoint(t.geoPointValue);case 9:return this.convertArray(t.arrayValue,e);case 10:return this.convertObject(t.mapValue,e);default:throw zr()}},ug.prototype.convertObject=function(t,n){var r=this,i={};return oi(t.fields,function(t,e){i[t]=r.convertValue(e,n)}),i},ug.prototype.convertGeoPoint=function(t){return new Lp(Ei(t.latitude),Ei(t.longitude))},ug.prototype.convertArray=function(t,e){var n=this;return(t.values||[]).map(function(t){return n.convertValue(t,e)})},ug.prototype.convertServerTimestamp=function(t,e){switch(e){case"previous":var n=function t(e){e=e.mapValue.fields.__previous_value__;return Ii(e)?t(e):e}(t);return null==n?null:this.convertValue(n,e);case"estimate":return this.convertTimestamp(_i(t));default:return null}},ug.prototype.convertTimestamp=function(t){t=bi(t);return new ti(t.seconds,t.nanos)},ug.prototype.convertDocumentKey=function(t,e){var n=ci.fromString(t);Wr(Ba(n));t=new Fd(n.get(1),n.get(3)),n=new Ni(n.popFirst(5));return t.isEqual(e)||Gr("Document "+n+" contains a document reference within a different database ("+t.projectId+"/"+t.database+") which is not supported. It will be treated as a reference in the current database ("+e.projectId+"/"+e.database+") instead."),n},A=ug;function ug(){}function cg(t,e,n){return t?n&&(n.merge||n.mergeFields)?t.toFirestore(e,n):t.toFirestore(e):e}var hg,lg=(n(pg,hg=A),pg.prototype.convertBytes=function(t){return new xp(t)},pg.prototype.convertReference=function(t){t=this.convertDocumentKey(t,this.firestore._databaseId);return new ap(this.firestore,null,t)},pg),fg=(dg.prototype.set=function(t,e,n){this._verifyNotCommitted();t=yg(t,this._firestore),e=cg(t.converter,e,n),n=Yp(this._dataReader,"WriteBatch.set",t._key,e,null!==t.converter,n);return this._mutations.push(n.toMutation(t._key,ds.none())),this},dg.prototype.update=function(t,e,n){for(var r=[],i=3;i Date: Tue, 3 May 2022 21:48:09 +0200 Subject: [PATCH 4/7] fix: physics are FPS depended (#316) * fix: physics are FPS depended * fix: physics are FPS depended --- lib/game/pinball_game.dart | 3 +- .../lib/src/components/ball/ball.dart | 3 +- .../lib/src/components/initial_position.dart | 2 +- .../lib/src/components/layer.dart | 2 +- packages/pinball_flame/lib/pinball_flame.dart | 1 + .../lib/src/pinball_forge2d_game.dart | 44 ++++++++++++++++ .../test/src/pinball_forge2d_game_test.dart | 51 +++++++++++++++++++ .../game/components/controlled_ball_test.dart | 3 +- 8 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 packages/pinball_flame/lib/src/pinball_forge2d_game.dart create mode 100644 packages/pinball_flame/test/src/pinball_forge2d_game_test.dart diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index f9018ee5..bd29e4e8 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -5,7 +5,6 @@ import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; @@ -14,7 +13,7 @@ import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart'; -class PinballGame extends Forge2DGame +class PinballGame extends PinballForge2DGame with FlameBloc, HasKeyboardHandlerComponents, diff --git a/packages/pinball_components/lib/src/components/ball/ball.dart b/packages/pinball_components/lib/src/components/ball/ball.dart index dea4c0b4..12b1c877 100644 --- a/packages/pinball_components/lib/src/components/ball/ball.dart +++ b/packages/pinball_components/lib/src/components/ball/ball.dart @@ -12,8 +12,7 @@ import 'package:pinball_flame/pinball_flame.dart'; /// {@template ball} /// A solid, [BodyType.dynamic] sphere that rolls and bounces around. /// {@endtemplate} -class Ball extends BodyComponent - with Layered, InitialPosition, ZIndex { +class Ball extends BodyComponent with Layered, InitialPosition, ZIndex { /// {@macro ball} Ball({ required this.baseColor, diff --git a/packages/pinball_components/lib/src/components/initial_position.dart b/packages/pinball_components/lib/src/components/initial_position.dart index d79f8d64..4265a3a7 100644 --- a/packages/pinball_components/lib/src/components/initial_position.dart +++ b/packages/pinball_components/lib/src/components/initial_position.dart @@ -5,7 +5,7 @@ import 'package:flame_forge2d/flame_forge2d.dart'; /// /// Note: If the [initialPosition] is set after the [BodyComponent] has been /// loaded it will have no effect; defaulting to [Vector2.zero]. -mixin InitialPosition on BodyComponent { +mixin InitialPosition on BodyComponent { final Vector2 _initialPosition = Vector2.zero(); set initialPosition(Vector2 value) { diff --git a/packages/pinball_components/lib/src/components/layer.dart b/packages/pinball_components/lib/src/components/layer.dart index a39ad837..8418fac1 100644 --- a/packages/pinball_components/lib/src/components/layer.dart +++ b/packages/pinball_components/lib/src/components/layer.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; /// ignoring others. This compatibility depends on bit masking operation /// between layers. For more information read: https://en.wikipedia.org/wiki/Mask_(computing). /// {@endtemplate} -mixin Layered on BodyComponent { +mixin Layered on BodyComponent { Layer _layer = Layer.all; /// {@macro layered} diff --git a/packages/pinball_flame/lib/pinball_flame.dart b/packages/pinball_flame/lib/pinball_flame.dart index 66d34b14..8d458574 100644 --- a/packages/pinball_flame/lib/pinball_flame.dart +++ b/packages/pinball_flame/lib/pinball_flame.dart @@ -4,5 +4,6 @@ export 'src/component_controller.dart'; export 'src/contact_behavior.dart'; export 'src/keyboard_input_controller.dart'; export 'src/parent_is_a.dart'; +export 'src/pinball_forge2d_game.dart'; export 'src/sprite_animation.dart'; export 'src/z_canvas_component.dart'; diff --git a/packages/pinball_flame/lib/src/pinball_forge2d_game.dart b/packages/pinball_flame/lib/src/pinball_forge2d_game.dart new file mode 100644 index 00000000..118baad9 --- /dev/null +++ b/packages/pinball_flame/lib/src/pinball_forge2d_game.dart @@ -0,0 +1,44 @@ +import 'dart:math'; + +import 'package:flame/game.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_forge2d/world_contact_listener.dart'; + +// NOTE(wolfen): This should be removed when https://github.com/flame-engine/flame/pull/1597 is solved. +/// {@template pinball_forge2d_game} +/// A [Game] that uses the Forge2D physics engine. +/// {@endtemplate} +class PinballForge2DGame extends FlameGame implements Forge2DGame { + /// {@macro pinball_forge2d_game} + PinballForge2DGame({ + required Vector2 gravity, + }) : world = World(gravity), + super(camera: Camera()) { + camera.zoom = Forge2DGame.defaultZoom; + world.setContactListener(WorldContactListener()); + } + + @override + final World world; + + @override + void update(double dt) { + super.update(dt); + world.stepDt(min(dt, 1 / 60)); + } + + @override + Vector2 screenToFlameWorld(Vector2 position) { + throw UnimplementedError(); + } + + @override + Vector2 screenToWorld(Vector2 position) { + throw UnimplementedError(); + } + + @override + Vector2 worldToScreen(Vector2 position) { + throw UnimplementedError(); + } +} diff --git a/packages/pinball_flame/test/src/pinball_forge2d_game_test.dart b/packages/pinball_flame/test/src/pinball_forge2d_game_test.dart new file mode 100644 index 00000000..872f8b97 --- /dev/null +++ b/packages/pinball_flame/test/src/pinball_forge2d_game_test.dart @@ -0,0 +1,51 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame/extensions.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +void main() { + final flameTester = FlameTester( + () => PinballForge2DGame(gravity: Vector2.zero()), + ); + + group('PinballForge2DGame', () { + test('can instantiate', () { + expect( + () => PinballForge2DGame(gravity: Vector2.zero()), + returnsNormally, + ); + }); + + flameTester.test( + 'screenToFlameWorld throws UnimpelementedError', + (game) async { + expect( + () => game.screenToFlameWorld(Vector2.zero()), + throwsUnimplementedError, + ); + }, + ); + + flameTester.test( + 'screenToWorld throws UnimpelementedError', + (game) async { + expect( + () => game.screenToWorld(Vector2.zero()), + throwsUnimplementedError, + ); + }, + ); + + flameTester.test( + 'worldToScreen throws UnimpelementedError', + (game) async { + expect( + () => game.worldToScreen(Vector2.zero()), + throwsUnimplementedError, + ); + }, + ); + }); +} diff --git a/test/game/components/controlled_ball_test.dart b/test/game/components/controlled_ball_test.dart index 17178e87..cfb3e157 100644 --- a/test/game/components/controlled_ball_test.dart +++ b/test/game/components/controlled_ball_test.dart @@ -2,7 +2,6 @@ import 'package:bloc_test/bloc_test.dart'; import 'package:flame/extensions.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; @@ -15,7 +14,7 @@ import '../../helpers/helpers.dart'; // TODO(allisonryan0002): remove once // https://github.com/flame-engine/flame/pull/1520 is merged class _WrappedBallController extends BallController { - _WrappedBallController(Ball ball, this._gameRef) : super(ball); + _WrappedBallController(Ball ball, this._gameRef) : super(ball); final PinballGame _gameRef; From ca9679ba1dfe55c1bcb389139e18dce05242e3a6 Mon Sep 17 00:00:00 2001 From: Erick Date: Tue, 3 May 2022 17:06:00 -0300 Subject: [PATCH 5/7] feat: adding bumper sfx (#315) * feat: adding bumper sfx * feat: adding missing bumpers * Update packages/pinball_audio/lib/src/pinball_audio.dart Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> --- .../android_acres/android_acres.dart | 6 +- .../flutter_forest/flutter_forest.dart | 8 +-- lib/game/components/scoring_behavior.dart | 21 +++++- lib/game/components/sparky_scorch.dart | 6 +- .../pinball_audio/assets/sfx/bumper_a.mp3 | Bin 0 -> 37660 bytes .../pinball_audio/assets/sfx/bumper_b.mp3 | Bin 0 -> 36406 bytes packages/pinball_audio/assets/sfx/plim.mp3 | Bin 18225 -> 0 bytes .../pinball_audio/lib/gen/assets.gen.dart | 3 +- .../pinball_audio/lib/src/pinball_audio.dart | 28 ++++++-- .../test/src/pinball_audio_test.dart | 68 +++++++++++++++--- .../components/scoring_behavior_test.dart | 67 +++++++++++++---- 11 files changed, 163 insertions(+), 44 deletions(-) create mode 100644 packages/pinball_audio/assets/sfx/bumper_a.mp3 create mode 100644 packages/pinball_audio/assets/sfx/bumper_b.mp3 delete mode 100644 packages/pinball_audio/assets/sfx/plim.mp3 diff --git a/lib/game/components/android_acres/android_acres.dart b/lib/game/components/android_acres/android_acres.dart index 3d1a8154..d29f38d7 100644 --- a/lib/game/components/android_acres/android_acres.dart +++ b/lib/game/components/android_acres/android_acres.dart @@ -25,17 +25,17 @@ class AndroidAcres extends Component { )..initialPosition = Vector2(-26, -28.25), AndroidBumper.a( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-25, 1.3), AndroidBumper.b( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-32.8, -9.2), AndroidBumper.cow( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-20.5, -13.8), AndroidSpaceshipBonusBehavior(), diff --git a/lib/game/components/flutter_forest/flutter_forest.dart b/lib/game/components/flutter_forest/flutter_forest.dart index 1fb8907b..0f24a3b6 100644 --- a/lib/game/components/flutter_forest/flutter_forest.dart +++ b/lib/game/components/flutter_forest/flutter_forest.dart @@ -18,22 +18,22 @@ class FlutterForest extends Component with ZIndex { children: [ Signpost( children: [ - ScoringBehavior(points: Points.fiveThousand), + BumperScoringBehavior(points: Points.fiveThousand), ], )..initialPosition = Vector2(8.35, -58.3), DashNestBumper.main( children: [ - ScoringBehavior(points: Points.twoHundredThousand), + BumperScoringBehavior(points: Points.twoHundredThousand), ], )..initialPosition = Vector2(18.55, -59.35), DashNestBumper.a( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(8.95, -51.95), DashNestBumper.b( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(22.3, -46.75), DashAnimatronic()..position = Vector2(20, -66), diff --git a/lib/game/components/scoring_behavior.dart b/lib/game/components/scoring_behavior.dart index e8f51e90..f741e213 100644 --- a/lib/game/components/scoring_behavior.dart +++ b/lib/game/components/scoring_behavior.dart @@ -23,7 +23,6 @@ class ScoringBehavior extends ContactBehavior with HasGameRef { if (other is! Ball) return; gameRef.read().add(Scored(points: _points.value)); - gameRef.audio.score(); gameRef.firstChild()!.add( ScoreComponent( points: _points, @@ -32,3 +31,23 @@ class ScoringBehavior extends ContactBehavior with HasGameRef { ); } } + +/// {@template bumper_scoring_behavior} +/// A specific [ScoringBehavior] used for Bumpers. +/// In addition to its parent logic, also plays the +/// SFX for bumpers +/// {@endtemplate} +class BumperScoringBehavior extends ScoringBehavior { + /// {@macro bumper_scoring_behavior} + BumperScoringBehavior({ + required Points points, + }) : super(points: points); + + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + if (other is! Ball) return; + + gameRef.audio.bumper(); + } +} diff --git a/lib/game/components/sparky_scorch.dart b/lib/game/components/sparky_scorch.dart index 434e9479..f98f71d7 100644 --- a/lib/game/components/sparky_scorch.dart +++ b/lib/game/components/sparky_scorch.dart @@ -16,17 +16,17 @@ class SparkyScorch extends Component { children: [ SparkyBumper.a( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-22.9, -41.65), SparkyBumper.b( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-21.25, -57.9), SparkyBumper.c( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-3.3, -52.55), SparkyComputerSensor()..initialPosition = Vector2(-13, -49.9), diff --git a/packages/pinball_audio/assets/sfx/bumper_a.mp3 b/packages/pinball_audio/assets/sfx/bumper_a.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..76c0b0227c4c792c998e160c7509639e23daae8c GIT binary patch literal 37660 zcmeFYRdd{2w65E2W`;JiW47DOF*7s9%*^bVV`iq98DeIJn3-Z`hL{sm?|f_3t~wXz z51gu_3r$J0N*bE==$%8ahGZo;U;zIuR2u5)lK)zC003IS#M6?CmxYI$1*(m_=H=)2^=nvUWNd6wT3S|CUS3gISyfeCQ&U@8S6|=o@YvMU z{QUCrudS{9{p0iV>+AdH=hs)rf06u)+3a7;V2=NG{_jE!gZaOk$v4NFn3ezc@c-Zb ze`N&z5oZnnz!G{6PJ@l1L`MH~7e)d=*HmVIo`QhCCG7h!Q~&^ke|IzfEirk34IZ#B zXl3d2w$*ZMR^W+^=H&OhfeLSYNfI`c0~!(+7mwYGwS2y5Mny$sQ2c3p$!P|fP{>@+ z6(Z*a06?}d02zLUFV7nUdX~p0b0mk4YoUy0I}NdxPwagb_7<+sy`+$%n{Rz)pjk7} zD0^Eru~qN;jl%0S=x5KzC^!M)x6^a;^{pYd=jOTR`4#ls=eJ|e^V#`dd{AL>2wJ`{ z0I@CX`oS^9?zp+Q2MR(d$b)^@!^KT?U!^|yPi0Id&{$lPYXltg&Rhz8EWwcICp7E)ur(s__Usaj08|by9$zQq3eEA+aS&wyNmtq5qQ%-%@^CvA z5J6|$ik1-sa`E*ttE0NBqFqTaB<2{((EtL0Jo^$ha{#~LH4z{qvk({DN4YcKJ}L)tyeIELehq|zko?dLK+6N;^;Y5wI-1&Dwb(Q7SUy|;yLKOe=a5``Ge^)%63P>-(umXpR6e$0T z!1Ze%IrYiI+Tp|!wsrGkT@!nK2}BzmwW|i*#`5s%1aCc zd2KYu2Ef*s{W>w(1=vS*IULpi@MIm#P^kT*Dr+3y9#FgKbeBdA`*Tzokq&`tjTRM! z^U6YL7~A}jjT2w#DTMM+KI3H`H20}=^TyJMdhm7g&X-M`X+5TskhVy6O*J1AUpDDw zuAIUCELCraqMQk&ijIVc@#fmhsB1@WI|3~@%*C^E_!l3A1gQJ8% z&mH&M0DL0R)GiFcj+d{c8mV6s5nUESOo(|Ih~Kn zJ7`mR zNEQH)Nn#EvK{)Nfg3+y}D6Hl;1Y;e@NJM8c7~=Vwz>`O%;E7XGv4g@HO-2ML88lB- z-~L062nx2>V08#x{m|nG1>{>#2LrW8e{PZB#2H22d|L&D;@t|KQBm!aI^r)udI&I>Llj zyAqI_?6n`R#wjF$p8G|^yNro8BCF>_rtWsLrLZ&Wt3$4*q9 z!1lwuW<_IHIN5u7B5|ssML?{Nc`3pZ_4X2qV*6{JrPvV?YxF4fm1aW5Tzlk_*o|d2 zecFDZ!IGK4rh#TpI`S9I==Uo(&9>H|Q37o__CVfcoBMY+4`?)l=WjC_zJp9`Wc%EE zVugj8n!GMomP#q~*s4>WRI}w*XxDa-3RDC_)F0WDTt_M@E*%F&7|6Y3K(E~7L;!5p zEj58XOVKpPkaur3c`$VzXkk_oVXxXeR54K@Z)q)K)mUlM9`8XF z)e9s4AqRqjO*2}%z~D*riXo~uiB!OS&oNRE!X6lBs%?J2Yu_kYil4^HTnpN&n6$DJ ze&K86_04zH?Vxs|H*a*}Gt}X}y0!{D7QFVTe`dtVoKnEHM9f%V%_*@~p$l4PA6anz z?mCDpSHh$76M>I2kJY4+B~(>Ve3(;OwmRFMf-aIYrpGIAbRio5x!7fpU7A-QtzNS1Bnz z7zxbh+mWvZtB+PKv*v%NvXrqoRN+_gRhi$zfY{WsuuYtlOFBQ8we|y3^5PGKIila?$T_>4F^0IAJ;^&X1ddBU+N@+D z?)w^kQoH$2F1r~Wn#8~6nXPPF!GEgd80P_;6^bx=Js9DH)~SLwUS4l|T8y1x2qk<*9$~()UbjT}a7lF#2vdZhDwq zMi+esOQc}B{u4!(8fw4wAv;TV-LnwRH{K<-pugcz>vJXg9X^T|HC?>~!MZ#I3 zY+{t-bQidrp&TCBm(_!t&3m=}63lkx&&@OlQesS^zi+KT=V zMgOJy7%U+#=`1uTO>zxd^ec~V(%j}kot-`3iyg{F`&&3_o{_csP7CbH?I0dnk6xq$ zVG|5~rgx>b;p8Cz#48j86gVZCyN}XFPN*mP zY(y>|6~lkX5ddKIjkV-aSVU}*84ba(`Py-Xnl(Mx1G6CXL0Njfz=;9Mgm7%* zz@2+7>`Gnan3-(j_K}&`i7-y=`6YjD+a*)A{*K4ezdueBkbSUbHkPoodqdU zy|Zs$_4|o>?jgTMK_;OXrqN64Si**23)lQ9wWO(W`C{Ij4L)-au&YP_XDo~ht{|_N zdgtla`!PRkARC>iZYkx0?%r<{IHzB)YjX#Wph^rflJt33#l7CZ!?yjNs95W9w&t%N zy^Jx7`%XTNd})wBu!fC;RV97fs^Wj2PrT?xC&ZT1z8q(*R5+g=EjF?Ay{1Y;LMLy) zZZR5JD*G9!0D%9VR6rU{8OZb$o*L;fsbDum1yfRVaWAqZ&3#2nKvDA(^Rf4L&uuQ; z)M|xce~ZB=B*jKn^j#3*0@mBDCRx$k_dqvBlTk;9rmZHnPoVsP1$wP^JC`O70fAK# zzIFC}9ZcMbaYod`t>yuQh>V%S0?MJ*dc}eGtEhIqe8Cllmmk|w_f+OHn&f5%YKyLo z*0Shqzc2*-YEarLgCT=4={l)E;*dD0;9EuK>PmW9ZF&D<)UH`-07W7IDC-?X0A?sg zO|a8ow!;+7RhaJSj}uU{n##z_S*04JgCz2WH#ts^b?H333=uLXPVga2_i7GaC)w88wfWAJ zA>@Damo9X{VFrAO)Bq%YTypcDuprQHa;l?{Qb6Q>BSs|ZA2y=)xT$Hd;bGa=)lPQ~ zUMM2d-{PU9-Udk4To3J42r(p{7PS4 zjD2214Pub_qAw1>^OJh>gTUR_Pxr_76Aw!V_*w7Tu1ojPWhN-Ua_`dAFFlrI z;cK5Z6c!& z(wB15^q!MtyiUbpIhc#O;e@1k`h^QPR-RkxL49DoD=6M|CLI-JycLyHipIr-{gcAV z(nn22><>O#G{Q>Hm4#x8j4yC%4E3zZBy(Px(BXRfU-Ex$Byhu*rmFd@6DjIi5686q zv2#4QgvBfoqP<`Q|7k6>_d>x6!xqe%Cn4VcQBcG(CRK&^jZ&Jjl-K#kwdFn^M2-WA zq5KEI-1uDinRiqrLs7M+X&Fm}yWZC3TZHRUCy&_5s^{{OW|}k=M~$6_9nbYdn|v}5 z01%V`$YeQdWDQ{H&beW;Vk|~!S`y;G@sd!a47kb{sZ_e(%?6raN_8)6O83HBqYGU3 z6kUf1hJ+~dxuZ1H^HVN5I^9?gtGnIBfj2t#ZQIm8V(MOs4r7G4Lk@toP1wf6d>`(+2=qU7gH;6a z($NcgXW~f60F2?r-O-W$IR(K5N2AJI4tjAToGXOkm!W9_`!j@T8J4~XY2q&JwN{9~ z(Wu(1ZoU6Qjv|Dn&2T~8Tf)@^o-j&?&Rg5WOk}#-2RL18>k&#(QH8ax=dp1yo10$4 z1;#Hc%POh`Cae>Q_eaTmNLy>&s8AJ@{&!zx$)Jp@KdB= zLLuk{7kDoGC!b6*MP|M;@aY@HLA0(IX|kzs#QbXQ5Q;_C6t(Pt_#ZVA3^U1ZGQ*S4 ze;Dup0NnS244}pWWpqK47Mq-M+En=+bCelPsN#m2qMfCrV<)oCXIqRkACA-5GqY`n zX%Yu<0?jnz`235&1QaOZ{-(tK->y_0Vx`KM6FUgjoH%_qg``YX_i>u#?`pK4@O!b` zZt9-5Vy^7`ATJ02hEZ~2AsowsU2-s{ZZsZ=(q#FWAR6;_u2vTtu5kd0r8w5yM zPa+FuI}iB?C&o^v(XBV|smOaWZ`8m5*@A2@w>Xl*I&CW4@EZ|2m@uiuXWf@Hn)Wx} z#|gCP%nKTtz<%8Td-%5JuXLk|wg|OOidS-b{}di8#58>S#O| zhniQh-&*Fz;9o6qe7H-_ISNCVSW|rZ?7vxGbQx`<6XN?m!py8WEjK0Pf!b;yExXfh ztSGR^`2!gHtw2gTrF9WTA81}RJ1ei2T`CFrYQ*#0-mQ!`t%-_nv?=}cS|cHkR@Y&N z`_K2~VKX(B5;g|nvKc2)3}FgzjAIAMP~a)JJ~QrcG5^si}OFS_>1D?}13vGOfd&z!G zEy^Y@tTgO~tE3F+_76Sl~uSUW&A@#CA42N*gs2InD6=Vg->O%p8 z?Q*iOj6EOU>oS%~LOggb6;?eSZ?+#33a$P~w6_~IqYzzb+DQw?GOBv{KJx*eZy!rO zQ&AE{MD|s@*Eu2J#Hj9zJ9Eb67z%*k=`?QuALu&~Ax7(`_%Ralp# zfJ%$R-LQSM=wLwYt7A+QtGV;A+F~?4ZLNcWQ~+4P5T`77e=v}bB0_fvS7E1|Ag4eg zg=D&CiA&O?zU9X>(n!?N@%ByJx>RH5+)>oM#9blj6U%pAi_Qc)KW#N!_d3cK>p8IQf1v+wUG*Y8uL<^@N4Tu~aVE+rE4FEIQf_@5*{9ppsb zQfUE)pOoteQc>vKJw5*H-`eC;0$lsf0x;|^f~#FYQh_uE7mM8=HNQ55LfS-j@h;u z>X2Jpo9He5ha3$W9JZ=bijKLn!&oQSggG!X&5qxp`xoMmvdV|YBEIvu%%=89zBnZT zg2u{9yAxkx%UbYX<7t!RA=dXA#KJ)2LDI~GiDHap_R1vw=7-?R1lf}`T~&H>Jve7- ztNBLvbuLaj3T$+f4aueONP_cueyiQUfYp;~Ke40M?fkfrt-FPpCePLZs<4MpG{2vv zKDtTclL=|8O(ED zzMQM`os@X{j5+Q+0t_pRMT1ez3Mq_3Dbc}JW})W7&ES$C%;XXCa1jqSI3RDr7yy-% ztR*+RmIj-c=ZKRWZ=2zk8}}fl4j)fy5W|H$3(2+;>%Q?wm4UsWR~5e-%X4{L$XiLa z;xAFDi7W1*^FwwM+xH+h$B4($>X{}+Z)}TbCfo%(dz&N*m`Qb{N-Ee*ncLlt$qGN? zFNUx0T77`B;SzO*^uI=51sijkM&_%Sh7r-NNusnpqf%|2&gM$gOLpXM^`U#v`@n8; z&T>!)82tdoK0~~v#5HWFKUDpFzC~Ii%~met2bf(?*k$X-6l(S{GH10~Kht*%43|c( zjt#jla&l(8SUjHjf@Zh4`0l?|F=z9?D^8N4P`g3s1GtLMv@QgDEwmP}*v=P)ydlCU*Tc2%j^9F!@4*wvJ4+@bcSo+kVZPpU&)$Y92`) zUX)7kF}ofpbpD4NF&b>Ht}>C66q{v*ubv62KR$s2zk?8Hyspf~`hn|jmclpaAQ2Pi zq=HYK8VoR7r6=s2_49EJc%N*Uz+{=y5#Q@@Y^gA_sc;F#p;I1Ga_b38ruJP6Om($s z^1je*;T{lB?*1~?pp2|^WTBPeB!WKX-g)j$wli`W;21B-F**%C%_(7ks~j`guy%K{ z;hg6%oyEiqDZjB%1f&4~@Z|e(T+a^Qrb-S5CFx;th4Us=vwiM|TbWigPO2AZ?Ae47 zkIBV~j?;Uq7s?nY81{_vR^rH50fjAtp$?_R66;!h^_B9pcRN8#f@kR-^Ks|>%C8aR&p4?(Ke45<}DNq zQ^`wNQ9}f(0cc56&A0>F%(o){7zsVZMW|ZUKfu6i@1na9m+vUW0XEOSNYwR$HQ|KV*&;uIqD5HP4r$2pR;ZGom zmr;yH3lq7#|FNL6h)-WKv|+hY5@ud%H+8KHUP(;9#dY6=n>+qOA}o&I4QB?b)*-V+C) z0Q57n=8w@!z?i;H%s9U#G70uI^`z87sORl?3<&Ip+@qRT(|KTB^G-A^?Q!5TM-DLI zhHi@07oL%|;h`9(2MJ`m>bdR~OvM(4s3c3?^qT6P9WqL!#R-q=lEiG!9)J!2 z3K0$$k$vi2!z?`_x*&;)#L|KE=rmapR5Q208J_En9WL_UBoEQPA|h%9jV&}v63T<5KIm^AdscM@)KX`=<@Nhxl%p?K?5@$UJ}3`9&46 z5O%Z8=Qlgq2l0m-UjIW*LNo{lTUOPM6~{H0euBY-(GfH2v!o)8x11S6d0crBFNgsk zg6GugKa*n66dC;mJ2t0U*{uNX48er_2Z9nU6=nj1y;v|!mA4IDswz2-1js)2j#7)H zi%C-PQyRT6Xo&YHum^4bLQdNx8WVd4&=)G!U_Of2fNtGY z6jz^lo@`S`5x|;gsoE@kfloURZR4++J4!T+SfwnR6pCt)wotTxyvcvwFmgU~9IzJu zpmJAiCA1#PaKAPfa=fs@RLe1*^TH%Es0fI#Ax*PMv*&YoAFW`;=WOmVuIv`{57e!C ze|yP=9QOmDO3r-Xfx+?No1xjsN?c_LygKf^3RzsnYxD>9%E##USiNSJROVis_o+&q z<}M~`;U*uZTWZuY;rxNjJq4cw1a+ob%`Bb6sS)O$h5fw$bd&7N=1m8!NG%f0+! z1shD6b1w>PAkaoP|MVV69@|4mRG^S!K>ueioBWKIEho0*95s!~F0|pwL(&e{l7(lUzc*|&5^Do)|ashhP1`wn1ku|`2=TB zw3ewqf4N5p7ze6Zd>9w1;0|tN9LPFCYrqI4xz>bga-PRXT84+?(6ztNawl&$&f3tj z!6K(3OP80J4=0t!G0*mV4pb2d^;V{U1r3Q&;7BCrH%MN6UPegflK5szrSlhUd~EGi z-SGNR(#DSL?>h<$iPaVPe=4UDIf5xRlj9`Ct}BiB+kAQuSJ#G5@t?|Bey>0bYiW0d z5%`vSIr-^G?T_cS&xzW!tddskg^$^!kLMFs=@qQ7#_GzKOOcAM*-``Yd1sSpYfb)< zP=>rjTTv+F*jkeDk(bT)>UXJ6xjfkwNl0R~wbcI#1#;J-!w3*`L@Qh|ObQDlb2-M7 z$m!-q!=Yv+G*8!iYUJVcY8U`#N<)dS7hq3yKB8cXm_$y|M3kte3|nCl_NkqaK^HzM z`D0vH&K0WEHofS>zu~>m^|Ca`S4T&;a7jmN{-D;lybEn_C1Zi5#GyY9vP9An&_QS# zIF`Q%XqTWCua`H-20cjp{T47GMEzvmfe1NY@e^&?*VM33~2-W4i z$Z)jSm|4l9#y!1tHA!$Oa@d`E@+?2wv79PVk+k%y9x|0YX5{+gCH(%Yb;i~@LCkor zmqRF0F{^HqO*&t@T&UL(Q?;YV)W(CXb({7qmtO=0z!#H=iA=0@*&xxFjq3m>64KX9_qZgZTVcnso>S_UdiYhxg`G0-S=PhVWw*l2 zX31cJ*H<%v44V~i>gn6^6I+rvZd&FdGA@XBRPHn)i~Va?J~*N9jJjv4lnsCl08jw0 zh1{lwEtH}H=9c_(66M!9jkIjdStJ66H8k$0gPYb+Fux%+;7H_7ndx=^Zm#{Jw*06= z5%9qL3#tBDceqcFo`#JT{P_AGa{ef=>UuN(<#M`XNX#avj+(0SoQ@Kk!Cu6lEK($` z$rekjy1!%C7^=Tt0V1L721N^a*^PrL!(ebM#p1Hu-yEQHDu6`4CMbWjz2e3nRdnW5 zXJk#fS}go6Cxt1`;B{&m`;eotwvMJ6w0?^WlDY0l$Ud}X$KNKc6x*UwfBk!=*kKWq z(4B&<5r+=zn3sy5Pe3C$8 zj9aFIsssFS)6Ji9Q44mhFPyZZS_(x?d>QotfMCEtYx2PIB@iFfoJ#crpZ+@QGX_jI zX~z$Oh!O{=bBm_F7KCB*S?s-)PoP%gtYjs}tm4i%1`k3GMNC=MpbM=tfe{4Unl46B zuG%ffmg)<$9%HoWnd8TDsZ6~m71Ci3cd`p2!&XoaI#4tur@>Yd-sdLml2UjT5f+ailSD$BQDAax_^fEpFos-p=GcK9r}-32*Q5F_xC^Kr*hOI}Awg&u><6kh-% zew;v*(7m}6-l}4Dd-4*Uf#eo7UPlw8BEl(RK547OAMd?Ak*b(FKNDJ8ccbHv()`g> z_sDPeF_Vk}X(a5yeoizg&D5%udtn2B$hS(#$?3?g{fD3wsLAR7SnUr8kNY<1XPdB4 ze)P9wt4}SH(9uA?ofu{;L(=|3E)M}#N_m>dTfx;hk{`*0*%8Oaibt`(TQn@gil%(P zTdEW*d*y83^&4lZ>S&r;d|X#8EVHhby%d?l1wSsWk2caDGuOZt`%Apk#1*Kn)KU%X zE+!9HUnGe;I4hLc6j?g|QT=h*;Q%r)Wdw1Fr@w@TY7B-zTA67y3<0%?*_DT76L&?5 z9s?={VOcHt#Cg#gumBnWp{xFmLWS(cKn_j#2_CKYiSnw2cJzh&*ljrF7>@nu%HNd8 zRmC4?E_+~zq+#6!(R~&TdXk5O{Jdz=UAK9pD0;)qQb!8=9QU(A3Ehuc;@OWaF^ z-PPr=1&=LCJ8LpKqBI;x>Tfk9*u7~J{dpkcTfY6i_4dt8m^Wx@r8}iP9y~%C0guHM zTVf14ZO%M7g92_4Q6L1z#e&*_1>q?e#14E1#`$V&W1|0Tu0nGBnjWVKZ$2SIhLt_P z6ExYDU-b5@1Qq!{S?mB6$PMBdz_&NL9_uh`RL$C_5HMISkdnvyVrh)n~ zuZ541;99AQL{F%VTlVwE5VKM03E`6_Hg8_A7FYB!#vuSz4u;(5X|TY!pISzS+JZQW zWo)IG)?u;Kd?(9#nF{MyWOx3I%%7>aA3SzH^JxospcIxygD%a*;)8{ATa$dRDl>ed z^2Qxj*^J*!cb|i^A$}MBqH>B(ypSy~$RANsRTcApg=d<_0zWhTWcepQcaf_R9A_10 z1&fBo0m!$u1asQmVmlpoI&Y281e z{#*n=LJthW53tsWffbPfaC~7;oF4yIp((KifN@cuQFmf;jzL76a5#>~3?Tcba=sz- z^j2JD#VVl&G?8V3swtdlZm5k>e$`yav7IdriyI~JC$jRn5WbEDfYVnOxz=ZaL;=pP zY#Hi8I5modbd*zRW$2kfzgs#VsUk2$C|(IXWieY+6Q`I>G-&Kz^p3Tv3POg3sd};6 zvVB8M@gbGM^k~k2WrjVeU)5@90O;dRa}023C@nG(0UetT6k+F~5AWW+l5rtoy zahy0a(gVWJK=7myHv&5bF2IpYEjd_JyTenFGx(^3>AH?Zg0r?|Pq6f4hDtL&EgbS< z6o_-4iJcuDn2h)!P9+G>4Ntd`EmYleg7GjStMEzMvT>!{G*esnh2t5Obvsg-m=@d z;mNSP)3Ui*a1np8wmo^oib7)RG1`DPvagVNr?^pF)Jf@z6JO>xku-X7cEFCe3 zbb_I1`%R-GRER-jIzN|Et8II5$HM^siQFXuoV3b#O18v5Cz!9(;?`09mWt(C#9uTb z=j1WCWiB~Wq&BAgUCuK9G_g39?z^_Zmw}s2wGwo}bqrhP?bRC#5)&@w0uYwM+^}96 z2@64|4Q2ADMX|p=RcWw+b?7#{s6Ku9 zm{-016=DuWVQO;n_yblBuY~;@RDVvT%J6`Pa#Fb3*?!y1@rMx>vR0)a0L^FxzP!cD zBpFrN-v3(qs->?iIFCqhJ)5R19n$6iY2se-jF>t}tFikcC7>5>=?$Gmp5YgAjgitH zDt0uP<9j$=l*$LXgStYvMebd>*?sOD>_sMqVMHx{c(>)~(6p;-p7zr{*nwPs?QtR` zrvLI`d?mUWOmJWAN^i+bUmCl%Osn5zhBk9u-JOqp{4z@~8cW|->vSt^g5SV}m}Kx4 zN5Aq-?|UZWTA_<+6fXP#yM}P_TLZJ9pf>;}G1!s{pB4(v@>5V5bVQ*uXdzp0A4cIe zxP24@1j2#sAH2ptgWZ^<`}jAKK(T{DB3%t@&Ym>gL6>bVHP$=!t{BBXEOOA_7-N~p z#h{5f(&nv09?QSFUkssK>pDWU9<|Eq|MQ;um2pgJx03{1bQHR02C{~ga*z~Es^=?J z`uW65aq3)8g!!L^6CSR2&y62sDDg0rnm?p}*Girh?p^SJwns{Pu%4Gp*O z(sHc_-JaHByv}YY%r4zNz3lMdzk38`{D<6gB&>$|l${edn+ILgx=Haqk>n7$(iP@- z59OzpZ!PVzU*m}ER^I?a-Ii*=7OkHphOP5?Lh=!JvRcjrREKfmNoD)zG6XJJZhDGd ziwo(&Pzq*#8PcXsOJ1EP>~b7y_Z>pgjC=jIeuCQbRN{^|1vHHBD4dCXGXe2Ee%F&5 zZIzm}v8tlhHLpJmE^;wd)#cScTRcE66M;a0!DcKq1x(~3g4h9cgjlG%q*W%9JkcCa zVsMB!W>7y6gYX-h3i~U)Ju?b{KDuj`1Y!A(^ghuy^ZI7ZIWM9VCyOzd75IN&puIWT zMcSf#*?s)EUpjv)VYMkyk=06vJ)ZkBtEkN$<(9}Emgn`joom0?*hqZQ{u{8ZHvWCH z%Z^Ak2P?wj=CQAB<^7(h^}^{O=w+cv)2jQT=TknnGO0|Y!WfX>o_N;2g#&Qm2(_YI?IASY}7q?&}9EJO0>! z{Mk`#KyOpPmxYe9v!fdPd6!N7w$t4OIrU=ey^rWyQP*jVkUeW8mx)dBq<2vv*|Txw zTo|~DiusBWG3P-FHgg*pM-?s^X{1t2lySr&MFFH` zpi0o1Gpi)3bP!@#eAvTbD^^s#)L&3e$GZH_+rxPz?3|)(Qzxgh1+46}#g!x89s#wI zb;Cdd#s46ef(g~C1Ux5u|E=HNY<7WRTIfv8jC>NIgp;}@`}rZEgHh3Dbt>K@ zH3nG)BXZ;R4ubIa>@=uX#+fsmNr;XwfBT3>h^<9#)_%oZKTU5?95edLM;ss|*pVDsg|>dQ77Tvt^OY3F~4xd`F48 z`)y}7kx9OVV7}-RNrg*pZOZ`-+%^1kEjNLoUuiL^ar;@i$L)AjPzL}kk%6~&dLA~( z%4)Zf2dH7^(Yf18@xsbRZ>8Z$na5{a?LZ)9RO+0><4WIEz;ZjJ)HG&ar{-<0>@72T z=n=e52q62c$2OSt6W|c?x%MC=g~+iA$wM_k8L*hxtm>X>D?*!4wY@r5#z~J3n$%%t z2@;b78+q)Au^DY>kWeuWo>Cnz8wT-^i0KZ)t%@KAJmazFBwIo^7yxUHz6s@<%OW~lP@_7waYD{;qO|5IoGr&k^S~Cm&+a{0fit! zq-Krg>FCLNqy*HY`FtesFi?~~9K*nxTSf(ig|jY*V0UI-EJP!^&>^svRxJlhh4isT zjSA~i@h-gq_ivgxb@JeWS3@^TW@R}LiqL;5_d7bgS9QEAg$%>7RCmjSRRR0Y9>cYS zzi1WZaZ7rF3RB-pJ)f_yQIG4+-ph4c^s9dBdBMg;z^i+9GfAL6-)DKHNwuuRq5zKz zgvJbcbu$?Rq6f&Y`|S4_oT&%&OVMXBBpXdf+87)GwitUaH2{JHl1PSZ!C-n23_dP7 zF%Bm|aZw68jYJRv$W$>nhOdsvmWnxMEmGoKH)SY;S>E=#rfm98DmR-JHM}fbB>JkL zZ2)hHD=z~eJGiEgV5P;4D5Flls9Nqyq&51c;)6uQN4=!hK7I>puO=$|X`ASpP_KLJE=+Gf)FQSV0SfoZ&}9z0 zWT~F+u&a%$)Oj42p5R6Tyf`|suc{rYL5jk{0C?*V!oMfdaM*4#fLTx+vy3X0-rV~J z%adV|+Pw6{=;)dvq_#Zslj=l8ifxwJOy15rF|y3_aT5$FO22>pP7B2!SaI)$T=`c& z>FKP;V)A$&jU764nsjlXP}OCeauA1o=!v6rQkRB#=W$LnR9yT63JfA26jg_VQIMbm zN8(JdyV>JNu2tBl9kr^lq|i9db}?meWyadZz#%(^B*$kj<$rQQVzLVb91d5avLUFb zu%^)6%X{rb*-!C#BDIp2YIM-CtqdNws0FV+K|h8$8&(8JCr~Y!it6&nyr7(Nx9H+< zoN862MsG(o%+q_t>TpC0vMY=QF+@(so2S`-(1yB~SMF!yvhQ$t} zjNd9+8wid_Ne9iXdE3^BV&RB|x^F#&>(IaMizYKDn+|jl_1=4|#gp ze$Lq_CP?3C$y@isivIO0eFXy+E<#0qmtP`?>~AaR@9Z!aLD(3DV|KEcw(ejf?Rw^U z1$*^p9VN;twXJhSTi+FoaFDd?c7RQixv4moC@-BNG^mnJ5Ian@Ms??y*|asMbMn1U z!#j^SQ0=x*9sm@BA(u59gkcpm5or)nVFSkaWMu`nAtk^dqIO-uia542yOi)Y!0*2! zUr?0xF%&l`%T{ZBOoPey4W$o4D9RLWx*aFAYR9AO8|Cp7_Nut~&-s5Y%Z$P0wx_|a zl+t;G%Py@i{Z{RlQXcg@!2#xQB{J43O9`@b=XYb$M+N2}aPLZ}y~n_<6=K5Mm!sujY{d z_>8!*vI*Hgz>NLriO3$)f-nkR5KBuQ=etQAKCy7m9b2X}oQJuJ``OA(x+8kzwCiGvPUI7|pEm|auKtJIT@dwvjJ$dxX;ChnkFBHl5>}-$ zSh2ZVPQ2)-vOOV^q25O~j1n6sP7<8_`H}gEr9sy2J41sb*O$4|{qCF!L^y>>RlGg4 zJCfelas84eB9NP5*{lb%p{SBvcpY={h0r&D(u~KB=S#mTBkC2kdu2E(OD_^VQCJ!3 z{%t6~k(pX6Oj)Q3`>TUGH)>D|_gOvUt_lHG$9cfTe;|<>XA-moBG6JN(Di}SlJ*Oh z;(|RWM1Dy?TZ|vcW&a#Rw9C&_T^6=9Rw8v2@6k6kL8zmEHzg-5M-ds6>!sK~yh4eN^N&M3}PmR z&O}4HN@OvBV~_+)vhly)ibGurlXUuqu1$OcarYGg(9+XcM|}J@v0etj9tg-_cX7JfNXpil|Fh*h zgcy}1HbqOx%elT)dcULk@`)eI9>PZ1vcLIVPJS(&NYb0EPpH{A?@e2AmP*c9$H-a6 zra8eRrp>!Q&atEsip;ve1yCMu^df}pKu(rcA7s@HcUHl8rZT~xAQIScDe>V%5AfmU z!Z68}o$xsnKm*$0rvg*#U^t4P23w6@|AsF5M9rU=6cHTnQH&&8Q4Y>dx7>(=F_vLR zO&-?FvU&lAR1-a4Iz%!$&6tKD(}fJhPG#HD67xF2!cKNXcMQO_22{H^$jnt--=g8W zE^rAYro~UQs!E}h?pJznH4%9ubeVzXpbB{ttd0bL8mieF4H>Cf$vmbe9JW5T?&E5$g0+l3Dc|HK+}$kyEb6uP)y(d{i(nY=zP zYstMPq?XKfL-WcT5_*12P+=236?J!IpA=44k0;|>66X{zOfZMJhV zhyRWL-QujIZmgV7WI5H`e}LjRWEssY-y0!3(!>>wLy*ijLWuV0fEYWs;y9E}^6Ll0 zwHaPS(Nd&f=|~*P_#OqwCWvX7oD@s8}?Ua?+dU0?q{a#Q`j%^O1!;ApS`m?R20@r$1 zw)n~|79{RcFFR?EV~$1Se`)Xt$&gFJ?ex7MVA5B4wz)FZdVvtcBEeZrY3T_$#kmr~ z_U~QJ`Rl8{C%sPZ-aov)3TUFhO1!bv0N7&Dzz9r8!DV{kv?BUtK1HLEI7fwGVrDc{ zj)63;Zqn5!f=Hh^V=b`MD&aQD^r8uK5 zj^aBNBUC(29fP2CxV)v6x*p zG39$7EllXmBV#OF*1anDZiD3!NINAOyF)E=_1O#}K!ZYp z4Her=$W(yCxtWvkZh&g|Ck!K)5RK~#K*dw561fb){Xdnvjf5kS`X7~Zkdp1OxcZ_2 z)@8Wr_8ut5wWLoGHD2V!+t9RjFwdmNDp-!74TWsjlwMBRyAztm{~Y#Zuos8*_sYut zKLEx+Ilr3|PMOzca}*LYQ|UU4#PGINo`a};hl|;k5f)&SQ3(lT-b~WK36LsvPe`#J zn(xizbt(u7nMs8pSg>?tcvxYuiV#;AVQLxvH=Ir<7+?~S2BrgnAmB|$0l)&rOkfZi zgmBWnPxc;&t?M(Id{-o~ti!R0)IB*}p8z=qj%{5dIfyfJ>i!_#pR_E^DgRmgY2cPZz!~H~9z(Ue zP{HG1Xv44~FiCMXr%~nhuQx>jz;KJzGu>$?qf(pG9-*xhAR!7%Itl3P9wX@_JWPob zcTH@yHEK?qF(3%(ng}~Q(V`qPfBq2LOw3=Kyh^o01~|il(qO%cqzY_mAw*} zyb;QIMJ;(m<;<*VI7&cnQ8z#mIzouL8MB3}7lBw~{NS}%t~I5&Q|@o=OpBB&mSScBTWXg>wFvrfRT)Y-yni%!Ehygp4pQvGtuJ1AmNSBpNYE=KtKjuKK2u} z>1;rNO(r4$_+m`a&wtKQia-G{vY7R)wxtyVLe2(^j%b9XvXV9b`?6&EfCdbC$P>C8 za&iZ$t!1N*6?Hu;PC$G?!j&fVgFT=ayQu@lH&?>4-*Rf1eSySzv+&4!!~s8;-bCIA8!!TpD6ALbeAk&74O$FiA7O03^sxcbU+8BXcxw)ZDYP zP?+`XsVC+0l(Q21RUyF`@MtL(cT5@~A`anoRi%=)wFR}OZT^7Ev`Y)d=aWr32&G{5 zn%?4z<^4spL)^{Zt*QA-LUj7t_A|?=@lP8*latNSe)|b?MtxDf#P}m1eIq6`-UhHHP z&{L~Z(GdX+uTMd5>thquS#L!YZuQwRg(q`lO;cRT2P&ar5bIc|Dri)hb%9g@OckAB zMO19i1YDR-&+q?00No&I4%*dD#83qumjEsrVYlXRP;mmOgu$s2wwbI(7lX+adagz& zrG1prUzb#t^9xzwe)2~X3SWZ6L+!n#1Xy-<)2XErSRt;!6!+#kufopxo;3F>-E}Hq zR?Zye98iS_%iXrCs2TuVXrvHPj>G#Ojk|o|=dTn#BFUJDUfwSuijJuFjhCeoqpas~ z?V{J}dO!AUwEK1d!~h`yxYbm-fx?qG1;+xyq|i+S#RH>F2f!d^TA=^?vPAj-1qe>c z8;u^In5bD=Z4l5CWg{_7wH^wKD&*&Va;9hTNn`oi!UI@PhGS(i`+ z;Er8mGN;XcTRzKt`I{TLnUjpyRWT9vuji@txys+_^SMserm%i;H40i%Y$zpX>~AZq z0E&PB25EsKJ8J-w2Nnp6AWRYt1u&?yGdM7@Hx(M|w;5&k>M+tB*dC+P{zOvXeo0UU~#^T71fIZqIV4Ztm*!*+fto$TCV=+}^Ny4{pD@y0pwz zc?$rrqn~_U{$eiw(^SaI6y}OoDF=gm7Fn!#Obl~DcU!pGib}FH#cluA=%FmlX`(NTanWY7F+8GZBqU)rRn)l+^F`mwe=` zP@N0=N)87o4Yt7L%(3`?)Otk}zU>*5Wy3aiL2k@u#o|utKIo)<+*kqyy6ly1tO^jF z(<60t<@fw&T;9uF|3036WD&^H+?d0L zpdf*8sQA!%Q{)0v*TLvE9kd)-TOIAe^x0VM?+|?C03AFh}=~*H8U(jTx}@-XR7)@*%g&7w+qi`7MN6Tw%HlUYBiArsz;t`DrF732@N^G3urM5!|T0md~KMV^-rP&yP7hE2=pn6Gc zJCyC{ZwqyEv1=SKi30`+jG@UWjFo!JgwPB-8L0{pAvT&j<28Z0)W;uE4&eB>n(bP4 z8-Y#MmiA7KX%~!a4-~*bC6J@Myw_1-_&wW!k_@46)txk_Pr8!;7!v@sOIiU zBDc9$f0nt8Fu;Of*QnG%0(Kn+M!;OxX6iT%#RzgRib)u``Zfj+czgGzV3BK*haq-OeKExZd&Jd`~N*jUnk#g z{s07o1VG6j3^W+UK}|?B%m7TpD9m9%V4uI3X`cS>p$M?q^&?##9hkv&O0tZoc-Etc(N zqLb=$Eb3(>nS=Tag4eo7grHziOK271;rVbY*ccuz6=g1LQrNoDVy)yo|KqaofC$O3 zGf#bEq(xIy#EC~xQ-R;6F#)g-9a82<#GUH1jJ>e8NUaStwvL)=rOMdL_n&p1IxG-= zuFMt*LtBwDh;AhDTz}!0Ci%pfZAqrcq0>&?-7F#tS64x6zeH6qi&z@R;~r)6sP0EY z2vZg!9XB8`kt>~fA^&re*W4_00)PPu+XJ-z+iBqH1w*A+K|zcofddM|D;bI_r~17A z`?5sl00gl}%u`J_5|&5#N^H>35HSTatu%UqCL88;r?s&&Jn1l^Hos1@!fw@{O%LAq zzPKHa2y_jEbx-4@*HSMk9iJwA6cnTxmbWXZPbvzUpIS>(FxChwCDiq@+Gu8VY;?@b z#nUx5tdX&IqZ4?a*;L_mI<#kmyx-R0bNlT5_j~n@4*ToCenbiZKs42oQldB*NGucr zWJNP1yEQXoeGRmg>}^Grh7$0z2{ZXAcV!mp%WTo-L0ZL%lI(EKfMlR}BeK8{5fDV( z)?mx2Xd+Pbx8+8idYY?Fmqm={fQTV%ZFHf4+#cO)T2(sVMs)gUAfr}1YNHwpIGvr; z%b|DPfto^KV`vo=I%t{j+lPRjlX)Zr52^5@kKS-2Hk04o{RTitKyOljiN=!5G>FrJ z%uH<2vCdq$kx$&zs*<#!{w6N^> z0vH^msX{6$G`5yL;7M-@h2CH$A!FV-B)7R~D*!RXl1Io^d_gfDeJ6~B21=2v7(;sM2{GN=5$#z9-3qNSiah~&Ve*AWiuUuza%|?(};~!Ms@r+;I!NQ0-P!FL6 zNXQM{??F$dLh)uXjAY?JF-&c%Lr`}zrKN9D+(zuxID7wQ*OGbz1NH$hgYz^$0s#sE z8lnIDvPAKSgxW&NyJl{Xpyyc@ZR5rg@ee5Nym-QGAmmxN4^RP`PaQcK(1a_IpcHLF zN>DFov+-_3qi}RQ{?Sv!A^Vca%aW?tV^&=Jg~P{9vP6NBp@*POG3ul z3n)@3J?#cw&;NC9N8X!7OgwT5fR|tZBXNPGd;PN4GO$ooO-W(QfD+~$6X2k-!))U^ zR}3Zh2~`c~h(qJ;nUXAj>3#SijuWu16(l~0p(8h5vR*4An+n|6`x>B{$$iyC-Bx!} zDP!7v~_{-Y)nm%@)Juk;zpapMHxFH^ixG0X$t5o?KlV1CDx{HyVe-<#{XrP1>4*w zXB0)eHvd!W9hza```vfK`|DSopB?JT{Wo;R+FzbBSU3emSsVg~5dcwzf~#490vR0v zs27Ql7PufaN|m)!H3pk3ejt~|o^JHMV;k_#CMox8AE&=1AvIDp;2@!b5nq%u6#56V>WkXs^G-kXJ;CvB$9ZjrRorcnJtB;oS4{Co1VTY z=y154u$Wv-E(2jKSkuLr7y(9z>3SNXdWzgE)8GB+mRJx15TlL(3jq)!AS%QMj+%Z) zkl4LcZvXqRMB#u0COyq-PipduDmjg5rqmO80Vr+2+(LjTq@Ab_PzVa9Nm7u>Lf2^= ziI(dB%+hX2s*xU0NonWtxo;`4#HlxC8Uzd|1x)BR7e{S{q*G7Gt60S|0^%-iUQz03 zCK$nYYar7gffmIxyPM0*h3*(QflLMhM{^pH|4 zsdkNFCwGUYF)q2 zeemCA7x5&0D(EWoP@W7=n?lQM6$K z#m&AzY~9ZzMFSpKIVzEC%*w<6|6N1?Aq|i;Z)`rq1nx0>*pd(rhFr|2=P|9}A%zp8 z$<@ENcGR$GM#GqFnvTK=24aEYStZ!_T1F|U(n({3-IsZgujg^Im?e3yH%Ik`? zkGV0pYPg$i2h;UUE3NkXQqafZI!dYPb&hFfsw1|$zx(bT<*L4#{y6JLSgU`QPG;Ke zTQ(sqP+`jd`?6%>hy>$EO4Dy1FjxgitzgYq8lB-54($=izoDh|hL2EI5^2GJ03+f+ zWYyGa8*E9$!(#-m01+Etb)5`dl-9hFiLXZdP~N#oUiEDIuI2pae>9bI^>q&N-EDI` za*QF2>EiTAHBR;2btbh5s+`qzQBGzW*57~JL`sUG0SDgcuW5y~1xTn;3U!Y=1y+qr zD|2*J2nts0VbH;lM#lk1nLLy;CPi3N&g8|Xa zd%Kk(xl}z1a2#2OL1E-nuFenvfXqF4y=!JeSUFswcv{S2!s&E&DHw^;w{BXjCkS<2 z!nC-%z;4T@k*|6(-(w_>&M{op*2Vrl^CUg*dH>fn@HMSt&4}RHaG~M?lOaHnEc+fB zP=!~zi_o8(W0AGDJaBVK7@PzRgc@iV3`76{HUQ2oZS>J_Qf`5Uh?bnh-P=Evg3V9}taMaiD;f7Ts%}jmc;Sv_!^p=)~t?mXX zL^9Q_CO0Xt5uqx^k2wy^`T5yb@@xIpE^zTOgBXw^FF^8aO*}}+qz7dVm36!GA$J0< zHafHb1VkAgH*Wv?vSjT51&KUIlbU*PZ^vnkVe4KNH6tNSyx76D9VRu0sd$>W!wbQ< zefUstlR$B3d7AK*=#z$yRf}(&%>vWJt~0;zG7W0rWG#4WldR}dLyx5z9%8x9KRpJ`m4ROAaH=YfQpGkkPX5eU2nknoE^jeG zc-%wdHw%oYZ7^Q|$xYKR1BMBq!P6NA#3&OSfyaYJ3IilUq+!ZpTt2b z4n6$Jz2wU?&;CNW`SFTp`RAwE2&q8lV*U<|DGA`gugC(g00jUYnJpTK%_?{G<{V&L zs;M4ZuzR;J{L~v+R4ZSBTSUAWez`@ z_2yzSDW^+DJ7OD{G;!d8i^WEnfuvYt!3F|&6IGI^tjh;u(m67lHHXR_how*i2>YjF z=;gp&azlfSgn{EGbQwe2-xQ#H6ckzQMZhE+up6OZEC+T_q)Uzt2uXh>j>zHu-r)&sjNQum-qhl=-dB~ z&42u_|8xJJ4%F}#h5!4qWb}*%KXAtrj~+sAN9lTDqmCA=`5sPb>B-t3rS*rkc!Y#n zc9;+nNEtV5m7AOtRVc_payXcPgvZ1Th{Q)OLM~+RX6Sq!LIEET34(+b>I5if+=73|HSb*5J7$2yL^R)$|#mTDZosDrb^ICfv$f=S$_);h91$j+YZ> zx1hE8v9YK9hf89Una(UP|9Rk^O0&%FySnUYU;rQhjk##~wAfxLmX3?~9YSy{R4qC0)P<^0cxwXJ47z62YwxnwfIB^?!0iE*$lCjQNRyLA>~ZjgKiK+ zD;KU1-3e>h4oOGRU^U(Ax!E1ZeOLFEo3p|4{q$d0*St*|2Gwg{tbJ2oc<&kRLm2ZW zAQ*$AP_t&1d(%bP6`HEK3ac`_%&3y*1qqU)3z~|65U|YObJ+g334nEaFZC zfr?GBxkA>#%}DYbf(Tmj|NF9J>WGC*V@XqQ9x!NSxoTi9gjPZ498Nq~!MPPBDS@j% z@E59gap~PpU$IO-+mDbCaEtXC?&79=~XHO9@mzj`g( ztE2Ctzq2zHZAI_)S~4jp^n(=uAOOrxfuomMsDz>#UQp3dEPSNy>!{?x5ahMvI-b_t zb_kiB%^M`_dHTljkfVd>Ih;F^VQz}aV!M3yACFDTN=o}QT1sJoy{?6lB8Emz%DcQVn7QB21G^%rB*cU7l&Q;Q`cHP;{X3h5Sb)R*vJqJkX*sDLj%kK zIK-I_B(&Pt03@T#gTa8If#mYr7ZC~U-C>~$d6UbN7%x3LV(F1k@RA?`Y#1_=LxH3{(Fa((qe9V?WLTsM zQ}j%R|_*Pa9BFjLR&K;3gOC& z{Fp3ZX!i3;W^CdeXcwXUTPw68v^6RnaKt*xqdZ=WqEMYe4wF$9m1~je%f?*8qcrjD z9`UjXmf%KLuSzVy8@_D=#KH-?%_;JPry1U$4@jJ8{wA}T*7 zBrw0sfW&zo5Zp|}^!!D_G7pDlT&zl1JC5Nr@up;r6~gi5u}njG|>P_fYL;5V1S8(K-NejW=G)=a6Li@ zggRZNhY?bcoGgp#eE=%NPB5&_^LnHx=i5HnHRp3PQ8~8H&#j`ZdS2RXSJ72+N#0t2 zJMhzRq^MquJ4wqkE9daOfBt>`{$9LW^QF)KlP9TcS0b%cDYqSPpaf0JXGtMw;D|a^ zz!nGyt|X6jNruxFC7w+JPhU+-?TX_#&%je-I1{Lub3zt%XV7&#Sm`Z(jVXjMvNJmF zX;3&?@APEzjh~!8V6E$%3>*@Mgutn4p~S$Y#K=T*I27Z=0@^G7!GXF>;Pku9z2c6cJ zNoi;#aYX|w7H*HA1XySyA1-02Fb?CC^z5cV)gC0bq<0%k%Jw^B=kZB4SR>vXZR<^e zn`&C?x!DTFYYH9HHA&{Xl8r=Z_Vz?9+G?(CHDjW52|$S;ibW*G9R`^ub*rXd3>{Jm zUSOc}J=+-9BEpMU3>4y3S^N?qy7*&assH=3WbX_Gq<6=YY#u^x#<^!aXV4X`3nXp5 zc!9tlB+Z477zd#C$-RAvNI+~yV z*VJ&b2pg7UWu*kc<}A8wnjwQGk&=6;$D8j54yJ(s zDhLIHl;B@;3UL}tz@GeV>VSk5*EpDdY-oMTRhM?xfjN+Rz)OEI^4nFA=a!yk7c z?UPVODdZb+Y}S`Y$QrQs(g6e^NI1iB8!f1lfVW3mNE^>)k?fG~OSey0o0`KOiu_iy z>sO(kGvPvx&rQI*7uoP7Tr$%z&Y;!I*p;+!V6jmtSWKo4q5J&rA1N~~mFD;|&C%>e zfo?&?UG%Zv% zBTYPb!Q~xgwTF&5!E4~TCL)B$o0Ji%O4cjU*P2VE6=;d8S52&us>uR3AZQ=8mAX7Q z%|5}lNf{tN--ms_gDM%TNA>5{J+tPfwUVfZ`K_E^*E;sLNRXj0_92{&MAKi!qetDK ziKA3Fd4}5`R$&=uo7hoxNAR2N5H)7 zkrOKL{9{dA)vQJsBBF;4#nLVP`Vn4~0u+E68sD~=GRgR9J)2Y}CW$gprL(?4UdEi> z(~cHxyic8ce2;wm8y5CqciQb6ZOyRlj9%K@irxEs?F;m^b^X3h;wqP#Yx?Hc^`L)|oaK zAdVO)FeJiXYTRJ70FZG-#u^~xCdidaEUah45$fKcjIg1dSU=!D%lJ?T3`kYH@a;EL z2rA+W<$F5|$m}qrg7vQ|VKM50*GFSIt&C#3>M<3aT*&4{p4Mtk&(+9EcSa=|#OBD~ z^|BdTyR@rSM(9KlEy{w0AxRJyI~0SA2%+}?0>~u)`?6&73*>oEheGwE$K%#)oT?<^- zI31}9+m??*<4(F&HKnDduQ+ikB|h1;!)f(c`h3L7VcpSJR_613wNb?e5C>3rOaL0E zAz+jMDA@ZrTjtP4j=fWN(DbZb;VW>PrbfnK?}nxneaYrC+-w?Wev)%;2Dp+a7Gpu? zR3wODK=kb(2QKLmD=ApOpeS~VTB%nH_UcAn{NPu)oj;G_s0ywoB)#7eC#k*0fWhHX z=+nyR%bT{#*3z_Ht+p1K4WHNL$Gp{vIEoVbx3LIqeC4{M1 za`SFMtaLqRuIcA&RYh@Ybq~;jfWTp97FET?Ml^Ti%GC|8>qdM822(l)Gs+q;pOL5X z60>VPGh}lD6FCCxf`TS06rXQX?p>vR*>EDu<^6?+syuNDM(j zaa15(*67S)uc#30UA4OMYk0dobsqb6N8y66ZEq4Tn^Bmb{AzkdwZ5TVTh`f)t>YWV z&1Jb~f&!-pG9I5hoj8O8H_hg@dQi%id7XV)+!l5JYvSz!B}yK3WiY%i#J4K1P?ICESN4B77+kciFTt4A%MP-sh5TclDE-`*>iso zhx-iLn~JCzSX#U=Dkyd<4@IDvIe0K^EH1T2&d}qwE!Ar@{CYH~G%viaAB${p3?Ys+ zUb`Cy{g_$7V>ZcbCs2VQVE#H)SZ2qvXoH(Zg-nl%uwBN5#srN7arSJkyAt6)sn*cM zIGSPsVhRICt)s39cr3+e6;uE_fXWkMl8H&o+_;YF1WRIjdH?&eWb2HDN;$`qd3thX zhWS@v=Ux>R6(DXfc)`vcr5y7wNaxlwA0OvAp&B(k3G;^BkK`#=mPjxTgh@~ww8G-- z1ldbKpdNeg{o{f2YCCVym2cOm`|Gw~#jZ-Z%2OUxa zLTH#s0*mRE5C+H*5p}3jtm7?4Oy#P&VZmu4BXJI0Nx4Cafs-OW3U=i*2J&IQejhje zxn>d}(V{rGh6@!33yyIpxQIM-h~=IkLINfat|s9%Y8#m{G1};Tp|NQFMewzA+uUEo zPuKHReXLfj{eSKC#q<65*UwM?OT~ZjQPm~O&E1Sig=mPY6=JK;Fo!Ji%^ECGf#9TI z04@efHpR$c)>F9<$(i#)Ox1y6aLR7ggxh|*-t$by`B%f#OjcX^IhK>;nXLFk-8|sk zhUR8h<3>i;>LOKBB?u4kQ>TGqhmRdIdMUHay>$IoFw~1t{Ek43A10SLX)`4n&7~K# zUNKDn|Nr~;gfHw8lR;r&&g*7AC7ZBtW)bk$L=t;3XaLZNa~=dv#v`5>I531D@Hc7p zTdUEy#Fe4aTCVH23_Edkoc+G8!}m1+jzd!Sm1UM4y>P;vOQu?eFibyM)Dq~62Am+Q zxa$?%9zh(jVL{`rXmFZ8j{AncLaNqEtDFASq9DyClckxp+IXv;`^tKdRqYoSYm`{s z4Sz~h(;ma-lMy#Rtcij^*mw{O2Lx$9+FX65>Q^r%Dmnsy7HMdb|NF9J{fvfjdc_mF zLhx}1iE3f!Uljo(98PHq!M7TvsfI0hdC@X3IE&!Yt?tsDMYs9;?z6w3`K-vL`70cf zX&%gexrFB_*Umtjs@7%9)=_3_&4=G7gBZiOx zi!fp%3TPykxBK-e?jud#@P#20aK@H_oeHKJo1BT-U}Tx7sHSB*8=V$s&{>HEMi2o4 zhb9*UqH}mG5T`^WJ_rEEo@NHRqi!1we&zAjLe}B;YF{Ck3IYj=&DD1Zh>Bed!|M^| zy%2+)_l_3#s6xCCs)3i$9XjG_#0-y-GU_GHYdZprnPRf`&wTE=@KUT@3nTud&Qbrh zp3qFr)Z)IWODJS-47(3`o_xv~KMdDD`~Tka^8ftHx954GaI++jSm=QN`?6&Ej0PQf z#S4ipvV6#CT4AY_7j@$pPB41OvY=&MhN2v$GbN^!fU<$WRNH9QQ>VII(qUu;Un%xh zb>Uy`?1K$uYO%NV*KnGmn=-dWr%R>rDC`Xn zM4Y(bhyY%n&*^=LW^<&Fgr4sW!R#GCAs!APL z&O-?l;)+Icf*gcp1P#U#0RX@Ns#zks)Rt{J=u;A;!w!cwc$TpAW^!3-ym<+5kDZh17(=86H|@7(KGPJ`PtlD#=qhl2w=@ka~AyIK50N{@=b|q8mGN2 zYX;os9a|DFtt`2J{XV1$|D}Gqh6h&L8^U0Sf|Z$~VO*eP!oH4q(`ZP+j4^V7f>%b`%w3ak* z)pZ31aqKeY4=gCVYF}A|sY@<2D5v_urPM*>oaD_L0{{SyoR$e(RiX9+ShxTCvSjUu z1;Ken6O0xzZ6)bFVXKA|`12s`FnWQRmn7)%n@9pwEnrRndZ#zjX%xGjXz~R;Yj5#S z_rF_fV?hP3RPV8uqlrTqX;|dca&*ogn5(lX2tSf$l2FZP?#ppdtDMscX!EW`a5M_) zR(^+p6Hc$O|NsC0rSml+6lg3cG`Lh4kvF>d-`1lX?Tt|$HDRoQ4|@d#cv#>sfJjeUlur~dCKY= zc$rz8nqO;6?dpcBBS@C}{lConYxAKUNH|#;U65o%#}RS0i47XExdg)$a1K2~;GxB4 z6gYsvz{mqfft{AuxYJose5Nlu_Z3k%&P7b(x;jM?qDYP+n?7fJ5BWLDGQ9 zk^$xzLL&k@1p+7mds}(OdVXA(EltO8X`!i8^GNAbeyHdvKqi&tZHE{g2^C8sa92#R znKw8xTP&Lohy{ZD94^7mB^q(C3tq;nMavS$qU|lc6=@RX3qi)IQ1Cut#?8b}$3N?{ z^*22I&GB)faN6*f{e9bY{~y16{PFcatxp!*4sMds-hZo+g%Y;Ku_6%lQ532;VE_BF zWcv&TGkHV{i7v8vCaF4M=w26L=M+w53(3P4<@EL;yfqRMK6b#aKIK16BzZec5WkE_ zi*aNSa0x&k4{>Tej;*57N)afoviXoZNvg!wt5d-76EH5Mt|qjJgqv%e-n4}`)-^|Z z-24bx4y@g95(QOwvFHv6hl8p~P;y{8=gFufeMKK>_pK&sCdcE4$9})rRMOQ56-TH- z4lz(b#M85UFU;tJF?uvmz-W+3po69a6r{O=E@x6QK)`R?R}46zEm{e*qkDZQ;h1%| zmCGM&UpL*j&xmA?DSP7v4PelVkcEVa!xdmTL_!#P&L9{SEkqL>7Y9U{4#BdsUpE-< z0k~EuQBoB7=A9$aCSg;XZ+YS`zW(lSj{k)3|Ltx*E~$U2uKVNv{yOh}sj2yh>A$;o zFPE6E^kjjmHqwYRgAaooX@f}+Mvt8U0yoMZlSv+1G+?A+H5`Q5g_Z((Y%H%Uj>hAK z?jHD1>4<+?|9Q(etgeyh8R&pLiuB|NenchE#5*3bJd5X0qmdZe~UVVK}A(0A^<6TELLw zE*dbw15Xql8hg|k2`ph($)EOekIUU#DB6;nQ^lFwLFIQ~1p;hf#uYbM%k02TMu%R9 zb>f2MNb=bkJ&D*@u^5+EjGl@!gs-nyh2+j#NO`uO=rn$(QOi5mZs%9XqvHy-E1|b4 zq7cM)YN8Z`d&sS`rEO9-oQjXXLQ3y7%d+8bjMB{PBXU&cUPe)J8AQlrF!5GH z|NF3H?2HAzdBqc&Lh@+EnSDJb!587_5>2qWfx4O`sfU?(Ah^4NFi_(F1W4{%V)%eK z!Dy#jj)%H?oVUYAT`LwW)5ME?@5J7q=Nrv$h*cnIt< zqzdlZ$&(BSumHxT1#UAD2m^vZsL)g(h$XKY6015@UlGjCIT zI9ypoyJT=sqv%SN@Uqg4C(qm!>G#o}&lS#Rk8M$7#_8sQR`)w#!pDob%*~f*r?TS; zO-{%c{37jFMV7ITHr6N(aN|jvG)EnjOObUG*C>OK!!H&!~DS=$A+UlmK$% zjO5uHvn*&zz&KSccG%-6T?k3yoXPI_>awqO6FSx>-uJKV5~1G@U6n1SU#rN9HqCSbK{irZanvpN3HqfKe{QBubytz|+5 z0zg?K0fCHDAu~HH*XQ#x9*qWl8d{oIU|_K@$Vf1RV<2j}4ht|M-K3ikE(=m_0uWn2 zYA>peFn7&cUxx+Vew?(+ehdH%A~!JC*ucWUp>wMIKydrNI{Gmd%-+1Tmn2eItgX>b zz0)*EASg8jN`@3@)({At%5`zjCZ6_*>O7~%@UV45Qw5gcGciC6k&^ zg&Y6-vSjQ41jReaQ%^H+Yo%ElVdGvH+3OHa6`euCo@F%l8w8*gp)(mMS;~r?{EUz? z%!butH2Tlq{~7weiWBbm9?!CUg6hDb?k2Vhmq=9Aq7_WrIwjx3XRWplmu0@($Fr%P zrxNm$)-VMb;lhq6A7&Xrnyw=Gj9{k;_t5p7zdzTZUs+11@MTVmekAvR@4y@k}@2AAEM za9uUiKBS_+%R&MIB6UF!`!ar@0|QGN_FEasaTK0lWjUP2nQx>DO{5eys!J7RJ$2iR zOhU)C<)2Wnh6>&C+)}MYQNPZX^Slemyj|d_?Rpv zG%1%d7fGPGIm;#RE%}(VJM}GFkm2;VriI1q26P^UVD^Gwq65(HiLiCbbCH?(^Q$T= zkcjzJwc|HW9ar902EkMQHX#6A_tAc z2QS6=a}qIN1ZhNL1z`2ZYMu-z8+ydwO2f{zpKq#f7q1h8%jBbbve}U(niot6&IjpC zyy>YFY`k~Hd~X%va>MuLX+dC#yV(bA4FgVfzuUY2|NftKr#eQoP@~KiEDRxv234a6Nxg=R4aGownNvN73RE?%U*dhMateOcM|@BVdrceN>c!8tN|Gcigr zky%9g^%>K5skF%sqHPT^LRsPseq{?0ZW8E8!p`ZfTHfa? z_ZN@Q)o(xE%*{T`i?i!cG#FxfQ&B1~W=eBew|>0+dwT~z`D9^+ z8ueg9AfO3y!3Th|SZOd6(gb0Umto*=-`deDT%@llpvo)twO1xaOa~sfjC%%3>tA-> zhE{=I6;R7a$bVs*V5$ugY9V;pmw%y@AFsR0ENF%LD`KE+}Hb(A6ozG)~} zRfg0iy~x2#|NF9J@Bjtmdc%`~Prz;F*7f_KbC(JT=28&J9Rx-{&%j~lf6bwp44h|Wx zJ}f2$FHCF)2m^zF0KgG;RG|zDzJO#~X-j=;Q8f5N^DzfLkW`x)Okx8SD~k_Z_J}f8 zXpvVL?2a<$D;RSKt2dgtNl#5*DE}ie-U!y=D3Z~fP+JojB2h6S)L5xIlIBiCzjqN< z(|!6+aNJ(AJna`Nto&CKUDQ3Uks9rBJ^jVcT3yYpLsM(f(9lr&S&1gZ0b3ro3y}|J zvm?aD&znBleNp2_LF6bAlNc~63lIZQf&c_NJ=+pHlEAQ13=ch$EfrfDlH1O;r%I(- z?OoSb)7#di3sM9r0)huHQ~@Co6%i#6dT0ScXi7(=9t4%5pw!Rw9q`EC?LIe z2m}by6rvOnMT&sockw)YV|;(Zz3X8=uQA8md#tthntS5^rm!|Yd#kfRXHEX%8c^36 z&gQP(GK8#F81Oktbf6}TrVvc%k)V+4lVe->5aWWQ+l`vNw9A1xtI4%P38pD0z1H#K zD!sLp{%l??pRm>F<|+Q>R0&~8EifR?^y8{ip}h6W3|1{3if^o*CyKsk8-rJJ z&%1}p1TNM)Y<80Oksda_kZ8dx3nD05%S19~!W_YU*uEfdoF#2Lq7N&0{y}7;L&N>i zXH&lr7dF-2nU_ts$_>9)MJNp-_PW4zU)PKD$s2alvPD5B2^|5z2Y{S)Z91#sB_y9Z zPV6ZgiI6Dgc>My#3M;#zhY{y(VsrA3x?-Eq_roh{Wd5uMR`^M+XxH!`%Kc_%^9$}s zh%-Y3C(o=qbxa~yY3D0d-t{jEg0Adjb2-ad>^UVkkdGF0HJR5P=YmhntUkdqKqLIR zg9TX>CH~8o{o7;$&go_)Q{V8jOEXpId0zhRD z_6e*l!|6vSh3TvTBO#q3!@NDUSyY~5Ia#D%g+Z&keF)AVz*MMZ{${Bp^A=|d#$WW% zsro(B++7;GUZeJ5Q znZ6n2`z+?360iB7R>M?u#8$}KQQ=|A&i3JRQ~Ld!x@e&m(CI>@ZXOs<6QRl` zfLl`H;wg$ihsEj{%=X;iy0a%8eF^O<3>#1TIF~ zZaW_MaVelUFxFlHSHlp-EwKhtDC*xKU6Yn4f= zu`!GloX%LZR>|xg3$!K2Z&Y#!@h{YT%TCMjn>HH{?RXrO>|&jnIr*s6uP9wLPiyzF z=1f(mMsakn9PS34rr#w3+=>P+`&4r&P4`x$Va}McWzi6U0Jwa5TGGNBL=_ zSO2oChhdqN_v@j{Ov{CcQ_M@=5&2HGVzp7rwM;V%+NY+p{!nf^k<}(dCtceN5n6qn zcvEj3xwdiI1g#0BzF!WC;b=J1Wv2sv`eIPmIFF#j<%|e_>ppC@FOqw8zWRO@eCU`X zW+Ld@!S>I|f7V!isP#9CV!cZVD5;miN&u}3AB)W-gv6gDLD`JoT3=XxDPc_ zDNq}~k4TENsc~>zH{`F3?fy648h-uzUb zc7bq7P+-O+B*Xf z;4X0?6T*Jc?Zfc>;}cx=fZdI~l0$0U#n+gfhH2TOtYJdUt@K8HW2ko|bN4z7eMXR- zhk@PQXk^GFvfYZs&W$B3P57RmR=x{d9ok#d{)N!rshrv?{T&o9HRnkDo;Bu;R7=V& ztjbyG*tjCo_w^2L@FTi+-SXk*P@QWPJ^?+5unI%U%N+;_*xCRbTkEsw(=xdaqi;H@}T$B@nmT{H8?e%G^{^yc`7 zH&4THuc33z&MV(bO1CtACB5rW3!Sz5?Vrv$(v_#S^{;VY%Zm55==SmZO zrTH$Cdk_4<@{xk6aiKls_u4J|%iQ-heXohFxAAUYuE!p@zZr$)g5rq_cVOsDY*>7s zo}_?(VtMdE1@bGQoBkA-o_M5VTl0&wO}f-6+v_Wo3kKKJ-^$NyFz+`g(?H|Su*G&D zK7KpfKD*>_fOD5%93`Wi&#AQYbbPfb8a0rwoA7eqSoS*W7hHUkI$i%Wqv*HQqE4gQ zIMpDFEg;5W^=o+O2r`1PxHNFX6^!5uZry5%?>KX8MtT({EDXP!nBTv+><8^+DVieC0nbXig?OR z8gk@4&2j`@=QW5#*vrv;EHS#}p6+6VoB#vbeS-f=KrLC_-fG3d#mYy$^p&xRZXeAO z(;3$edXXbZ+21Ha@Ev%^Oh@U4!jh1skFgeXY(y#(E&wdPLq6R8Me{D8qA9 zj{>KL1lNgFAc8vOg%p01H3`;NH>Y^(387d@UqVzRyGrX{%lbDc^c%=%aWJvJ6|sn5 zbO5=zA7C&T5s|-+6zgr>fdlunLB&=&-d>SZ1bijgy5poT%8<%gS$J+}W{M7q=rFTz zi%ZAo{o_I^mq}Z{9OOTTb(gCk8WI{~`7Iv(C87|`$Kg`KiB%3PSikx?69&_UNs69H zWba{a-zni9PIMy<5VFw3wELGiKKEmdDy%*RGC@IvdD19wZ0k)L1OTccX;2zC9#pIW z4%|qCig*!m+(~ACwEBtNQXy^V7*qfBGoIr&t4H`4Kj&#Bsr3&vk>QM_1Kfqd+rt$# zKtJAGt0U$#yRg2#?@KhTEUg%h16zUCct(WpEcce^B7Ow^Ef$%&iV$V~*!D;U{UO_I jtIm7Syq$|%`oz!G`x>)(J167w`2V9D@qh7Oh`@gUG#T!4 literal 0 HcmV?d00001 diff --git a/packages/pinball_audio/assets/sfx/bumper_b.mp3 b/packages/pinball_audio/assets/sfx/bumper_b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e409a018fc8b8dd0346c325d624455e9c5a30efe GIT binary patch literal 36406 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

*&< zSYRpo@X%=E_z`A1fsZ_zAu5k>j%5qP`xi&SC|A{IXeNwj)qhW-*zjDm1-lQ=zgSDRX)?(%tsf3Uo;Su@TIV zpo725R_%Vx2sTV&j&9Cn5iM6f31$oqhMM9edn8TE$(7IpazNW3VtR3hQYqPr9I+VU ze*UbfGqOc zByBdUjd48M##g+kX!!z_Q^o+P20ojuq;b2J;VEOej={GHTB6f&-Bo{%m(M^-#~{|$ zzBFPs!st5}3L4*Km$d~w_H07ctx^z;g?vX{UKJygQZhfvjh>UEAq6?L$gMmMZ!CHO zooG_Kyb^xWsS-S`QAq>OT=BmQ%`*TBpVRyWw^CcEYXY`Sb+M6X7Tf&X=Ll@xS^?N6 z>okn{Rq+|gDx3HWZ)vUXwIs@A0IcQE$8Fdjl961zEFSW(PZ2z^o<5n!ATX`u-RZ+Z z?J0HdA{?H40|jGRv^U;U4wXm!u+6(uC_kigXw#saE%;Py{C4}EGFn!&OR8c|fZ^um zBFAFzn-Y1GXXS*tu-92`eWEY2JypS(DElT-`)r#DSqG>YuMjUacB| zRmw9rk+Cs2fr_T4ZxeR%)-VbaCkGd!OMQjbpVq|MS_C|j(IcuW;^vOUab~?46=mRQ z=Yxk;=aAJaszjGvJBh5`%9^b)S$d)@12Zj1UVuJ5oZesW6ql4#bk7@h8fFNrU8q*I zl9zVrX1}K&{g#pjJQrU`$m`=g_iu)Ms>3Ih3OM0(&2Df;(0pU79$@@*Qibu5*?XMh z9p76$D!IaHvHuE#%q5_F`4`@WKg^V--B~ZWIHApp>QIZVIaL-CW#xNnTUqAMrbhc zeW=(rm;3hhq;rF_vn=>XJ2;m`A>9G+=}LNehM8?Rb=Qn^qCAlykj`K4S9}aRQhE^~ z2@-mVd)el@x0q<;SxjR@Qu)nYKKZK1I_IcfL};D{Y^HN>{`uZ6E_zp9-;(n*^l0|F z>Bg6VbQ+ZlVMbD|@4~<*#8&42DY@M!ltfc?bx-9~&%_|Ae|DA7fRk&!nq2m-ky$Vn z65tjngoyZc7$D-%XLt&m>lW!PQZdmPv#d7gCOkCGi#s+_hN^Trl#qF`b^XEl5c;$T z)e09!6bQP`O^<+*W1Jj7SjbNtNGDz+2-Ivh=27n|ytH zGtc;FF;|R>esc=e74R1??lr0L6E6u{sHI}_0Io^SOJ%2mnsvc63WzoAEv)2>LVi{e z+0zu!_w#jp>htpp&VvuSnpqe#T8%3}_fJ=^i!$-mzI8&d0*4~>L_}(KOuTOspVep0 zrj@Ujo-wz1*B2Eju#5!;cjM0Zgkf+0tswR4vy$iYi0#kC&R;g^&sZ~TRknlD`x38% zwwm7e%%$rWHCL%1gwY_OswZd-;=c)H`aW!JYZ9B1aH{MVQ7u*r6%Q_K4mPU1u5?NN zR5;t~GT*=)Y@Et-Ali7m(a?eV7|IRe;lWQ$J?0I)4v4nuF+wdnlpgbA{_xu9yPJuL zLFvA-NKMf1493#*Rjf;Gy;*V4I4{#v6rW_;8D#O>-%tocMgRcpMXj`bcmR0OVWVNw zNOQXHlsEuMfm>Vv1ulE#0HElTxji5zhM$<3%GIO(m@p9##bChx%_Sn;)<^ z8<@*7TOXIXwp8OalS$vz*Bm^=ff7$%=1D87)n{+zoJr!^6bOw00@eB z0OU7R_ECE?X|8RV;N-h8%l6B475n08;R^iZl9Kya zI9%)29ccNW9s+;yMFy~-0T_cv9kAjwkWslrqpw|2kTFPUMC_?@2R&3nPxi*ejjuS- z#$pl?4UL4z1IaH53d6`y=IEHdnVkAkf9er{*LE4Mp}9z;+|%howhWk}?QrGK-)byT z()2e%&-$PjMZMt=T)hifo=Ct4Qu^iObzQn#cZtdb_i5fkvT?rJB9&x2kJ@hqo0$6U ziiww1#j<+mW{|#*Q%nel{rr&E*sU#)&>}9z)%i zBzZYhaIqpqkcn9eyxKHMW@+w5*U2>5mviFL#I>un^;lO}=c_Y7OD&VbXOpp5v9TOR zDP)@cqgjt@nonHxETq< z2f19OelH#wvXUBL{5y}AekWgzWmd{MwvYK02~CZMM-NNjJlvV{kj(*k}t=Q&o4D`TBX($Kb;71h*FPf*J(`xsp zJNiO`=L^Hvs3@gBo|vpZ_M?;n{zL9M3?c5{wSw4Azlirer*J3F(ULnV5* zBwW(tv9F9yw;_41nsBem%9DcLjJM|kTv^*HKWVg%l|k?fzsj3*6+VrW!SB&@cCu+J ziTrZcYp2Y5yE3PiA0_mkdJZrBcFq?G;Xxa#035t9S{yaRT0$(h(ut(rWdwv61q8e! zC2TbW`K<<<5m&Xh*wL7fkV|QNh`^mZ7uq+H=s0NMF61+qd5H33EQ5F>*82f|&Um#z z!DI=Nhr8^j-`XoE(Ymwk3k$mJ#!wB=&Sw#-Wz$wNqz9j^7sUuq>1X&Y&cEog>%|Gm zzt~~nuz9~0-^s3Fw?}5p%C0}~F1NB(J($XI^mtDjfS^DCP?+W_qr}>@=OL7MPjbr{ zziF$d#S1BfOrx$|et2=>+T~9p(a3WyPnaXt@=DB|3*#Vz6ncuSqi3??p<9WgzpkG!DJs;xAL_5KPouOqF+pC@vc$<{3OY#7-s~ zi}?%icJcG{L;>S;aqA;6&W2?u({T|?d1cX%XFq=pt8jElMo$KOahtHb?(@EUdg66vWZ&#XpDQq8>{H2M z(CQlzZoap*zlN?0c7;pCK#U}P-jJMm^BVh zAD>U*pEF<*_r2Kuk^YO>__E#Sh5GwpjomS$F@_&Qu$WucGm%Z`s-n;&wovcewcWkr zv%~(shg8X@udIZXwHe>bZ?Xpv0caF}1Zf@{tS~|jyv2A#T=HrXfGnxT-QaaSrm5K| zk7`QZ6|g)+SNplKd-b#PVqhdGhm`ShCBbIF`aAJooa@D_G{Z9I?f4o74W%o~TJ?w;yYg^S-z>}(nVD#gr;yIU_4rWcxTKiuHS=rArS41l&AOxvf+7sF!JiiSpo z8-F5C*fv?0jp%k7jl=*Aq}n^C?OW1e;Hf@&EaC}5kTTXa%}&S!QR$eq^{;hy&#d?kyeO})^u@{x z6s&nNTSoh`!VA@JU~XFHXHWw)8UTW<$alG6U@ndGaJWnuK1S}q0lF+v(VBlc^1fsB z_3#V>$g=pzNG$at4JY*zu@yi=+j!wdd~5AvX!cAQi6n~apJ3G45|vj&2_xes?mV25 z(0)CVi`<7n`23l(-Nnn-H$QFZ)4Q7LKkt$*x`uulig#!7=^)~7a=eY{ZknkHJNK!7 za;fu6p+#|uFTQ2*PI75G3~KPiQT-3Oi!c-$`x$=K?9`-sRV6U?GNFzWw}vG7C}*Q1 zET$qC1>NLj2S{*8i*c>VgxFiGlbP9#5?f`xod0lc(tMa53>i8sgIpiy@U8t?GjHE1 z(RH_+g&V$~NFQM6rgU{M`(@{a-j%Md*YKogY6_0=5jXx!K4*0oy96)DArRKFb;3bE zV@3YGQJP3j(;DG}Cu^XN7wP7PUi|R8sP10P34Tm^^V)36AVZ1_81bVWJHZf8VAAGr z_=b#B_u`!*hmFpXDkE3cj$MuUrpQ9|6hBFt=Up#6=DR$RjUvXkUKHyDx(i5+TC_)f z!{&_vNSm#zvsq*P^El!=9Xt(}v(8Oe>3PFM!i5?&WPeMGPp7IcVaXj%LHv0hTz5B4D|e|4 z0H~Sza)Xo|V7oA+6#;slv_n*M-ZmL0YnfW>Ut;{VC^E=^$Woh;d4=v2tg_8Ws{ko^ z7T(yhvnoLYC(ft&zxiF&&MUlRsZK2T(NTi(u$|gM;?19WDqr>|BWqH`{VTuk^g`cR z;xsyLEY$bOq>QmbyI}OQ`G77RaYARNWOdf`3Fg7y%;$`%Dh%=9EK_V#R#soW1czHU z7Med!vTywKBpGT}EUz@CE8P2=3LyWJhkh7_{L^&S4xF9p`|kkR_DvGewkM6GPbRyC8jxDsReocYJm zMDe`qz+P{-4lccDnv(`a*`w219R3Ksdc!6nH^=-sbL12W9>)g`HY^kPi=s3faTv?F zpahD+!;&%Cj5MjC=z)mv``+82l5!=u)gGA{GbVzz{X1h8DriMUsH?R8g9fnapZ+sy zXGj)Fj=S`3wAwGXF=I2Kxi*fp_Y$g{**r7ycbg6f zxOQI&_zQLMcVFY-D@^T~oJu3g-7Ctm+fXzqdeR z)7Md@P|Cg^BZvctSAHKKl`r%`n8p(L`ki(m5(!0!yp&^1MJ|%p|CothAWZM@E2V#1 zehfQ)lo+5~VTFlom1;&!!g+U7aDAE3*7~=6-{R=Xf$Z3oVKXUK5Oq))abm}`BbP)F*O)6mi#LNV8pw~5WXU4gq@fs z1<7b+STF*8RDZdAfH0{>X#+8~9V6tTyBkDhfS+ z)7gKXP!O^gkv?0%Xs}Hvqu0b?2%;-w5g@k1C`NrV6-OiQCf07Fke8ql`oa#NRY9Y{ zLUlceNWvdxj;zAuLBrt6RA5DI0}~VpTN;DpXWa1HdBCZ133U5&2tz8bbSo8Ih}Ik?$N7@RhZQioJh2Y2wMP zNsByymXkuyl9B^k#BLZsL>P>g&8oLPLHy@w?Ow^Lbq`N{GnT`mwI8yHG|lklYX_$V z`KAk(*rm&5HUHjaehRIbi<;xRsZQfD;^r6SEI7FxgXyLT6_u)vss~j2M?MCczHE%8 z=ux_+ifz~_SjGP{m>)8X1qdU@QPk(N4?`XXW2F&Y+AVdw2fTL%ctsPrvTLknwB*qp zFgT|B9;grp-B|UU)#4wb>#$dqbz6CxUNH(v()!SqJ};<)j>3yStnKBI^5s7)x2t@+VoETG$CaKi>mns-YwGJ(s@Lm8xS%m3$!; z$IMvq)xQn@1e*{rjys~x$j;A9-*?H0vvXdZpV=;{Y6C|!1X&t1KJIluze(bL;g!U*vUE{w?Wd#sVR8NM zRhmAt<|xXuqk_w9+&>@GzvyO0_SfEm*-Tw<=ZK5Co7$g3?bMqMh?OrB8Um@DFjLfP zH!k5aj>rY9ZznU%O&8#&^^+97A~?)%FRyvM)vW2b66p?jye*P(K__WOTZQpLXlbz@^Bg3;Q; zyV0mXHAiau)0h#i9UKrXH4P)QlU{=-e*5eCfng*1=x)IJw9|#QLHY4vY)= zYjWkW)m!X}#2;@q)h)nHeXLsQ?ww>T-{-#64;bXq8#+xax!L=L*1>d_pN3vTJ3qfl z-is;3g-0YIC|qv^6(s2bS4)yCpop1+jsGEc3_$kRm|a1QN%sfmHQLhm89>CDIhjn= z=;?$J~Ve}caQd>1@ES8c%?8>Ec*@kSFDRA#_oL38P4mhyV zQM25z#`&L$8&{8yb+b($$-mNG)Gb7+U;qFB3SboBF`|+%NV&!kW6BsoU_k(lqH{%w zJn8IRSy}{=sqK|)4$wO~uD3w3)y1XU;2}=5GkV0QN3sp1-6p)BHMcZ*< zbsL@1eY8-~Z;W|Nrqd?q?Mb)V+>*F%cnygn?>FQ>Jg3 z2}gqeVb979qyKJpt+^1u004mFdXm6<&`?5N8!%!NBLPT?2=9qeUgCnrfT{VlRAg+N zl>==6K`_Iw9AUBe2vTry>0GMprYgrrHjRplv+e4wixyFt_F&z2}R*#yW%*3 z2xz5!@aP{&G>pM^0DNP!BLJ=kAHHnU~hF~arGC~yUa&$n#nc}7*pmp%o+Bc!8Yqu+5o*Eql2u15W zi@Hf6WE7ysz`2dlc2b>?T-9fmi8PyLRlRJbtrq`Q-b#kVvejw2X%eZRih2rb3aS_Y zT}%XHt{@sKDD}}J3v76|E<2AF$7VIkwZC)k_JFtf+djBPOM@)Rq+IdDl1WQJ#PAEmte&JAVCr2D z%$a_7=Jdaly&~O-bwPl_-AqW=9xzTS78Di)SnwUMNMxf2MS;RMe*W7upq>Cx2!jN+ zRT>E;;_vI8@7Z_9A|iUcHF5%@t4pN(g=+nt*vl?E>vmmdD;D$5cJS^rS=K5NrWJ7g zbDzuQ2TeU_v+^RfIEi-dA2DC|U;hHI_^}HH=^U2`m=1ZC1}8mkC0h-6p}Mo2K&fT8ou|^1iFs7GnpK(Ws)|w4 z4-H=JpnLf-`%*7D^oI-F|AuR9}dL|mQ zUrJ=qj46fku+MYvUEGMpBTXDe#Ry<{{MDUFJI2FLW_DG%Y7GrLi&Uik%54m+NS!U` zV76&M#I^oJB+8(Il&OVDUa*W7R!5DbS4oj6AhjUsX4O?rl9bcWWu)s(buyI7Nop$w z3O&N2)g?2@OW1LbA)#bUwd244I~YI&Mrg4>PAhN3+jxqu3xxwlWJOC5!3CU&m>zcg zQe2|ThTO7x?Ve{&hpgT5nTp7w*0sEI$64!W=q0U;`QC4JH19p*(=|oDX)TOOV+G*& zFti|HiY7SBB>{m<+bw5GXe-|C^b%gBE|P5Mt-B(ENTz~}LxaynLD9egq`^>&g5kuO zvA{r>8DTe-NRZ$Ev_L>1Tx3Ah)uJ_{jEF-n&;*EJn2cy5*uC^(O;mtrD5!+B(((+O zA{g_!aH_Cl6>yvqO5;T49!9-V%#vn~Hy7-(O>Wu^iEfF^W&M_1ty)PXJpW=~yXAw40Y~4=Iqst3y3#__NEll<}%UgBwokiCoeRFXpQDt+RIH_OC zQv3a~JEGWpf~p##G8Mo*P+5R)&%giw{jc3bX=<8;7S_m^n`t!DD9_&y1m@G zj!+UM1u?mzS5xQFSQZ4GCEA5asgSLf*_{?Z>${+%j*UucYh}6$vYcoK)RS#WS|ugh zQvDN&)M0imvaRLq{*5dhv6$)O5>LPQm& z0GdM%g)Rb@4fD*{m30eFXbj!PEEde7W*d&vNM*UIQj4?1WOK|KcC1C3FN_ZI4KCwS zus$C`a*2Q4PV*34AX1fqz3Up)W2=!+qsLF6mr)?UZFyz^4+=%!Wz>1U^)g3MW~pg1 ztYbexY>A^HZeobFE!W)Wy>pF6Zm;jwtq{-e|Ghj^13*B4sJGhH5Opt7cvMzh$LMuM z8JSiIQ`c&yt-Nn;XidzKMjL`8im5AI1=3o?^a}a4E7s_2zImVN1fni0l+;Dv|Mma* z5CdLkTJKe;4Mk2`9Tj(W<)vr+)l4MT{kHmu?po$up~8Ch_sm~V!>2yIJ7iz?d;f^u zH`_!D000UXy&xAYY$1x87()QUXxai98Y3jS+Y;zl2ab)iFrMO@b=MU4y? zdVlMnYFwg_Kmc?93Nj^u0>(>*lnSiNiCinX#i!y~mFe5XKwR2g&HwwdWb1$grAkZF z4~0^IN|~KvONdkTUnea@e1b+GbIK zG=-wG?y1)HnpM%{jvKjqVdS`&*}32KQWXNdwWnIXWtDW6ubbz79kZD+YU39Ahl2%@ zP++)7R4OPJ7+K`hr;9DZM3FS2!tx9@ytTjV@#zAVzytsQSguJK?GUub3TT3Bx?4hm ziGcwKPLqDMQ$@5;HMg5+*;Gb75_>VTF2Uj)>6Ap`)Bk$UZ%yIePu9512erN2H)p*$ z3G323l42-~K@w@a)fR-tGq3*saa~h+z-xj@JVZu)mz0&^wDDI6G%6Ho!-`>{t1Bb4 zSZURS&xS!8fNeIAY_r~2!8jeE2Q*%M82|kQ!2>~n0%%(Gcsl z-qx3`xhWum^Z$HB_y7KNt1kZ2JjLUT>DhVU5KxoE;-a7tMN_P5$)QhsYR3*jGztKP zfB^^f%$1A*14c|xIts{ED5yd%gZ85Wj|07=qmLk|V`79LPP?@LUVvQ)#Gu7!qz1hZ zh}ehomr9@;-Q7J*N{AsQQB7u+laiDyz+sHlWaB76;?^{g2d>8fy3txGP&l`(nL)V) z!jV?AmhR`iw(~?C1v6B%P*I92TO#i3Pg&Drb}c%>1BwgAJWd-5gu^0nSEK-TaFD_k z|H!XKqXtt5P(T1W&AQ^}w_Ci?!5f8VtuAHD*)}Ay5Mj zmbf;fc4CuKkg8E)H1m^Pm&*5UD}Pf`u5l-YkIz-0uenBA-{YSyHy(af+14QZXzA9U z_0@IGVQVnj^t~Pep;XBpv@^n*TqQiQ&?3gb#$dqHVkB0R&U(!p5ec9PGbRrx27&<* z8$ha0|MohO$mabobb&l;?} zXr#vh05B0EgA=HDeM1TMS0yjct#u>pz zNYE%@m@;GsH%34?U<8CQ!m5*4rHdJW_WWvMZARYQ!s!80uPEYK=3{z zR5rm?FkQ_&dXy}AQV;K<_vKBgsR95A+`LJW8z^Lf$dH@!fC3^!1Rw(VfJzyP4yKco z=@%ibPA2kjQ?%A{a7JKhYjhGJ1uFdM#5cEjowtIJN*~GlE z>dhSN-1?C@F*2aF7^wu2F+p`}nljQ_+6+J>%F0MR-DLCVq>E72xl*XFt&EjcmSt2^ zl;G;-xzWf{iB@!R0L^0gDDoqeMQBY(Zm)A|u`R9Ej%^`8a;^4H7)TM8B9@Y;zFPnL zuw?jv1#n8qGe(Y(jj35mWX;kPMN=tFG`hk4spfTw4(UN~RaGRa8u__gtBO4=)r!_N z-ds)S5?xC}O+8+-uc2X&1<3#9%O=WIG&`c{98z@VYGovSn9*)vZkp#^iGhf!+19F! zfA_SFzU{wQk0Wv}1$V=QW9^7dkC~w1FXJ#U&-Cu&NCOyGD%PMqj1O09wbu2ViC8l-5SSp#n>&AQGNEjMNo)-TiYIW4IZo}`M! z?nA7AI}R}$*6(hZB#Rp)NMtKY+A+*UEz4()l1Cibk~B7TI_66g&{fP$kUph76LlYb zb9TPaB;~JYUFQcJ6$2J93U4kpwdPd38`fFru){s zQq{?wZ3@2@JQ)(sSsvXyk@e#dR1v>7xIcTu6_ zs7#IOHkq;ve)Qh=FVNkVGl8I-HdC^aMCmM>xw5NnFHEu;f*_-1^?|QR>+XL!XDdpgJ&A5y*X!9@ z&5ex60*?xSLDykt-+kX(K6wy;UPKYuH!C=5d>KU0npdAm=J3gLe&x+|ZLTUc96zJ2 zD7QB5`giN+)E ziF55*?MixWZhEgfYdQVpy476Jkv`ukfe zm4*XDV9B=vj7m-YJN+>AK@e+8kEq)QovpZA!ot(a3t7#Y~tWsBd z^SAEEH8*!ZHmt!T_B^eQFH^heB)8P#P^Pz1(z47?dX?nolyHPDjQ1d>ZJ4^rT)Pd$ zz?g7&fQWR9QuMrfLrt{s4xB=eN9yIAV0b=BVh{mhA^`z0t&!my)wog#AXOSE7p)MC zDJP5YTSvK^AqdiC%<>|W=Sxx6#R`A0f%gMbxbCk9>dHfiA zpD`=AQ0-WoZh1>uG+a2whmGt1pI`s~1(*j4v&If~{tRq1;hvSXAI8mM;n69Mx}B zhUKwLcdFw7YVykVInU3RaMn}wwaFBhw3y+){=rBR=R{f#+JfU6BOXkqmSm1}u-TEx z%<@4J_vL^2D;Qa-j(Ry7tytq;^IM%a)cug``Oa!0yOu~saHDS_)xodnx;NPXLZ}SD zsTyP%$Q+Qx6bp(-RXYN=BN8MPNDu=M0JN|U<0T;sjZoC&6xU?-q%F)XbRaxqVo0J zRF<~=Bp3wx5?wg^yuA88WNjlAR zHado)uKrF#?IZzumCCr9DD>o3G%8S01a@)1}g}Vk)1=e zPnK$g+DExGRm*@tG&5o^0K2j{^masF(k=BasZT7Wj8jtOdi?HHhXE2|&J%V&3>6!k zAl#CJE3}PCPP6z*d9F-c#aie=Cnnk=DBaD9%(Pfyt z>C*Blc0QcZFiF_-J6TD7Zcx54>!1Hz{&M!ez3=_!R%MrwOaOqG(#+dL!nr%g-i`+> z0Il|?A^89MvSja!1sP7r6Gn!Rg2;JoVGYz&ML#5LrW%SQq@`(rw@B67ySX2c;f6cU zoY7PeHu9^MIdfQk{>JP$WAe3ApRD#qretssx)|tT4vyZ)Wvg#?>LP;3pgm@UvlmW} zrK=r?l_sPTH7FiaJFVBIlP0C6n=?J`d=Ut_ssIcYZJ;?4bLu{ZABS2hFmgi=cl~~( zDgeL`e{}#r;s636$4!915@nz;I93SK1d&p;jEM^#D%-fKk)}zQY`z9*(XP8eWrN3` ze4m+K@v(pEQ%dLOEx3eHUdom5y`DzqXwyZFkUm~azJXcSbdV|2K8q>ZiqlmqEp)^X z2MMwL>YUkjw`SC)gzNJq2JJ|WwUC#2Gjq-w;Nf??s(sJ?QeH7x*GYVYN3Pz+lT)Ff zkTBz|Py!8j5*s?%ksuY?M9ezRv_dR6!eLQLv6Qd$ynf?!igS8NGsrG^fy6Qm-ITMa zGL+_}h#UcI7Nzx}S|#d9w(RRsj+!S~br~zF|EBo*1AwGhXkvWDBT{KebW7`5MI%Q7 z%+oaxWhxxE26R{!SWpHQ1A*Shf~af6QfCLYif2<`qZ9xB)BqR&002Uad=MZGJcL6t z2Tmfe)QZIn=`+HH2RZDWry_!ZFI4w0FhB`Yp2}z72;1o4186{&WU$;)BSim3r8K;I zp8eY#AP{Dfw1T%~5-Qr1Ttb6PNnaNjhiT)zfm`k+@t*VU_}2ITy+ViwRcWm>IME?g z_;t6<(zs>(SMgb7m1xXnteb9?hg^{W<9KIX(gh#(b=!CQJ)Qh+@sRc3;a$J~Fm2jw z@~s5QXi%sS4*&bIWbOb2_-076O&+j`D7kH6qn;JPDIZNdTFMb4<+X$>P*rV?mpFt1 zqnmU~>aXSG3JkP1)~P7@ezaZyZ1Vbd?|aYt8*JA5zFEWfpFf!8S!|6$&v~!b*vg?; z)X_&lR2=mcG&+(fi%gk-*>$4G~8ezvR4@~nZH4vu&;b9F6KfBHSu1PCczDFmct1aA&dA)q+Q4^c6NTt=5-Y@PE=_fbaS^i)x` zdjGVkJF#MKH=ss=6tZ@~Ga<&B{52e700U8x$+GM$u?kViQGN)`VtEkkR=H!J^M`jIr@a^-{X zF{CD?(re3jC&pz7dZBo-+X;C~O9K?WL_M04mJHnyzYlIS1O54)*iy4_3-GrELSEj8*R_34t z00AY`#8R4M81;rAH~?5M6M`VZn1*he5bGICC54qjSehQQS8A47GaHAaQ!E^NSp>Fv z+`h!BVjh-U!go8cvXAHQYW(!X<8MN`IH!(cYNq(frdLt9T0N_k-CjwlRb+2~!DLOe z2A8TTCoV1>7l(z<021=81jtG?f}n#7mSid%CiY!KWyvtHecVM{qtAifBV8d1@nNAW z`)DNWeir8h${z)6|NF9J=l}%!SIDz4A0URv89HRm)DrN=BP^x*f&3n3H1t1F9l@A| zx2e;!9LsT28i>Ny<4=p5J9z&4#&PeA+Ir+{7axpY{a#6H)epvAZ9E_A$}eqR!O z+5ke>k%z2dPKd&h6fn)qXkz75`r~Ur> zvTr6PCK7Ze1bHC9kn66R;xiXr^mr~rEfR=cu~-@drgIdVjU0HP8QR^Mv=+kjmqg6n z%es*1EfD_#JlU?MxjJ%6y=EFy_LR0H^xgBXcV8FZ|K#dhA>s@NIocaLgoy}iYdUMLjXb&QxE_B^#LG&fgjKasGw{D z@i8M7WLGcwd5VOStmQeXKBo%Wo~!|}mZgV5j-52!6oUvPMXPS_Sb!#`V~~kN1B~?C zntP)Hh9MQEl*OrOGR1;(h%yu(Qb^+@s?%vQWRYy+IrP>oy<_^=dx2|B7<;Vc^sW)% z%Zq$s4WiEy-|CyyJ@p5}&uk4bK%CJ-garq?%ouy>{x$ykd&wGbcl|}5_xgYEM}Hx` z>$-zL2wiaj#z1T-JlWd+`?6&500j<3N0UZ|l8R|LZDI?S6&({HESdUBH96!Nk*i7k zWDmJ3L|i{k>Z;Dbo^6n1t-S9Ei#mJ)(Bv98xg{Tp@Xo^vy?ha)@tA2_)hsVOs_il?#K&!*?~ zS^MO5bn92%=Gy3wMDw27*6MZTb8X|Q0fZ2Mn65dI#~=QAjOfZ&h%|6vYlY7!gX%C@ zTL_mm2W>v>HM$oj2g;HzfReMoR_oI4#usZ{!~gztt`oQFU$LIV$QoGI+lnHzOWRC2 z&zh5(OEG;?iTL>VISs+i1?Q8H|kEbdfErgC3|bv`d@Ptzvoxi?5@ihZ1Y z1UL7XuByhLLuY^gzyDqT_ha%87C;1A5C9g8j}*OJ%IXGd4RxwB@ly+iCna)|p^3*9 zjagip zGMC73iF!WBYQDAIjVDVns$Edo=t^_!?&p!XAQq1i3m!T##gb1zeB;ojfzm7}JyLqo z*WGcu+@=^oFeoG-6Dmgpg<4^J*_>eLE7BLZNO(nN)uy64@@2|0^ft1@gK2TM{(_Ev zUn)XjL8FvZ_G7fy`BL5Nr}4I*h#N_%o0j{SX&F@Y8|1N~@LyH*vN^7nu?c0)|F1a4 z>ti5P3rRCoYco2p-9}E-XMUzqD@g^dHN8|+={jmTDiSzU(3FjKwd>{>)onW9kIqqG zc?O&!F0w}9)B*stER$1gN%jBxvSjA~1jjl_QwfHWjwv}UU~1G8Q8y*5CAxw!Cgk;r z4zQnkNW^DAjKX>-rTJAx=E)#;Qf;EY8|FW}s$|iw6X-6g6}=-@G7RJkp*qS_yE~&! z#}YPmQKoFk89FGazh`?^f|ho)83Hsu%y~|3X0!_lo<62cNU2H3B~H-G^g=Y5bbm8^ z%k~>!4;4uWmROCO?6zbX24&io z?y2)y7(P))HlS_nas;LEX$PbhN^c7=c(5pSAZSQ108D!%)5r=Hz-c*E!HRY&K)v#0nSqJ~p&Xfq0 zfdik?g3&BEQAl(YV>%*@cZKFDj8sI29vPUk^k#@i%78#~OxhWBC}q%mNMwar^E%S{ zYqldcZC#(Gt77alR*Y)BtDBvkCD5nHMnW18F=R+85UbuW%d=LJ){`T;V=xSo`Svko z9$AWvPhA&M-JZ);ZfGpR292K)3FSjrn3K?1=Es`vUA+}8b94W3=9wv36t%L3=E#Oa zuWfD&fEF1UYtpAo^JWpMQfs?mwg3CFWaoec?ovogDQ=*CXbDYbX`B-Y0V6D#xKwxsc4027sVppz+R)bv+3S|)2q@{%!H4C-Ba zkaan`S;(Q4Brker4Nn))d4a34cS%c~YdUq=>C!=wcWTzUcU<(>*qg7Xb=UTH&(-$- z3%!M500;m80L`dmb~A#5C^wMTH6?|&S3(PgvvJcjNQUDApoSfE#X@3`6utbBz>np) zn!6r07ncM~8aCzAvWiV!Dl;V-==#Oy3_{ z)_yWo!a%@OlDU9TmXGm#}nA|kNenLXyzp(?+Z+{zMd`EgIZ znb|9Tq*FSfV|86-IiLSIyVs8wEfKH)GL!)UIHZ4Z$B08yaQpwl2t>7g+f~eka=XvH zGy>Z^x3yxEcfFt6{I&VxzwWo$b~aG>S$kZqzx*>MFYBk5Xf-rpBNo}XXKa{GT}GO- zH3C4QicFL5O!Abrbn5Cv!1Fq5TcOT5CI^EfM~GSgJPVj$X)3R^MyZB0ESdKI(H4f% zY&Jw-hzXY?j~W`3iy4%i1cJzz!bNn9A`z#etduVXYcUCO)#M3HFOfmfi0n+2Ek#VN zj@r)dXb{|{#9YG-aO8s-<@5Um=JG>$@$+SAr*C4#kF5G-)UmaXt^40O#xu$z6uXu#n>`GbaWRjxOIN-aOSjfk#lIExWU#|0EwHwr-SsD}E^+n{)|NF9J^aKTTW=GR69r{ljj0`)c6r)#?A;^}n3@|NXKS)mf+^HfeG+A$<=M zC31*O&#PSt^MmSB^_Fsyw%yPFs^B*?O#qL9M1WCyCY|X0>6YU5F(`0zCv}ek1ApMk zd;FERC!23P2<6OMt8LJ8tV4MHOt;=++;3;pr%5gU>z|>C^%DGbCJ^SJ=9^KhmD{Rc zS3TO;V1BW`V1**SvNo*4hb&!JPxQ@vL)5v(Ye&0{G)MQqEx2b~%Zvwjn5O%RAoy z_$G^{tg3zb&}8h(O_rOYg{nfQYOagDu9DX0^wFh$r`pI_z1gm+x7O4?%6gDm+g(ef z)h5eMou0H;MCP#pYz541pg@u9X5hF6UtMkg`?6%~00iDuN$W2ju!|^ZJz)>j6dlOaIl-$iwQG1OkqU!zh#xkh>K~ zaEkO4_jJ6&)L@H_1901B88;VNeU(e-X(p}EQw#yVrR6-o_bIy({rxv7Q@Km+;d0(} zdbzsoMUIT+DSOSF%BQklDn+pN*WFLs{9X`hsvpw2i9KITpKR4(xoyhY&i(wrVGwdI zWKy;xYL`Un>4T~dTq@&iNsv1LAq93R?q=%_g-}ibbwC4>TJot&L4Mx-ji3&pzbl*A znSkL9bjf&f+f1oo(VFS+s+vw{52lZ%^X_KK+|$uVn4YfK?Dd>&PcV#CYTTcum;~nL znCj+f+asQ;IhNnOX|^ra=$qr_Io(voRsF}rr9($Hzo$w|?{XdgAM*e)*(fqb&3#ZH z!w^goG(w;tP*|fu0exx9US(AtmERVEk`*ANFZ)=3qpmIcqokKa3lgJ@O~mWVDI=3l zSI*PCMG&NYkw>?>@`|| zPRB8$Ac80W0K_1GEh!ht)v_3iJP-sw0t^J1?c)FYvSj6i1fD-gy9<7xbE;`dJ}Z_L zjprIoJX*poDx@`qk61;!;sE1TRZWx&TAndayV+fp!aJPhEu6WIKlw1EcByAOO;dJVenLU=eVf;-m{Cuw;sbPa8qT zi?o%VyOzuZxtx_n6M|bj2?ufjmZp+W$>wHkPD`n#dz6N|`&#-hi7h{Ne&6Lv>s!;E zA!6C1W7!;(62Gdu7-p78y2bY%xqRbl(y+76(41n6O=h>Xv3DKo?-;gN++wW=K*qEg zHMZ_35V*B!{Nk6t-}FoF8Do3$ZqW zS-|8|kv-cxbt2seA0q*h@7ZZwi~ne;*5I|h&2FDx++>oXu2(4=qd7% zK5k%MV?$%hJjpt?TAT97oSKSs(=a-jI?R(JsLdm$=$kB1*??5}#)IXBbCG&YS{9KT z{GOLJC{q)o7pb`BzLP+}fLu|g${~o81)Ky4YR0PM3;-+<@;(lu4_27F40j#Hu-jXi zlDx0%rSqjxwZSfnO<0iYuOS%^i1Kn+r=W7d-Wl|;Spc&^Ur&( zwawS{-mB*Oc*kDmzv2-Pk_kjuKuGct@vbb&i(&5M!y>b2C;PsLD&$@8Y7m4vyWw>XY6L3Dvww& z5(omISA)Wc4l-3U9>%-`rXO&+RES>Zg2B7KiFMfzmmtan66#106Iw^JLXBuhR9HfU z4@QPoNm2d}Nfcw~Li4>W`RY{$yD6Qdcj)ty=||@w{AX~&S9kKt);act^&%wYerJZY z5o-5&yvZ){4^z{}+K^e`h#CtDE9iwBQ%I`ABm$nO!~<%`?!nCgzOMtRd}Y=Y zFl?tm8(PBaVa^=(o|ybGd-u6qGWkne>-ICfdoJ&L?=OA{{)pM(_&f+vI zIgvuZW2;iiSk7=(9xy?}*X}H`Hn!>L@?GBfB~gCVO2xNXY9C9iaH;pb(gJq12l{k3~yHIrFR6BA%($R0p`!g@R(uG9wz_BvliA5 zkZ48p|9!{SPJ3O(Y;vuZRZOvpS=!e{zO#=~TU|?>7~5YGcisIh(`Mf@YT6jY&@@>6 zh9O|_YV-;o*|;-jcmM5qyDvWcSN-qRwg2_~fB)t(3ngXh9wxK^o02&2Qb$K8v3d-K z1z606XdtR7;ION~AKRk0HwtJ50jV37F9){8iTJAjr|hEM`HmUx)jhnbt22*1Gt7Cb zjxBac=(ah~OmPiD>PHGWJx`gTqxfqr*1&Kx7hTQWN1kY{3M|f~l3n$pd3tQ6cVv`e z;$w!0O^S$`5GEfRnp0|F#VpDhSb$2mdwmT(HUtwBEx_AxG#$HHDnyh9`TVX7foiZ& z11VnM*E_}BR>QSjTR?7wG-&J5t50le8MMDL$u$b6ot>4ntCM`&uAZUQuWSAOwt1Y{ zyWLhP2mA9J*)U?M*PrV1Pd@&`KGW2TJ@+!-?_(0!^#MU3xq&6@EW3oPco-gJS2Q)Y zoHZt^1!0T7r;XAAVIT#(zNafELW9DtQ#8b7K?QLWW~l};D)y@Kg6S5EEtf;GcSU=_ zHQ!j&k!4{F&&hN7xkWCn;V!pFZW<_#)a9y6H}I4)E%MG9ZMuY{^QUZK7he(#MG8D+ zlSGW>vcobcExXZoTKnm(&aJ9RNKr{T3tG(-ZpPL{l%Bm$U)g9oEq$x5ulHN}3EfIk zso8s3ZLdPiij1AnRK|h1eGq^d0JPKtuj=mR*8QND;N7S46-o9te z#(-SYfBjF;-MUWAV!X1oQ;p`gXX?aTGVK2ETHPM@NpP@{u4p^5^$sgUe6h>L!?O4N zcFcE8O>yaZde!Xy$%^*ahQ)|Af-HIz%Hp2t(HAT=N4s&FGh(FNx78GC0DzH=s&ji1 zz+yz10fHF}4n&e7iG)nDSPM@{$Z>YR?|T_-Vo==uo!#9>Vy5m7A7%Yin3qtuXv4e; zPV0ESnT1>9K6h4wj8WY9tt8E1M$~=YnAUGv=O5GOOR+5n7PWle$-HC#?>>n#@`sg6 zY2^LvR(1C;UH{C;r^G_!{^y-0(iwL?7Ma6iT)(+Pzvs3|wrgw*!!%$+0t?I%Kn^`3 ztMN9mZQ^Qh+IfZS19F0B{8`_-%CpcHcTbI+>96NEdp-9Zf9s$9wauq;N!s7%Tccwdy(?Qp8Y*DJ;Nd}1 zW)BLAR6>D*jr|C(bTf_=cE&&zqS0YVAtA&ZPLkUpwHsFrWC#dxQ=lqD-7S3~YRIhN zEW~Or3qgdu;&0*dnT?5Mg(&e3A+1XG{P!S$UeXCoF*Xl4yNeIL2;_) zvN5Nci7+yGnu&JKsbDM~4+wE$if9^P;vmqX0Z^z+qkz!h;SpwoMFFr-qZsyuPaXxF zqq-e`%@BB_oMZLL^!He{i?Vc3M4!o!ig% zcO_(hLeEE|G^;w*tyCt+$=>h(>)-$Vx;+t(d(3u(Q0^s2K|x0ZpePJt41f&rAwBQC z%4)P&^VI@2Mx0ep*&les>_%~y*Ox&}GE*t-Y$X(uxXW#JwisuYtMaZtIjj&YIoA2i zH~6S=a}sluAd^=wbF+U94vaLN5_TUqYAy*4t$tc6S}m{o%IeNWL#jKj?@G50u?MpP0^x+(AqAZ;a1 zf#$o44-JaD|W# zWR0_%>i<;_ zQ+002SM}Fjecek^PRLZ9XO!lw%z?6$fq1~(6(nk+T4=_|hy!ghP&Qp--2eNqWbB9q z3wlO7PZqF?Z%El;0@f65=@%@Sx`GEEWOat7AZEiZjnC6QlEm&O3^xu+tjt8LHf(1r zruIPDBa5-c(|=>mpiqI}iqxG}kdtPpvPu)Aw%6T5b+ecEZLHkpdJ4`v>uBgSVQX$% z(XkXMxu&GlZ3Lkn>PYB$sUm=&t?oh^^(?aEY5Hw_Z8icz9ql=RA)#>^h)@Us6-d!W zB$yTkH41cs2AENyK;@AO3Jzof4$bjjZE2rIpl0m-&eo2=Rw|!tZ#tBYFsb4_Y}?7> zVk>}B7dP~e=Z^bL_skmB`;s%^jz&5$&c;Mzn1)ws<~u12FnEJb1`=`4Pzkjh z0sy12on+5ksB%vih^s?!A0>F3bZx6yos%#3QQou4m;ac@wK*%ZKUYXH>P;6>Iu(Mi zvzjN-r4UP`NrPj!3b#Yb)>Zu3AxBrJKy(pyYWtB5Um=!626= zBNTAUz|){M9~wC93WGFKfG%RWo$4+|0B`)gEr?rB?K6 z?e4Gs{aT*sqa92`CrLK3+0Hr4=rIsk3OG1&6nJ3328los$l1YtuDA`-yNrte`?6%} zfCTk<#j{T=@`Xr9?P5l<6gBA^tUR;AK|JGWgco6jHp$A=pIaGJsd@@&a@}6~d?)SR zl~I5HchA@FJg@$0$bq##d2gPgqTuMT(S^}Qkx=sEZroL7-R_oM7D^zriC}aXnuDoQ zt)x&{UHXy9TW>Mw-7~iHebrsgZ(VdwL|ZC<^7c)c6VSKa>9o&ga=&L$taG9$<#FLi zQVkWB0J8}t0uxoUr)1A1I2EkL92C2vr^rePSydb51yM$I53(k*oRTR7^fMloNHL^n zlymd@1MG#Ar?q7FAI>t*s_NRT!kd3{czFa3s!q?K zaw%1+k&~*_a+a=poae19lP%J&oQRIp_C!t7|NncgX55awQts<~sY12P%4IQ8QqD0% zhzw9(2|%ysOeO4MEFHmwHddS~DD|*jsAuiixfy0Na>@+s+56g=vzA$B_;;Vb%PwM* z$tT=*cbmxCB&uePsT!>HwC*M9EnO>0NkQ{@E(Bt)N>0~3uQuxWfjggbwAC|Nsl3g# zT?||Iy)=4l`!jb$+C{DAAR?Hwtn}GUQXK4~L5B?IBZ)|b2&(}KpaayBLJk;uuh58i ztF1h%h3qb+e8(K*O<4_{;fIw;j?zS>^D+xICnJ){y49=6?#$e?TK=%FQH;NpYfG@g z{X@@7wGsNf?@%vQL@qX-PEMj;8Ea~`D#Zs%x%ER4o=%l#oXmcERh9IumD0Mdr}zGq z|4;fQKk2p2?tRZjYLXOUQzZ>$Jq((M5h|K49400%gQY+uLKy&k@sxD{YmtMxTA=^? zvSjA~1k`#)>nj$pi?2AzWdhby1?d+o8CrrFyyG#H7h&085;0d6a*As<>EWmK!*+Gt zyPmVFXB=|h?|kR}``a+lLtW;#-uTuKM2MoaFny3QWY+n)dbmuERVr4;%vBT+#hnuq zDvr%;)LQj54|3M47cH#6U9_!PX;1t2|Ns4ZH}l^4D{Wc3kvB#f#z9J$!-E5lH2~m1 z0gxt`agRtWsJO)mlX<8Q1|-A|0+Etb&}X#ig6F>rz4CC`%UE?|QVV!O-pPnuYK~jV z(rdEa+Obx>(&J8U*_?!r=^cI)HL zHMH+^CvUB@zxK+hO>WVeaLOh>@0$rD(482@NfzMru1$rL~b>`ng!D zs^?R=Y_y>twdnn-pHKcq{=KNOv6b%5WhrdYA*!uQhC&`q8EzC$-k#~P-U+uh9|vf0YYy#(Vd$Lj9dx8J3yYwG>J@Avd%y3byz zUzvB`yHM=y*x#j54b5XsV-F-eys-F+G;?CZ#-@ozk`@pRt6&t2MFIkeqCU!-yRy0k z>i_$)Wb6P1GkL^IOD?jC4>-(dquf&g=MyZT`id*PV)ciWu-2OC1!8s{Mc&sUE1$8Z zCva+2)|t((2Joxo`uE52aUiCOMRA?i8bwPCSw=gI1DGU&B8WUd!hpiF?8SQ4j}RB4 z7^EPR7{)1X$5q|SRzqJT`&QNd|MKbm|LNDKPgO!Tr*Y*)V@6JdIQMa3Ct`>VvVqP- z5E>LY)dZm1QL>wHAyFue057B(7ZOw?(hs5VIDfU?lV3&3y07d04j6&>T zh4y;9D&*(VVf@PWzGXz6{#T~LzEu%LkAZ^Xqrwu>p>0QwQwDQ3F|H`9zl*!@$sa3v zE06Yx-raq_|LOPp`aeYK-~a3P{j9}%y_sC6YO*<*-PEDfsDcp?RN+Glm;gd5IR$i@ zpmvu_Uyi$xxD;S)nm;?0JoKhJE_fSwZp4c8Pj%p?y{!37NoLPC{NMALLnRfn+%oN* z`9Bkm1I8)$eT`C%m^1gtEyoOf3SmNy9Glrnq>-sl5n&B2CX;>2&Bok(5Rx2MFk=_hl;0JP>h42esAZXZ)$$*JJ2IbT^7eviiww`?4DWQxbTFsKzN~ z98ZhF*7q}EJ=VEk>_4gDIi9aPw*yoCy2|DbSafD%mZm3LN8reKl)#jctte92mjSTO&4`pxa} ziPy1kz6(^Ri9&YH=l9+iCzIIt^)Ks;N$9%jxG}|YDGKy{SlT$`w!AHUsd*$~PpA)A zDG;hFd>set8JH_mg!(UHo;XuG2<|5CVUVu? z*gY{(>|6JQVIy3;HPVt-UA~u#M8Eo)gsrUGI&7vW8I?B*?Kqlpg%*&{HyckbP&_=D zKHFKFP2X4=ZOOG|cV~wMBGyi?@R2{G&FX^r0*IW2SK;Vrjal9l{;MP9Ty8h*!egH#;s}pu!`o^e;Qh zyiiVy)b9oSc&@jG}Ki%)9Y!@Rbo>#&Mhb z6VIuHHM;fIX=`EC?~b~bM&=dgO)sD9T>wxb736`*5U)$T!mYoG8*bB9 zZ(Ynop;(6(ZZC+Dndb=Z4*0>UWW6LYo}oM3PcVn@~#7bfBt>81A9|v#Xa!?9DQXD|K<2PpLDZo z<-*$Jitwd-OD|$x(U)#q{=H@@DYc&;)rNS;S7?tQH}Wye2?lsKO$vGGo0>+ zT5&l%EirIf7K8UNCJE>Cp2})P?myY5;DTo!#~8yWce(=K@)PCn&HhZv>KLRL{A^rz zcX&B@aYe4iqHWRl%GZj`8Uu`J@z1=}Y-kkeIgOf)Q!FJyFMo^6+fzHaw9FAL{mhdl z=9%|Bpt8ijx58CQy|Ah3@)9So!dNz+Cqvihy*L-dt^4^`iHiLDoo}&EkzNup?}Z3M z4cJXIOKyBq?$g!#=dJ+pAsaCf{2c#9PHzi#v16?HIpJeiCl5=rvU$;^4IVqfLF~S{ zKgU)Lf<rNtb6(O4zB8#^#o(nXiSK!#a2G z5=+C{#W!REXu_$2X{1M;ef)wjz3#*WLP8~qH#b+|h%PUkoUA5YQkMxD8BhGEc+d(utbx*j%@I!(6a8*m2Ab40d z5E!x$XwCaceEgzeI=U!IQ{mIMvj;K3R~M!xBOY@mH^#ni7dNG4dJjtv(@Xwh9|i_$ z$|v2YQ(SYgdNVHTE!LqbrI0RndoFq*FGO`RX%{5oV7m@c9Y*YL&%v7((6_T0i>rR0 zelz5NJeCcVYtWjxoN5iM_V%~Mk1VD^FpyJ`YwI$$s)jFC6afmB>{V#a@$rJmR8-83 zS?n3_sN9T7LPcu%|I|njpf*i_IJH|b0S-pyqVpGgOHQ55lH_}LW<>$jRTXA$q$TvU zuqg23rL(a->oS*~JJcqZU%6j5m$PcRT)oI@`%vy|2^knTep@&q`>hZ3OhUC@bnki% z9IK1Ptg2!@qJTh<6DDM@*P_$2)Ee9=XZS@N5@2IkzhtrK4{M&0^IBuZJB9b%(=QEV!8-nM{BN&Jddh2Ik>V z-$Oq*91im#rtPw`i~YeAf{#)rFfmrVOMj2xoDk>CG-lHW*S9!R_THtm_*%xc{%RfI zIRC4lrv`*6aTZmwVQ1G75qbUAtA2N#sec+uo^l5urORQNFg>hc&(=P0pHSq_f|&h{1TMD-w~tgvqf=E*80P~>H+E4CmlT^$|r K|MkD0z<&S@pjj;d literal 0 HcmV?d00001 diff --git a/packages/pinball_audio/assets/sfx/plim.mp3 b/packages/pinball_audio/assets/sfx/plim.mp3 deleted file mode 100644 index a726024da3495b9b720e92612641c30c1a8cf4f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18225 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 bH?DsI>;LMT`oH>k|64Zff1lL 'assets/sfx/bumper_a.mp3'; + String get bumperB => 'assets/sfx/bumper_b.mp3'; String get google => 'assets/sfx/google.mp3'; String get ioPinballVoiceOver => 'assets/sfx/io_pinball_voice_over.mp3'; - String get plim => 'assets/sfx/plim.mp3'; } class Assets { diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index f87b05d1..07257fea 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:audioplayers/audioplayers.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; @@ -40,6 +42,7 @@ class PinballAudio { LoopSingleAudio? loopSingleAudio, PreCacheSingleAudio? preCacheSingleAudio, ConfigureAudioCache? configureAudioCache, + Random? seed, }) : _createAudioPool = createAudioPool ?? AudioPool.create, _playSingleAudio = playSingleAudio ?? FlameAudio.audioCache.play, _loopSingleAudio = loopSingleAudio ?? FlameAudio.audioCache.loop, @@ -48,7 +51,8 @@ class PinballAudio { _configureAudioCache = configureAudioCache ?? ((AudioCache a) { a.prefix = ''; - }); + }), + _seed = seed ?? Random(); final CreateAudioPool _createAudioPool; @@ -60,14 +64,24 @@ class PinballAudio { final ConfigureAudioCache _configureAudioCache; - late AudioPool _scorePool; + final Random _seed; + + late AudioPool _bumperAPool; + + late AudioPool _bumperBPool; /// Loads the sounds effects into the memory Future load() async { _configureAudioCache(FlameAudio.audioCache); - _scorePool = await _createAudioPool( - _prefixFile(Assets.sfx.plim), + _bumperAPool = await _createAudioPool( + _prefixFile(Assets.sfx.bumperA), + maxPlayers: 4, + prefix: '', + ); + + _bumperBPool = await _createAudioPool( + _prefixFile(Assets.sfx.bumperB), maxPlayers: 4, prefix: '', ); @@ -79,9 +93,9 @@ class PinballAudio { ]); } - /// Plays the basic score sound - void score() { - _scorePool.start(); + /// Plays a random bumper sfx. + void bumper() { + (_seed.nextBool() ? _bumperAPool : _bumperBPool).start(volume: 0.6); } /// Plays the google word bonus diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 9d6dff98..916d0f34 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -1,4 +1,6 @@ // ignore_for_file: prefer_const_constructors, one_member_abstracts +import 'dart:math'; + import 'package:audioplayers/audioplayers.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; @@ -39,6 +41,8 @@ abstract class _PreCacheSingleAudio { class _MockPreCacheSingleAudio extends Mock implements _PreCacheSingleAudio {} +class _MockRandom extends Mock implements Random {} + void main() { group('PinballAudio', () { late _MockCreateAudioPool createAudioPool; @@ -46,6 +50,7 @@ void main() { late _MockPlaySingleAudio playSingleAudio; late _MockLoopSingleAudio loopSingleAudio; late _PreCacheSingleAudio preCacheSingleAudio; + late Random seed; late PinballAudio audio; setUpAll(() { @@ -74,12 +79,15 @@ void main() { preCacheSingleAudio = _MockPreCacheSingleAudio(); when(() => preCacheSingleAudio.onCall(any())).thenAnswer((_) async {}); + seed = _MockRandom(); + audio = PinballAudio( configureAudioCache: configureAudioCache.onCall, createAudioPool: createAudioPool.onCall, playSingleAudio: playSingleAudio.onCall, loopSingleAudio: loopSingleAudio.onCall, preCacheSingleAudio: preCacheSingleAudio.onCall, + seed: seed, ); }); @@ -88,12 +96,20 @@ void main() { }); group('load', () { - test('creates the score pool', () async { + test('creates the bumpers pools', () async { await audio.load(); verify( () => createAudioPool.onCall( - 'packages/pinball_audio/${Assets.sfx.plim}', + 'packages/pinball_audio/${Assets.sfx.bumperA}', + maxPlayers: 4, + prefix: '', + ), + ).called(1); + + verify( + () => createAudioPool.onCall( + 'packages/pinball_audio/${Assets.sfx.bumperB}', maxPlayers: 4, prefix: '', ), @@ -137,22 +153,52 @@ void main() { }); }); - group('score', () { - test('plays the score sound pool', () async { - final audioPool = _MockAudioPool(); - when(audioPool.start).thenAnswer((_) async => () {}); + group('bumper', () { + late AudioPool bumperAPool; + late AudioPool bumperBPool; + + setUp(() { + bumperAPool = _MockAudioPool(); + when(() => bumperAPool.start(volume: any(named: 'volume'))) + .thenAnswer((_) async => () {}); when( () => createAudioPool.onCall( - any(), + 'packages/pinball_audio/${Assets.sfx.bumperA}', maxPlayers: any(named: 'maxPlayers'), prefix: any(named: 'prefix'), ), - ).thenAnswer((_) async => audioPool); + ).thenAnswer((_) async => bumperAPool); - await audio.load(); - audio.score(); + bumperBPool = _MockAudioPool(); + when(() => bumperBPool.start(volume: any(named: 'volume'))) + .thenAnswer((_) async => () {}); + when( + () => createAudioPool.onCall( + 'packages/pinball_audio/${Assets.sfx.bumperB}', + maxPlayers: any(named: 'maxPlayers'), + prefix: any(named: 'prefix'), + ), + ).thenAnswer((_) async => bumperBPool); + }); + + group('when seed is true', () { + test('plays the bumper A sound pool', () async { + when(seed.nextBool).thenReturn(true); + await audio.load(); + audio.bumper(); + + verify(() => bumperAPool.start(volume: 0.6)).called(1); + }); + }); + + group('when seed is false', () { + test('plays the bumper B sound pool', () async { + when(seed.nextBool).thenReturn(false); + await audio.load(); + audio.bumper(); - verify(audioPool.start).called(1); + verify(() => bumperBPool.start(volume: 0.6)).called(1); + }); }); }); diff --git a/test/game/components/scoring_behavior_test.dart b/test/game/components/scoring_behavior_test.dart index 485183aa..3e0f7fb4 100644 --- a/test/game/components/scoring_behavior_test.dart +++ b/test/game/components/scoring_behavior_test.dart @@ -90,20 +90,6 @@ void main() { }, ); - flameBlocTester.testGameWidget( - 'plays score sound', - setUp: (game, tester) async { - final scoringBehavior = ScoringBehavior(points: Points.oneMillion); - await parent.add(scoringBehavior); - final canvas = ZCanvasComponent(children: [parent]); - await game.ensureAdd(canvas); - - scoringBehavior.beginContact(ball, _MockContact()); - - verify(audio.score).called(1); - }, - ); - flameBlocTester.testGameWidget( "adds a ScoreComponent at Ball's position with points", setUp: (game, tester) async { @@ -130,4 +116,57 @@ void main() { ); }); }); + + group('BumperScoringBehavior', () { + group('beginContact', () { + late GameBloc bloc; + late PinballAudio audio; + late Ball ball; + late BodyComponent parent; + + setUp(() { + audio = _MockPinballAudio(); + ball = _MockBall(); + final ballBody = _MockBody(); + when(() => ball.body).thenReturn(ballBody); + when(() => ballBody.position).thenReturn(Vector2.all(4)); + + parent = _TestBodyComponent(); + }); + + final flameBlocTester = FlameBlocTester( + gameBuilder: () => EmptyPinballTestGame( + audio: audio, + ), + blocBuilder: () { + bloc = _MockGameBloc(); + const state = GameState( + score: 0, + multiplier: 1, + rounds: 3, + bonusHistory: [], + ); + whenListen(bloc, Stream.value(state), initialState: state); + return bloc; + }, + assets: assets, + ); + + flameBlocTester.testGameWidget( + 'plays bumper sound', + setUp: (game, tester) async { + final scoringBehavior = BumperScoringBehavior( + points: Points.oneMillion, + ); + await parent.add(scoringBehavior); + final canvas = ZCanvasComponent(children: [parent]); + await game.ensureAdd(canvas); + + scoringBehavior.beginContact(ball, _MockContact()); + + verify(audio.bumper).called(1); + }, + ); + }); + }); } From 82588602ebc04c450bf227561d315571f82d5441 Mon Sep 17 00:00:00 2001 From: Jochum van der Ploeg Date: Tue, 3 May 2022 22:31:04 +0200 Subject: [PATCH 6/7] fix: use both flippers on mobile (#318) Co-authored-by: Tom Arra --- lib/game/pinball_game.dart | 18 +++++++++--------- test/game/pinball_game_test.dart | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index bd29e4e8..0cd130ca 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -18,7 +18,7 @@ class PinballGame extends PinballForge2DGame FlameBloc, HasKeyboardHandlerComponents, Controls<_GameBallsController>, - TapDetector { + MultiTouchTapDetector { PinballGame({ required this.characterTheme, required this.audio, @@ -80,7 +80,7 @@ class PinballGame extends PinballForge2DGame BoardSide? focusedBoardSide; @override - void onTapDown(TapDownInfo info) { + void onTapDown(int pointerId, TapDownInfo info) { if (info.raw.kind == PointerDeviceKind.touch) { final rocket = descendants().whereType().first; final bounds = rocket.topLeftPosition & rocket.size; @@ -98,19 +98,19 @@ class PinballGame extends PinballForge2DGame } } - super.onTapDown(info); + super.onTapDown(pointerId, info); } @override - void onTapUp(TapUpInfo info) { + void onTapUp(int pointerId, TapUpInfo info) { _moveFlippersDown(); - super.onTapUp(info); + super.onTapUp(pointerId, info); } @override - void onTapCancel() { + void onTapCancel(int pointerId) { _moveFlippersDown(); - super.onTapCancel(); + super.onTapCancel(pointerId); } void _moveFlippersDown() { @@ -181,8 +181,8 @@ class DebugPinballGame extends PinballGame with FPSCounter { } @override - void onTapUp(TapUpInfo info) { - super.onTapUp(info); + void onTapUp(int pointerId, TapUpInfo info) { + super.onTapUp(pointerId, info); if (info.raw.kind == PointerDeviceKind.mouse) { final ball = ControlledBall.debug() diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 884037f4..b85dba5c 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -323,7 +323,7 @@ void main() { (flipper) => flipper.side == BoardSide.left, ); - game.onTapDown(tapDownEvent); + game.onTapDown(0, tapDownEvent); expect(flippers.first.body.linearVelocity.y, isNegative); }); @@ -346,7 +346,7 @@ void main() { (flipper) => flipper.side == BoardSide.right, ); - game.onTapDown(tapDownEvent); + game.onTapDown(0, tapDownEvent); expect(flippers.first.body.linearVelocity.y, isNegative); }); @@ -369,14 +369,14 @@ void main() { (flipper) => flipper.side == BoardSide.left, ); - game.onTapDown(tapDownEvent); + game.onTapDown(0, tapDownEvent); expect(flippers.first.body.linearVelocity.y, isNegative); final tapUpEvent = _MockTapUpInfo(); when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); - game.onTapUp(tapUpEvent); + game.onTapUp(0, tapUpEvent); await game.ready(); expect(flippers.first.body.linearVelocity.y, isPositive); @@ -400,11 +400,11 @@ void main() { (flipper) => flipper.side == BoardSide.left, ); - game.onTapDown(tapDownEvent); + game.onTapDown(0, tapDownEvent); expect(flippers.first.body.linearVelocity.y, isNegative); - game.onTapCancel(); + game.onTapCancel(0); expect(flippers.first.body.linearVelocity.y, isPositive); }); @@ -426,7 +426,7 @@ void main() { final plunger = game.descendants().whereType().first; - game.onTapDown(tapDownEvent); + game.onTapDown(0, tapDownEvent); game.update(1); @@ -452,7 +452,7 @@ void main() { final previousBalls = game.descendants().whereType().toList(); - game.onTapUp(tapUpEvent); + game.onTapUp(0, tapUpEvent); await game.ready(); expect( From 182e8f56cb8aee5c951e86c16259c61d9d78dce1 Mon Sep 17 00:00:00 2001 From: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Date: Tue, 3 May 2022 15:40:34 -0500 Subject: [PATCH 7/7] feat: implemented `Flapper` (#312) * feat: add flapper * chore: add assets to pinball game test * fix: add mocks in file * test: check animation onComplete * fix: image cache in test * Update packages/pinball_components/lib/src/components/flapper/flapper.dart * style: commas and userData removal * refactor: make launcher tests more robust * refactor: removed children parameter Co-authored-by: alestiago --- lib/game/components/launcher.dart | 1 + lib/game/game_assets.dart | 3 + .../assets/images/flapper/back-support.png | Bin 0 -> 1474 bytes .../assets/images/flapper/flap.png | Bin 0 -> 31117 bytes .../assets/images/flapper/front-support.png | Bin 0 -> 1540 bytes .../lib/gen/assets.gen.dart | 17 ++ .../lib/src/components/components.dart | 1 + .../flapper/behaviors/behaviors.dart | 1 + .../behaviors/flapper_spinning_behavior.dart | 15 ++ .../lib/src/components/flapper/flapper.dart | 215 ++++++++++++++++++ .../lib/src/components/launch_ramp.dart | 70 +----- .../lib/src/components/z_indexes.dart | 6 + packages/pinball_components/pubspec.yaml | 1 + .../flapper_spinning_behavior_test.dart | 53 +++++ .../src/components/flapper/flapper_test.dart | 100 ++++++++ .../src/components/golden/flapper/end.png | Bin 0 -> 26826 bytes .../src/components/golden/flapper/middle.png | Bin 0 -> 28444 bytes .../src/components/golden/flapper/start.png | Bin 0 -> 26812 bytes .../test/src/components/launch_ramp_test.dart | 11 +- test/game/components/launcher_test.dart | 85 +++++++ test/game/pinball_game_test.dart | 3 + 21 files changed, 523 insertions(+), 59 deletions(-) create mode 100644 packages/pinball_components/assets/images/flapper/back-support.png create mode 100644 packages/pinball_components/assets/images/flapper/flap.png create mode 100644 packages/pinball_components/assets/images/flapper/front-support.png create mode 100644 packages/pinball_components/lib/src/components/flapper/behaviors/behaviors.dart create mode 100644 packages/pinball_components/lib/src/components/flapper/behaviors/flapper_spinning_behavior.dart create mode 100644 packages/pinball_components/lib/src/components/flapper/flapper.dart create mode 100644 packages/pinball_components/test/src/components/flapper/behaviors/flapper_spinning_behavior_test.dart create mode 100644 packages/pinball_components/test/src/components/flapper/flapper_test.dart create mode 100644 packages/pinball_components/test/src/components/golden/flapper/end.png create mode 100644 packages/pinball_components/test/src/components/golden/flapper/middle.png create mode 100644 packages/pinball_components/test/src/components/golden/flapper/start.png create mode 100644 test/game/components/launcher_test.dart diff --git a/lib/game/components/launcher.dart b/lib/game/components/launcher.dart index ffac6507..da1a3569 100644 --- a/lib/game/components/launcher.dart +++ b/lib/game/components/launcher.dart @@ -12,6 +12,7 @@ class Launcher extends Component { : super( children: [ LaunchRamp(), + Flapper(), ControlledPlunger(compressionDistance: 9.2) ..initialPosition = Vector2(41.2, 43.7), RocketSpriteComponent()..position = Vector2(43, 62.3), diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 2a847ce0..22c1c2d6 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -130,6 +130,9 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.score.twentyThousand.keyName), images.load(components.Assets.images.score.twoHundredThousand.keyName), images.load(components.Assets.images.score.oneMillion.keyName), + images.load(components.Assets.images.flapper.backSupport.keyName), + images.load(components.Assets.images.flapper.frontSupport.keyName), + images.load(components.Assets.images.flapper.flap.keyName), images.load(dashTheme.leaderboardIcon.keyName), images.load(sparkyTheme.leaderboardIcon.keyName), images.load(androidTheme.leaderboardIcon.keyName), diff --git a/packages/pinball_components/assets/images/flapper/back-support.png b/packages/pinball_components/assets/images/flapper/back-support.png new file mode 100644 index 0000000000000000000000000000000000000000..74b3ae842e9ee22b9a47a7cd0190e950cac08205 GIT binary patch literal 1474 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/flapper/front-support.png b/packages/pinball_components/assets/images/flapper/front-support.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b7ca1e31f198da05e454b51ef9a0a0420f3175 GIT binary patch literal 1540 zcmV+f2K)JmP)kPM-_&@e^u4K^yT!$=U@lNwk(p^ag1z)lnDdG z03;^Nc?aHtSICe7@4zEO%s?*y8f{1rV1hYb{NLZ=IOs4ee%~|fBw<$KFFtk z|M+X9PKxuJZ>?^A|AYDR`ui#M<`}{?I+mL5D0a*DiT(2Y@xOn|c)Iz&K#H^Z{LSzE za<;trvnHfC>k@4W3?rOw2gY$Eh7d`UJHt49JUssAA0Yde7x*i#baefl>Cu}%HEZIu zF}fH?=FGa5KJ{ep*$pEp_Or?A_RlS?moHb+%fku%;`)zbdvYRckwrdzEI#?~r<|WZ z!Eo>`l8~gPzj8OsuHAiYkTuJBKfnGHg_ttVW*mv(DP3daoY@W=P$sA-%HnL<&fokY zis7|DX?lDkb&GorWOtr!jkD1>r{&2`3=X)n8#BW=APupZo%}#yHhB$@)J(42QS4XX zNJeJO`4~7K#oz&OOduJufMiPD)$drdUR@d_OQD&pAGn1UGAJN@1}cJboJ<0>n1m@H z8e&Svpua>aIj+nUAdl^|K0(q#Qm3aO;1EfYcl zi%`>6{+l3cDjZP8Vt*Va$2VRLibvDbFW-|jk_@SVnzpid#1yL|oFm2(X_dN#Zkqbl z-7gB_0x0zBt05iTlDaxY&T*ROCdyuc_H5A98oGm7N~vFe7d7!KKvJ5l-?rGV-81f1 zlM^0 zLhKZp)h%n+>z9HQrd^t>9-?5S;KJ#_i{CkZa0jpwm8*`R(<+n(OS9w9FK@mSWbI-Z zoB7*d@|=N){H&&>0U0_xl8dC-g2q~|400^kBu&=ug6T^^pPJHT@g+WqrH|Qm{0+a!(=6!OB7y(1JEq5N&}uhk8k&x<%NV z6tY&aU%pFNOfG<=CN|UcLs?9v%dL8xz_%qj-vA|zzBgAtJxG3UxZ+G9HMgu;T)7B} z^GWK~_a(D~OA|o5ecvNRq@lvwLtmAITD7Pmq7a+o(9dsP09n624$Zf2?`2vR*ntnF z$K7yd#ibc*I*Wr#0he$hqA4aDx=HF62ZuO-LU**Xs3|z^;O-SxAkdYKd%%659EbOV zP{=`YoCLl@@({b#H5BZ{h*Hy`Asq~|F5`!9JJ6%O^A`UjAx&!o_x0XWoO6)L(yBvA zdv7TqOPyr#pk6{9+N#kHK#fMl>)eMbdj~ei%aC^jZb;i!wZ*OOPztFRSn)WX>zE=8 zDILxW0PeHm3SQ%OuM?L#Bthjs_K30#Ll3n-QI;&FMae*`-wUSL+)IDD#VG3P2I++*# zM*E&9jaz|xQ&p(@%!fXLP^Xq7+o2E=$~*^hPwf6Owe4?0h^_n9Bn*<=vmBG;GMUDl zak7L-Lhi27qXiR?RlSZeM;|!<6Abx<7cq-RF?L5u7KA%UDpRynLiM-vOqXUR_gYPv q_GduJ$YW-A{^Wf3^rKV0$?Jc6df?ojf!$~T0000 const $AssetsImagesBoundaryGen(); $AssetsImagesDashGen get dash => const $AssetsImagesDashGen(); $AssetsImagesDinoGen get dino => const $AssetsImagesDinoGen(); + $AssetsImagesFlapperGen get flapper => const $AssetsImagesFlapperGen(); $AssetsImagesFlipperGen get flipper => const $AssetsImagesFlipperGen(); $AssetsImagesGoogleWordGen get googleWord => const $AssetsImagesGoogleWordGen(); @@ -133,6 +134,22 @@ class $AssetsImagesDinoGen { const AssetGenImage('assets/images/dino/top-wall.png'); } +class $AssetsImagesFlapperGen { + const $AssetsImagesFlapperGen(); + + /// File path: assets/images/flapper/back-support.png + AssetGenImage get backSupport => + const AssetGenImage('assets/images/flapper/back-support.png'); + + /// File path: assets/images/flapper/flap.png + AssetGenImage get flap => + const AssetGenImage('assets/images/flapper/flap.png'); + + /// File path: assets/images/flapper/front-support.png + AssetGenImage get frontSupport => + const AssetGenImage('assets/images/flapper/front-support.png'); +} + class $AssetsImagesFlipperGen { const $AssetsImagesFlipperGen(); diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 6e79ac56..d3d4253b 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -14,6 +14,7 @@ export 'dash_animatronic.dart'; export 'dash_nest_bumper/dash_nest_bumper.dart'; export 'dino_walls.dart'; export 'fire_effect.dart'; +export 'flapper/flapper.dart'; export 'flipper.dart'; export 'google_letter/google_letter.dart'; export 'initial_position.dart'; diff --git a/packages/pinball_components/lib/src/components/flapper/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/flapper/behaviors/behaviors.dart new file mode 100644 index 00000000..573578e5 --- /dev/null +++ b/packages/pinball_components/lib/src/components/flapper/behaviors/behaviors.dart @@ -0,0 +1 @@ +export 'flapper_spinning_behavior.dart'; diff --git a/packages/pinball_components/lib/src/components/flapper/behaviors/flapper_spinning_behavior.dart b/packages/pinball_components/lib/src/components/flapper/behaviors/flapper_spinning_behavior.dart new file mode 100644 index 00000000..9a4e2a99 --- /dev/null +++ b/packages/pinball_components/lib/src/components/flapper/behaviors/flapper_spinning_behavior.dart @@ -0,0 +1,15 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class FlapperSpinningBehavior extends ContactBehavior { + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + if (other is! Ball) return; + parent.parent?.firstChild()?.playing = true; + } +} diff --git a/packages/pinball_components/lib/src/components/flapper/flapper.dart b/packages/pinball_components/lib/src/components/flapper/flapper.dart new file mode 100644 index 00000000..f336273e --- /dev/null +++ b/packages/pinball_components/lib/src/components/flapper/flapper.dart @@ -0,0 +1,215 @@ +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/flapper/behaviors/behaviors.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +/// {@template flapper} +/// Flap to let a [Ball] out of the [LaunchRamp] and to prevent [Ball]s from +/// going back in. +/// {@endtemplate} +class Flapper extends Component { + /// {@macro flapper} + Flapper() + : super( + children: [ + FlapperEntrance( + children: [ + FlapperSpinningBehavior(), + ], + )..initialPosition = Vector2(4, -69.3), + _FlapperStructure(), + _FlapperExit()..initialPosition = Vector2(-0.6, -33.8), + _BackSupportSpriteComponent(), + _FrontSupportSpriteComponent(), + FlapSpriteAnimationComponent(), + ], + ); + + /// Creates a [Flapper] without any children. + /// + /// This can be used for testing [Flapper]'s behaviors in isolation. + @visibleForTesting + Flapper.test(); +} + +/// {@template flapper_entrance} +/// Sensor used in [FlapperSpinningBehavior] to animate +/// [FlapSpriteAnimationComponent]. +/// {@endtemplate} +class FlapperEntrance extends BodyComponent with InitialPosition, Layered { + /// {@macro flapper_entrance} + FlapperEntrance({ + Iterable? children, + }) : super( + children: children, + renderBody: false, + ) { + layer = Layer.launcher; + } + + @override + Body createBody() { + final shape = EdgeShape() + ..set( + Vector2.zero(), + Vector2(0, 3.2), + ); + final fixtureDef = FixtureDef( + shape, + isSensor: true, + ); + final bodyDef = BodyDef(position: initialPosition); + return world.createBody(bodyDef)..createFixture(fixtureDef); + } +} + +class _FlapperStructure extends BodyComponent with Layered { + _FlapperStructure() : super(renderBody: false) { + layer = Layer.board; + } + + List _createFixtureDefs() { + final leftEdgeShape = EdgeShape() + ..set( + Vector2(1.9, -69.3), + Vector2(1.9, -66), + ); + + final bottomEdgeShape = EdgeShape() + ..set( + leftEdgeShape.vertex2, + Vector2(3.9, -66), + ); + + return [ + FixtureDef(leftEdgeShape), + FixtureDef(bottomEdgeShape), + ]; + } + + @override + Body createBody() { + final body = world.createBody(BodyDef()); + _createFixtureDefs().forEach(body.createFixture); + return body; + } +} + +class _FlapperExit extends LayerSensor { + _FlapperExit() + : super( + insideLayer: Layer.launcher, + outsideLayer: Layer.board, + orientation: LayerEntranceOrientation.down, + insideZIndex: ZIndexes.ballOnLaunchRamp, + outsideZIndex: ZIndexes.ballOnBoard, + ) { + layer = Layer.launcher; + } + + @override + Shape get shape => PolygonShape() + ..setAsBox( + 1.7, + 0.1, + initialPosition, + 1.5708, + ); +} + +/// {@template flap_sprite_animation_component} +/// Flap suspended between supports that animates to let the [Ball] exit the +/// [LaunchRamp]. +/// {@endtemplate} +@visibleForTesting +class FlapSpriteAnimationComponent extends SpriteAnimationComponent + with HasGameRef, ZIndex { + /// {@macro flap_sprite_animation_component} + FlapSpriteAnimationComponent() + : super( + anchor: Anchor.center, + position: Vector2(2.8, -70.7), + playing: false, + ) { + zIndex = ZIndexes.flapper; + } + + @override + Future onLoad() async { + await super.onLoad(); + + final spriteSheet = gameRef.images.fromCache( + Assets.images.flapper.flap.keyName, + ); + + const amountPerRow = 14; + const amountPerColumn = 1; + final textureSize = Vector2( + spriteSheet.width / amountPerRow, + spriteSheet.height / amountPerColumn, + ); + size = textureSize / 10; + + animation = SpriteAnimation.fromFrameData( + spriteSheet, + SpriteAnimationData.sequenced( + amount: amountPerRow * amountPerColumn, + amountPerRow: amountPerRow, + stepTime: 1 / 24, + textureSize: textureSize, + loop: false, + ), + )..onComplete = () { + animation?.reset(); + playing = false; + }; + } +} + +class _BackSupportSpriteComponent extends SpriteComponent + with HasGameRef, ZIndex { + _BackSupportSpriteComponent() + : super( + anchor: Anchor.center, + position: Vector2(2.95, -70.6), + ) { + zIndex = ZIndexes.flapperBack; + } + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.flapper.backSupport.keyName, + ), + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} + +class _FrontSupportSpriteComponent extends SpriteComponent + with HasGameRef, ZIndex { + _FrontSupportSpriteComponent() + : super( + anchor: Anchor.center, + position: Vector2(2.9, -67.6), + ) { + zIndex = ZIndexes.flapperFront; + } + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.flapper.frontSupport.keyName, + ), + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} diff --git a/packages/pinball_components/lib/src/components/launch_ramp.dart b/packages/pinball_components/lib/src/components/launch_ramp.dart index 4713c3a2..7dcc274e 100644 --- a/packages/pinball_components/lib/src/components/launch_ramp.dart +++ b/packages/pinball_components/lib/src/components/launch_ramp.dart @@ -1,7 +1,5 @@ // ignore_for_file: avoid_renaming_method_parameters -import 'dart:math' as math; - import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -17,8 +15,6 @@ class LaunchRamp extends Component { children: [ _LaunchRampBase(), _LaunchRampForegroundRailing(), - _LaunchRampExit()..initialPosition = Vector2(0.6, -34), - _LaunchRampCloseWall()..initialPosition = Vector2(4, -69.5), ], ); } @@ -109,8 +105,10 @@ class _LaunchRampBaseSpriteComponent extends SpriteComponent with HasGameRef { Future onLoad() async { await super.onLoad(); - final sprite = await gameRef.loadSprite( - Assets.images.launchRamp.ramp.keyName, + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.launchRamp.ramp.keyName, + ), ); this.sprite = sprite; size = sprite.originalSize / 10; @@ -125,8 +123,10 @@ class _LaunchRampBackgroundRailingSpriteComponent extends SpriteComponent Future onLoad() async { await super.onLoad(); - final sprite = await gameRef.loadSprite( - Assets.images.launchRamp.backgroundRailing.keyName, + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.launchRamp.backgroundRailing.keyName, + ), ); this.sprite = sprite; size = sprite.originalSize / 10; @@ -190,8 +190,10 @@ class _LaunchRampForegroundRailingSpriteComponent extends SpriteComponent Future onLoad() async { await super.onLoad(); - final sprite = await gameRef.loadSprite( - Assets.images.launchRamp.foregroundRailing.keyName, + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.launchRamp.foregroundRailing.keyName, + ), ); this.sprite = sprite; size = sprite.originalSize / 10; @@ -199,51 +201,3 @@ class _LaunchRampForegroundRailingSpriteComponent extends SpriteComponent position = Vector2(22.8, 0.5); } } - -class _LaunchRampCloseWall extends BodyComponent with InitialPosition, Layered { - _LaunchRampCloseWall() : super(renderBody: false) { - layer = Layer.board; - } - - @override - Body createBody() { - final shape = EdgeShape()..set(Vector2.zero(), Vector2(0, 3)); - - final fixtureDef = FixtureDef(shape); - - final bodyDef = BodyDef() - ..userData = this - ..position = initialPosition; - - return world.createBody(bodyDef)..createFixture(fixtureDef); - } -} - -/// {@template launch_ramp_exit} -/// [LayerSensor] with [Layer.launcher] to filter [Ball]s exiting the -/// [LaunchRamp]. -/// {@endtemplate} -class _LaunchRampExit extends LayerSensor { - /// {@macro launch_ramp_exit} - _LaunchRampExit() - : super( - insideLayer: Layer.launcher, - outsideLayer: Layer.board, - orientation: LayerEntranceOrientation.down, - insideZIndex: ZIndexes.ballOnLaunchRamp, - outsideZIndex: ZIndexes.ballOnBoard, - ) { - layer = Layer.launcher; - } - - static final Vector2 _size = Vector2(1.6, 0.1); - - @override - Shape get shape => PolygonShape() - ..setAsBox( - _size.x, - _size.y, - initialPosition, - math.pi / 2, - ); -} diff --git a/packages/pinball_components/lib/src/components/z_indexes.dart b/packages/pinball_components/lib/src/components/z_indexes.dart index b8371273..a04402b5 100644 --- a/packages/pinball_components/lib/src/components/z_indexes.dart +++ b/packages/pinball_components/lib/src/components/z_indexes.dart @@ -45,6 +45,12 @@ abstract class ZIndexes { static const launchRampForegroundRailing = _above + ballOnLaunchRamp; + static const flapperBack = _above + outerBoundary; + + static const flapperFront = _above + flapper; + + static const flapper = _above + ballOnLaunchRamp; + static const plunger = _above + launchRamp; static const rocket = _below + bottomBoundary; diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index 61e62386..9716a526 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -88,6 +88,7 @@ flutter: - assets/images/multiplier/x5/ - assets/images/multiplier/x6/ - assets/images/score/ + - assets/images/flapper/ flutter_gen: line_length: 80 diff --git a/packages/pinball_components/test/src/components/flapper/behaviors/flapper_spinning_behavior_test.dart b/packages/pinball_components/test/src/components/flapper/behaviors/flapper_spinning_behavior_test.dart new file mode 100644 index 00000000..c53dc17b --- /dev/null +++ b/packages/pinball_components/test/src/components/flapper/behaviors/flapper_spinning_behavior_test.dart @@ -0,0 +1,53 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/flapper/behaviors/behaviors.dart'; + +import '../../../../helpers/helpers.dart'; + +class _MockBall extends Mock implements Ball {} + +class _MockContact extends Mock implements Contact {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final assets = [ + Assets.images.flapper.flap.keyName, + Assets.images.flapper.backSupport.keyName, + Assets.images.flapper.frontSupport.keyName, + ]; + final flameTester = FlameTester(() => TestGame(assets)); + + group( + 'FlapperSpinningBehavior', + () { + test('can be instantiated', () { + expect( + FlapperSpinningBehavior(), + isA(), + ); + }); + + flameTester.test( + 'beginContact plays the flapper animation', + (game) async { + final behavior = FlapperSpinningBehavior(); + final entrance = FlapperEntrance(); + final flap = FlapSpriteAnimationComponent(); + final flapper = Flapper.test(); + await flapper.addAll([entrance, flap]); + await entrance.add(behavior); + await game.ensureAdd(flapper); + + behavior.beginContact(_MockBall(), _MockContact()); + + expect(flap.playing, isTrue); + }, + ); + }, + ); +} diff --git a/packages/pinball_components/test/src/components/flapper/flapper_test.dart b/packages/pinball_components/test/src/components/flapper/flapper_test.dart new file mode 100644 index 00000000..497bb5f6 --- /dev/null +++ b/packages/pinball_components/test/src/components/flapper/flapper_test.dart @@ -0,0 +1,100 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/flapper/behaviors/behaviors.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +import '../../../helpers/helpers.dart'; + +void main() { + group('Flapper', () { + TestWidgetsFlutterBinding.ensureInitialized(); + final assets = [ + Assets.images.flapper.flap.keyName, + Assets.images.flapper.backSupport.keyName, + Assets.images.flapper.frontSupport.keyName, + ]; + final flameTester = FlameTester(() => TestGame(assets)); + + flameTester.test('loads correctly', (game) async { + final component = Flapper(); + await game.ensureAdd(component); + expect(game.contains(component), isTrue); + }); + + flameTester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + await game.images.loadAll(assets); + final canvas = ZCanvasComponent(children: [Flapper()]); + await game.ensureAdd(canvas); + game.camera + ..followVector2(Vector2(3, -70)) + ..zoom = 25; + await tester.pump(); + }, + verify: (game, tester) async { + const goldenFilePath = '../golden/flapper/'; + final flapSpriteAnimationComponent = game + .descendants() + .whereType() + .first + ..playing = true; + final animationDuration = + flapSpriteAnimationComponent.animation!.totalDuration(); + + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenFilePath}start.png'), + ); + + game.update(animationDuration * 0.25); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenFilePath}middle.png'), + ); + + game.update(animationDuration * 0.75); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenFilePath}end.png'), + ); + }, + ); + + flameTester.test('adds a FlapperSpiningBehavior to FlapperEntrance', + (game) async { + final flapper = Flapper(); + await game.ensureAdd(flapper); + + final flapperEntrance = flapper.firstChild()!; + expect( + flapperEntrance.firstChild(), + isNotNull, + ); + }); + + flameTester.test( + 'flap stops animating after animation completes', + (game) async { + final flapper = Flapper(); + await game.ensureAdd(flapper); + + final flapSpriteAnimationComponent = + flapper.firstChild()!; + + flapSpriteAnimationComponent.playing = true; + game.update( + flapSpriteAnimationComponent.animation!.totalDuration() + 0.1, + ); + + expect(flapSpriteAnimationComponent.playing, isFalse); + }, + ); + }); +} diff --git a/packages/pinball_components/test/src/components/golden/flapper/end.png b/packages/pinball_components/test/src/components/golden/flapper/end.png new file mode 100644 index 0000000000000000000000000000000000000000..31319b3710777445c2a9695341320fe4f7056f3b GIT binary patch literal 26826 zcmeHweO!`f+dtcLZ)Tk3G6P*d@NmSRBGxhlYBul6ct4LJ-dIi zEtRF4<_oYpn{B=>QAiQ+9!us_n3)n1V40EuA|h`h@Z-Wv?$4)vp7o6TkKglf{b8qc zab3rCoZsVne2?Qi!7o0F2wn5ihL=Df(3-FVAs>T4FMbLFy|8N4^Ojexk1YJf^3OBK zk3;u>S~#xLmS6sY+!OZ6D$9|-D)BrB^cE;A2Ix(4+2D?L5WnTZOY-<;mA zI{eWyvEHgRmbWY&Y>j+*2r4|b{>R6^Z2Gr1md76^_B^{hKL7IZ*Buaq(qWINahu%Q6-mLFC|;M_6!Bt|M7If`TK5I;6!TC^!_C zLx?_tfmQI`k0~9Ob#AYw-vQj>f|OuZ;yApGI;EYilfKN%kkgat1F| zU0dU~{goeCWp@o;i!TmTyuSJ`dlsFa^~sf0O*ag5Z|^-hiTO#5QYYpZ@~*@Yf}H&^ zRSWyJy#36IS~_6Ue0z1pF@O8Z3UxY8f5qV$2M8P>069S50D%Jpp#O;=`1^3P6CeP=W$+lW5}!v=MfbBA3so=h|yyiH!6dNjBZubE8hJvAaG95-wO3YB2A3#Eg5v zt@MJq8}Yuh`1u^6CTSEmm{qW-KBpPM8TZl*Q;oQcda@8`1sCQFx~ypXJcA*@lR*_8kbVHw$(+tgRF#R|TFV63%rRx`P zV?uwX2|v|qXA^8K&gxQIS4(pP1*QfPX;c-cG2J`m!{WEjX#4r1+G(1gh4gloh z$F;To5BU4{PA8;e0RupB9M?Jmek!j!^GAUw$8CVkU?>WBGo=W6Or?ndoH5&yXR`qP zCzR}C=yA`$h3zS&NstA&Ite4^&y-&Cr_!Z4{_zRG^Uj*){&mkwOx^B*Y=XmJ2`23vFo+kNf2mhFF>+S-4HaxpQ6q$p8Cm% zaQfWXNij0S!kL8&0493Y*vZ|tYC3`n0j3hf^{qba-PkZRK;tVroKUnuqp5ic_>Z&U zBKwpm%XjjE7uQMTn#sgcbyGu%i;i5YV5exZ#pE)`x@&jt z-!0avRk^2JgBy9VXb!4_P)bAP2xbIlpc@U*p5)lMA2u)PDz=UHwc7i)NG!lTk`^7 zKq2+MeNxH_fz_?|B{yuSvqsa%=m|83KZ6?chQSaygL4IE)haUA%5>bj_POzs=Nd83 z6_g;Fa%!SrBj2Y(1VU7{>zy20>QOC9JN^kU-Ls?ij%j%D&>Ddd(L`bkD0OhPC3UnK zQ;;or^Tp!@V%O;w@lxJAXpO5L%%>aA5aO_mTJWL{o^6_9R;v6XnbR4&xkVn147e~-*QmaJK(LdQu1e@yJAcm|!v+OF4%$R-CcgC$^!pp2&C-0n^6rk2x z-q7RzJoK-tfVTq2pAm}7W_rP0ENKt{CcVIYI9NUSV-+mBCbSXO0Z|R>f6%D%0>u%$ zsfHLKPE*;hmqLvK%_rhTsn~aze)7#XrZD!#<8z&?_6qpwc z>P|pi0vS%1t9x+|;5*IauT07UyP~1r^#s)%##>1EvS|qNm7F?i@lz#vikEb?JKpCNwOfII!L-9FdJPZuR>m+gm1;VRS2Vur^cv>iT-4qYl4_PQK zvQ`7*d%e3JoVi6|E{ICcA(5j^(sRMpQ61!lyx9?cf%db>wB6u#8jpQ-DVmGy?MhWK z!uSox71rUen(E^54;l38v6fN&m`p=$9vTQOX_&b~#+c4FrXpvr#f~B61|wSYP=(Si z=o*(TvU51+O?7_&uT*t@An8A6no?#43ig{}L#H`Y2jwYX0uRn`lW~TE_g$MZ#f|$~JM$x#EXH-!5+qIXb8#GTz9A`45W&+hkfoEdAi+piJMQdk@%V8r+oGT) zC&W1%WC=eXJen_3q%*uiwWP%`+QOl19z@3lC~KU4&pu+{u?h)R1yz!z`V%~9cA&-1 zN-|catZG5FtD*+;r6gz9Q*@d<$F~cKSDRsjV$+foddo^Qxn9k6b+jUPPq<+E??R() zpn?C%Cx^OWz9~M+W9tgAInwM0DDx}}m7OMSot#qt!1S^_0!Z=y$~57YgMYQ2&}qrJMHe>vQ|AIHP7j&)sJ6Mx1t zVNDb*{M_e>u+zH#-2Lp)J+;T(%3>FD-M(!VL7Xo}VPU!6E+Eji2Ue=4e;S{mX@H~y z$_+=js*SH=#YOsp&f-c!{*hZ~cSQ|8VlJ#&=F-1msMmiB0jpZgdZ%*`IDa&XOC?d{4!q8iTZ1!Cp!y8&)YS?X(dg%0P{L~Sn0LOdOP3} zUoKq%7(V@&lDZ_N%xCEOlv+d%tEs~mtzhMgy(Y2^ME8b{?E|6x<<8C%(x|bwFMDv` zq#)a70;3o5@8yd9mAW`i8dbc8tRjoQ<^dvM{H|?fck$Vk<)Nn?5255%Q9X-_Zci9B zY(;AZVwqds*Jg={HxT*t{4w&741FqUb2N%h_MYUu3_QK}OV(bJ``_gnTITK1Ef>O$ zJVbiGU$S+wS#S18;-4nVx$a7y!qIPiv^{`O8M< zS4CH+YsDUQ6MTmD0o_T3WfsHBJNqck*hu*1*dXS*>0U&MY(0yC=Z+ZOjgBubfpb47 zRrS4og$3 zco2%uAo_5dFQ7w0j0ILl{LMOhJ=xp!yj?{#8K3jppZ9&&2OHJ=$I{nIg>#@v#=i?Qr^VH+97Hb2i&}*noIH|v@+>zRMA_I(8 z^kv8<_~4ogXTmkx;~_O(wXs8_iyj!b_9RnwEr~rdfl(*%60f&T%i7$E_~^y=2w)QN zsx@mk_1ln#T_Q*Oz1AOEmn&vRxxh1;ZtUInv+jWN&>Y{7BPioi5;Z0Bp8{Ul@tsw| zo_$U#ANI+RCb&lI-uoZ>py6F-lGn>if-}P2MjSPKd3v$q4qA&1LKi3_$s<6B=YD8+ zaDG9dDLj}v3({NITl=<=>3Hfu+xhbqgHv_Ro?n!0-xOUf;jT+6r<3ZqPLR0H<{Jd0 zKuAqCy~k{rv$o4_<=S-1Z1MlJvo$N9-;_~E5QU6 z);iS+yN5a+jZt}jIkAhQ!M5pgh3ARx(v3;vK7LxeGAq?Hx($u;pYsOpJ-hX=HBfaQ zRbX?Ano5KDPF2e%Z;}ZK5l6{mRA!R3QBqt(Era zDmy2nab$-G>pd{mHpQaj;ey;IPiL$bm2=_6(Hv`?jo%hmuhg!ao?BUpc-rx0`IvPrLYLJM z9GlUbz&$3y%&m@k103xFMe7Rl5x#%fm?g4LrMaC!Y{R^ld_0@=^VIN$5%hkI9U{YMYG%n5< zFc1eeS7vDzhspO3=+$X>hFeljWWhyFi$Lf7;94l^Y7E+AnC424zZqPkDDSAOSX@HE zxZU~S0QORC93>s8=C5C=6tr)32TtR1QHZ3IN$=D!(?R7=j>#+rx$Pzb{LS&>)R zFglkTSj-|)ap-D=o-y6o8&xBtk#Md_>{inz@UYw{{+jceb0&nuhIe%zgkzxF1e7yj zw8rnW4f{sNe}ytHoj6wjo$m!M3i-h939T#I&5M7`%aACK8`y+C*FtpF&pnKqhr}67 zg7`J$R-7_^*jp$PIgztthxx~@s&-)X!{jWDUSUeUBnMyaP_Bup44oe1)1${^oorN|?5KeSBoL%m0m>$_d!_LKa%?xLlRXcXOrVsPO z&wVe8#+gbk(hRMtK6TP1o+FyvBF{Kl&pAm!gg874jwzXu#DfGQF{knr* z@e-|aQmV=o<_m69SimFg4KgfJanOMZ`6b-`a)}!zvZYfoEt?!s47*w^E-ad~7em{! z`y;lV?R$vXV4fG4FJ6%wiIWl-Rgg8!Tof=}lKRo*Em)i@v_FT|JS}s>UP4gy3<-Ae z^-=uQET0I8dlCQcSrUih$EX*ZSvanL>0-tNVO~iuz7Mf#^8|Yfp?n5!#J4 z+#;J*pQn~JzbA9zB zYY`&fOC;OP(GW{}(JJAN-FM7iaTq3}dBEEF87JE=mOOPPe!@KW2$H3lmxK^KEJ#3Z zf+zocfj0ryuPtXUM$^_ORUQe4d+Gl^%pX1-xnE_?C4)R>1U%ks!fj1vSo==@+#Iw_*wup`+McQgZ^QN(ZTXV#OOpVN_3y27-==J#7UQD!H^HY)C<_nqEMF;D(nYZRzzl>f?zodRpj%6p2 z!E0G*$*DoKpQVYyMgGqsw!uw7yh8TWyDsQ!Ie^BQO;+0UU~OsR&y1HTXIz|`j8=`r z<2@>K^j(s&dT`*eRDD&Q2S3qgAutMsn!>i_UM}IqQT7IPiSoe%9Lc)L%~t88w3l5g zwnUBkKp>{Z%-f<#DG~C8SJ>^FLzG1BGgD-XStNN)qT&9z7y+A)uH>ZS8SY7vb<940 zpjkX#ZrcU?Qz(BD;z`jIfsc5G;Zh_oXj{N%;JzhQmimTaf&}6O%D(WM*tU$e^nL~M z!jV^};1H4da@zHaX3uVl0c4Op_&+HaL)S#zbuz8e`!*$IEa zUfF560Ixg~c*lt>pQ_2CXu&ao;_IjH${H^#$C|%e9UAGEp4kV-P&Cm*g#2)ji!vp+ zCJ}JnF*X}|g$yLW|di_dH~N!bN-!5uzy z{lixF-Cg=$>$h@msfneU>)}6HCd_T3L)Azy{*;E!r-K8BYvK=#67Mvgfo|hhb9)2g z6$~y_m|heGC2X@6*|Wdd%YDl(gM@qHX5>0u(Uw8Dfq|zYin1tbQm>Rk%lC^2LlXy* z(AE2kTXXyb_td#_Vl5-yY~kW=UUP3xV4^fmUw~0^EO41ouXENWtQc8>d|(K97khAIj7ui3cE6hw3Zud!IkgI%bh_OaeHviUjn}3bkB& zsgNhtL&&Ud^S){?!Ok#k7NuivS<7@b8+Gw>cP?zX(kgz_CY#*d-yUV=IP{E-KI z$-1F7E_IS@>FQ;oR9h^j;tn7!rh-IJd!sRO6#Zr>yQc4~yT`z_U4pXHaPC9l zHgfsUadw^2r%K2^+z5@oO~yDod+Ohc?)SQ`Rf_jZTW|8W29BasJ_N8OT6_QvGj6mO zB|b5(PqIjSN&WIrq>_B1e;^^y3F`!YT;wUe+d3CgJIb z#g`Mh(nH!Qcyb^8%iKVsoNNdd`5Rx}v}r+y7VO&X4a}^Q-P(6giew82vuislI2wjW zvT5K%DtK_1{|o0EQfG(qSeT{J#dn+VmeBUkn*#cXSIM4y|0M0sFAVdYy-JB-OsCkk z>9U9a6;B2SD6@69?WJiR>zIbIb8iB2FU^HZc~DMZ=hetuc5*OK2~ESB_;He}_iQfV z9rD<`sbE9K?l=uTRWZTmlfUS@hoC4SaWwW$Qps?x_y#Wz@T9woy<+4EVzn?57UL9l zd+u&Q-y59JiJ<@>4Bo(0^VGreFi{eB)i&*W+q8kb+BR*zc(lwL&ii*~aNyAkszh;3 zCZ!l^ARUX0@T~&6^xxWU;QGT2+d?y!vr!tbCghpd2w_JT%{--(kB`r)uMUNM1D|f$ zb37|z_j)e!W|Xzyv50<~J-Hznt=3NQc-!DAHEWUPobs!fnTG^1D@+L5}; z6DP4jntZm%@MCT^b9msG_aPoJscYdm2~sPUOmxuLRwtV`*f{yT&4&sv+HB6Zy|>M7 zF53;2Hv0%KQ;%8u`Ll-!PzE^8u#hJ*Xx=5!v~EWwY_KG#XhhFM4`0J@G5Cqx;9+7? zbgC0_P<$hLSnjq?Jc8){&X6zDOYe?})?x7M7f51eF^278t^3}!$v^+(k^kDNO*WsY zZ0AKw8jApo>CCbmPbe3;meKW)?DipDkshbnoG8gVfxXu{0HnMgciUZ!Hcx4LJ)3>r zf5e5D=4=M~@gBrN{4X|X>rY(v>3r~%Hajj3zy&z|1nwL@Uvi=4rvv9e>aZTK*oRdd z5xVS9M}%7UYgyg#-%sO?2z5m0qlgM|aEpUmmOSuB^sNIe4zxJX0(iiYLmfHv5f?ae z=*pKpJY7G@5kyZ4qBquUZ3Tf=eFXfCfG6-w0X3Bk>?Z+zw%9EBkrrSbfBNdmH*0KL z`NWOmEhLkot&JO?%Mg$r%q0xLx*%p4$7pI(@-g4UY(TAVqULKKtxYTLg8@FyPu#&aj_np^W ziro8B!Zu*3?VtR<1bWTvrPJ}~RoDOPm$zSWnZ5pxFK)d&dwuHlnAuCGvo9@~y?*P1 z&tICo{^&1TW-pKba(uz;^&5_d&zizv76)2pvET?IM{aqB1xLzt6pLq2aMVx-wRi>v z2jg-O(PvO_P-sVI@eB%%hRe~1K7)dzJ$FnkoZ`I!$o6F4<2#ZBUsHi7{ z%w0g8)3dVx|M7p3`WH#$GmY;UvWFPyg{;*fmuH2$#NscI@|JkEC4 zW7Ncwd2fmW6LGKDCAc34PEmoG#7y`x5`36I5$UHyrwF{=siyv>cs7EpWXKpXxZnp! z1JY-Ugv`TV7DA_=()y(^i^O)9%3Kj|-|xVen_r%nW^GokG5u41E>z2zKKF=;P}AE& zIQog;a##KcAQcRz^LmigMl^xtukFTXw;LYBAx(K@!YQsqjpF0S8RB9@o@Y;w$k6Sc ze>%k`-YrS^O#gVxO4NMdj4GnKw=s$Z?v-@8@Q6l~KWQ+I7=T!0Eo1yAvfV7VzOpV@ zXZty`{v80$s)G-mGMlh0Lw>X;VS3EDySGk4mDx}Z+@ERSsN35?rmGzdFT0|p+&DfpU`c8`S}e0JE!Nnd~LPqfup0_Y55+ooP7`C<90IOI3q3wSW`MXk+s(fv1fTd`zb12*|;cRF#g{A?to^Ch`r?s|`46N;!7AM8?s^Y4P@MLw;I9?aq z9tG6L$OL#qHACEN;A4ntHdh4Xcan^zzcZ#d_gPcNd=e9f3hjc??ttfI*7Adj;b*tk zSbq0x{#vn9LF?|#!)zq66Ub^L&8D%XL}VB?H&P5f2;3uiF_KiEB|;z#+zzdni#Xle z8MlUiNv(Kg1a5J?EhjSi@Ab5nXa_5#8OZ+r%U7XUXlXWC_boz5zZ{LN9~??-=#eJD zDj_ZVFw7_2go3hzFCYzV0A9mL#C?V&_M*!~ zaY#)gw@j$#ll2xfmztbMi9@0k1BNE8&Y)pJ^SQ~o5h6x0#83xNIAT&Hd|lnZg(0Koo8i@|R%0{&Fox6L7_}wQojCR2{fjhN-y@h$4G^chxh?-B&xw^jvpP| zvaI>x;rd!JS)^y(;iu+8ESgxx>6%K_q#l;6( z#ke1?-xP^c@7?RICV0qC7~i$S6R~N2({wX|5E$SFJ^#MKqIaj#sm{FjC8HAU0A2NI z9Yk-$EA&TDT3{GL#C66YDZ;G4HR_ELG69;uN+*pvgYz=_VOh$@S92At z9%=6YWmENVEwrt50utkjM=OW!BL*s#*>uJq$eVK#b8aI2C;dA2b^$We_Gl-0vz&T$ z*yP?;L2}RYD^GCCr~7Noxcvk;UR@OvBsF7g(YZD`5Qhn9V}O&P?tHY>>^wlnwpF9k z>s6mNQI$T7K&=g~YL8-O;`9mdv0`{NZL$qw9>Ri1*RlmmQsL!|CA2+oSIm~E;!IIL z=cbC2;Mw8cHI#S(5T~xPNio(jK0oB`S!CXVOH5|dZc~4KJX~Z_HupC^JyJ9{k`C^d zdYxvd&KMq?Rxx|xd^AMdehSlnLit{_+O@w36y?nFe>zkn#xs~V<=lr^m=QjmHY%99 zs~F$0iG&p(Gtks(cvD{51MPV%$`^^MSM#Mo@=ZDNYFy$PBO#G1w}JGypJ0CK$K0{i ztY$I^G1k&YjcgA)_K+VdxF#t=yU_W{sE*;?hNSq8D8VR^-_MCF_k|wL14kLqK6@l} z+@GTR)ZB*;HjX|WT9q!wfJEFt{Y1s|$(qDru}@)t3kC7uNWZJ!k5Yh%y~CMY8$8Sq zTVnD&&l{SuFH-u9YN*{wzD63sjv4zp{-WG57h^A=0!N$m_H)jU;XOE;Ci3b*TSTex zOb_l6F>wVclENyzSWMrm83gLp01B;~D6Q&Eint)|8p4h?o$W`%k^L*0Rjam0=`9|9y|OP0rb}>-%{1OWC6Ks!{S#lhZ4U-}><0Tk8uW{!YEW0$A1f zU`O03?@O}@DNWzV@Y>$LZC zO7yq1=iF~&*K^vu_s8dX>hHfD*4UZGt!_!kjaBbD zbZ%qiI~{>L2#@&vbydT!Aod0-A*>SLK0l)L=wI04{#N2WezmFT5N1OG?BNbez(dW1 zcKc1K7c-{p;)T3zQQK%jKUCCB1gHWO>lpx9LIf<#(OtIJK2DpMQy1S}`n)v^UHzP_ z{>w@g)MzKz5gZYape5FaKwTIpGRZdyby3}S?}8EBS{3;7PakOZ**aGKs($5>hh3f4 zfS}k5o;k%Jao5c#Q%M&J!xmaUXDHFPjRU5kzk(hOw+(NCZX`C6@H;mpKxF7&iDVJK z`AO+TUYOmA3k9HmL+qV%4*PdLk=j}LacZ5x?S^@DUsa!GptmX;Nt7;EZM;zF!=V_y z`nDTN`?v-1T_k5FktYPr`D0OjbVqfGYM0sX&rVH?% zY=P+Zg!~jx*ShSeuJ8JI`ntn(T7mb_;VdGb4mKY*OM(w?33vB3+y zxJ;60d$?0D0rJs0o6Sqq(#zmOAHKOEgc%gJckH+X8hZYWOm+7{B|uT1ZK zA^QcW%*AlV%`TqT`nLN<@j;Me-MxkyaVcOaC3Zj5RVOH-379vsbobioHg!A#2VCvX z{Pke9T@7wNeh$$8X>sR9l4~8uE_&_+);TiIkj7eqS;=Dbw664uz^=qmsD*9Pi^#?N zwzgd+{N2RQQsS+*q2-z@lkvREx>E4QJ%)~<-?}-S#RU{0G`eUn`_Vu+x&Av%Hm1`C zBEzQLYF25^vCJP265zc3wy+~&>iTwA{3@vRAf5>Xt+2iMmf^cO#p(}5_8(HX0137$ zM&?2zur|fqC+bU%h4=mXOhD$^CU5m-goeKoXy%4{BnZ2h zCAmMF4xu@l;%fpRp=~~b`r$I49oUyahF_DUM4|Oc>JQLE&dwq7pMtUO>X=IcVNk&K zyk2mx^3`aVoekeQr<%hj<|X3yNpO@@Vh&{o`q4r3GTF)iQrAtFmeEf&$|L8*;t^#- zno|4=Xv@@Bk*ekKha28c8xd#Y9@eOko1PIYe;6MQI#y;XZL)ph+r zqEErGT2H_JYH7oO*i(QGVFsQ!o06zevEE4#eT>k2K_kh#Ev3s?3}(XNNXW=9LtpEk zIA^!v)_+kw96OzX4^nFHEXe7Zz{<=Ek;gLQl{Zok3fItV%8a$B6f>` zkp>%RhBrLqgvE^7iY>*h2cp-5Plp|Q6pC5~F7w+@MGIm`@t5d~=8j|rXr01^50TS! z!wFlO3a{6l=ZMt3qhI;Z^qUJIE;$LSag69e=cr;_=QbA!{`PLnZ79t%mn9R0=MWY5 zmvo({jTXYxAbZNpjhnZypIbl!<8k&XJN8tExzVPD>h`if*wN(e(ZuL)1Yp0lwOz8_ z9>TUR04mMR{jt^A#L$YP>@UF+&Fjl=E3v~lNTh7&%2yW8;AC6P++F=9>Pcn1aLpl! zD5I)YtD0D}U2a+c^RLEz@H0mX+<)@U9TdRzHA89St4CpA(r@1@GHfq@jJx}1)R!(> z|0vt3VrIJm>FMjzYx!?#k7zvOyF5ojk!i8;n)tgw(OFtrBCCWUvVOil=uRm}_E4&n z@5GjY)6ue@6B0Ft?-fU{@CCldNLZoLYO(8@x*2fD(^>HHGe7Ra^}(e$szc8xuwP&cN^8&~~pMO6|gEV%BcImjjVh`YpmCnh_-v;?fW% z3SQHZ20bxVH36`(d!kZfE{y67K%y@e^Vkbkp*iXvE+Qc!=s5^8vIfGP5(hupQ*WRB zPv*@VF`aeU-Qg#eN_jNDUy9oD&9c@K5V&}4&Bv^*nc=bQ^n|-#>Iz5FB8dwShw(&$ zP%EpD9z`_t#L0?)-=4k^PI5K?7!iPm!$*K=-=5Ko#CAbnzw~K3slU%H2OGJ@PD54S ztKacNG6qoOn$c=t(?@`*lF`Fd$uQa2b5ueuq+^c((JJj`Tm3qUGN&`^2s@Jz6Kyta zo#KgqD!aHT$Ni$OR%Yh>qrjy7dR3z?p>At~351K_fp9)rY6uTsf6Sr?I4wDDp zSe|MlK`3=vHny3>5SVC{y)D%WfmFbWbXHtX)}{h zcs+=Pbj}g@?r6re`U{aFXS5t$s-_Ag_1Q~|+4wa`5fzgM<;J!LiNHVg-6^#VFw+4- z1~K&wyUWKW=WP4@Ax1lwBEFzjbg5(O(or=jOZm1*a?Tm?Z=uBDK7qev0ADX!H;O7N zAff_E7}Tkr6X4U`#&T9x4Ftk1OL3;G@Vl0;uqTVISbw0y0ZRAx-9sShrDcY zh$#B00MCjTOp+UahImvl8VBmH?H)Wt0d5ZTG8->@v-~T|o%w zkmrpL$KVVqUU>?|^3**^1E_Pl(|HkwWTdm8+Z$(^BF2~s5LQwevoHTmWCTm3e&WyH z_DDBo_8culwbNLIwSD=SXU+$(#-D3*76^7Q9;loUTdQL-jrErOJ4ng*wgLhmBwebbUOy-qv*u4r}9*76UL zwS|4=*KrCK^JFToAeE<;E#d{J@a_^_syWau%ou3iGvH6MqD*S9adNXHgZkZoHQjyv z7xf=l`8!{+#wLq&D_fu5_*QlO0GOHO33aD-W^*$Mey|n*lc!hZQm7EvC-m+Ru3DPG z9Vn()2wNZ{1KNqcz5!tP2mQ2{`=~{Qr$w^_Lh|+)F#ZhJQ*)+ zb+Kgx1b?kfx#QZ4e{RA92J=c?6@=x;2r8?)#yulh^CjfRO>9#0fyUXh0Aw#AFw)#F z1zNmqNq*axwT$lZ4)36Xbll}stvaDF2v!h20HMe`TD+9wRxxavmBy68h=9CLsOZP# zJrqc53)8Z5$!Z7+$iIWdovF~QB-fXfv14Q{Y$C!!%fGjRg@+-&XgAzANthYs$)3zt zzcM>E+ULgvym7e}Sq#pk%N*$4AOe22yjQ#VVuma&5rZv8M%X<*zPkqEt~O@30|QcH zY1FW^tC4E*AN7X`>0UhW^yI=#?Tp*>2y0e*rgl1`RF^PKy}}*t9w9~pHH@Ajfz9>B zIpAbX-O1DgYm-rNSx8I=7;55s;~2a`hUz?J=8IM6TJ8&mTz@DDy=dU{toNV%4#G8t zv?DCCd`b$7mPc8rIBBi1^|d$4-POJ0D4T|g^GKG8eZ8_ECWyIjaWV>-d=}ZXO`z}=HlmDXw+I7pU1U&Nnt^oqBNtODC4yeYrtqZ# z+Vs25_PvE$3tQ$Z@yvFY&b`^#Q$|a%HMJCiw+t^yaSP~Uepgw;@O24L+~nG_rwC?b z$CQnp@tPn21L$c_MTgRdC#USD1N8!FR^rhb2w80y9>V6ZE#5eNFE~k~ingxq3Z9uL zMEt3YBJX}{z(>Ftccw+thS8h5LvS#fuILw!k3 z#{M8_hqrC!UDL-9Y|Y5?L!U7=v%t`A8Ia2@{^c{XM@Cb#kCowy5_?L*c%a**50rm3v>EtX<|;f7CicPsBn2t3!Q0OL3CXjA@yT=VWb=NzHW86<( zX_saLf4-vOAC=)-6sap&U>;Kfn1@=It2|2^=&3e@Mc5fu;|hA9?+Ll-F|bsnZx(S} zLrNrgoS{1{+sZx)sjb!9=O@Rtpn10y>{zZow%w#5e#aFuYDILYZ8siuzNKe}`Gf~Z zaIoLU;EjR}U4Pqn)haw-F95Wyv@6wmAd2ZSNb~oyn}*G zku|Q#;p^4k;uc3+Kl65H8~hKiIiQpao3ekbH}p&8u+xlMNINpbwuQFdHc7SNK$^qb zEeZNPn<*gk76|{)cAZbIQa+*g9nc9M5ioK$xnPZ^;|jJc>?)IN69|IH)UJzfm*trD zPI-bzW!^`~tn$iUO&ClB=*J?mRV7F}r=JuW=eg~3a<6pjPIb3-*t(eMyOjkwL#?MO zu5uPVv88?~egw~`hQ;g`(Q>}_;aE>>)hE&7^4HuT)S&>pRk;BpZ2{7Jiv;{;yKnK5 zdH1dJry?z(P&AKr`~sB4u7bQbSQ6BuQ=O38EPsi12;WA-Q)( z+&){+Xq_I2t?7fAj+T}e(I)QLg_}pq&E1`RHZO64enhYa5BRwg+`6*d@Mka&2JD9# zxz4JA{LMq`g1u$b-RMjRsKCd-Pb~C;705?{W>gu8eQmAEza!gZXQZ7XYVV*94BBST z%VP<^e9f$$i)d0)TJbqq#a+R`8!{p(1DY=+= zt0l83uv<*MtJ#oW_Pz=Fg$@HRBbm5Q{R>;KiKMvc)Jl280Xe@^K;JsXj+Y77!BJ1m zeSG;uN?|j+UOzU{Z9KiqMm)1GQ)XDFV%eXXarTLG{OmI)5OIj`3o}%MIlC|!nysyt z8rk@(y!gNI;(q-Qc5*8Z;V&(5mSv%WPo5Rh7-S(!E$!0?fRWw}_DPQG?`eDfEqRW? zyA;L}x$u+8?N<+?wCYflb4#6EjB`5#szAZOu7XgFF9~b0+&Qbi!su!F@F^Lbd&bD= z6ol0DojmADCagwA(DGN!w|sNQWV0oPTBX$khglv~0>7IVGm{>0YoOmKSwv~sUN$!D zdchVe5T#|=n6qHXA+4>G0xT;v=fhhFVgnci%#5GrKbpx^a<#SLhAd%BCw@*D`4>})Ux@nmwf#5KB((c`X`kr8?d5+;-+T71!slU(T} zI!}{KAWP~p)h2nf(4OiiJLisa=N!d5HRp@$vvZC;&p93R(VXK@bHCQ$1e@&gI=PFv z`K!OdCF0FK3Au?k^Pm*h{34_Qdj=RSp$fJtqIt{LlEpW3g~R4pH$k&j-g1d*ibcA% z)a$XFhXyLpt1;(Wwc>((2{UJW|2{USD$RZ2oFiIq&-r-#1=@7B(Vgw$jYVo?#_9_) zxk_q6m5Pv(sSn!g@-qG6aR|<4Y{bL!?>f54G1 zkg!1#C!jmeZ1Gy@3hz9amOd`tuNYqNKsGv%X8n4^-z_?SJV9u`{ z9|1G>JMzr)Pb3|5+TLf*EJvQPpX#1j|9wEs+~No#M-crfXfgNIxy}Ib^$8ZaWmLJy z_Lh=YpBsDE^G~K6fBxMA#~n8L-4G5yH~`_~h=$)m;K-WK?BD=|0}%fkIK<15J63+U VHd$c*fAE}kh3@&NZu{q7{Xcy;edquH literal 0 HcmV?d00001 diff --git a/packages/pinball_components/test/src/components/golden/flapper/start.png b/packages/pinball_components/test/src/components/golden/flapper/start.png new file mode 100644 index 0000000000000000000000000000000000000000..e6da466a8cd77afdd08506bdabdd8d9f433b3e44 GIT binary patch literal 26812 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 TestGame(assets)); flameTester.test('loads correctly', (game) async { final component = LaunchRamp(); @@ -20,9 +26,12 @@ void main() { flameTester.testGameWidget( 'renders correctly', setUp: (game, tester) async { + await game.images.loadAll(assets); await game.ensureAdd(LaunchRamp()); game.camera.followVector2(Vector2.zero()); game.camera.zoom = 4.1; + await game.ready(); + await tester.pump(); }, verify: (game, tester) async { await expectLater( diff --git a/test/game/components/launcher_test.dart b/test/game/components/launcher_test.dart new file mode 100644 index 00000000..c76e6b7e --- /dev/null +++ b/test/game/components/launcher_test.dart @@ -0,0 +1,85 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball_components/pinball_components.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final assets = [ + Assets.images.launchRamp.ramp.keyName, + Assets.images.launchRamp.backgroundRailing.keyName, + Assets.images.launchRamp.foregroundRailing.keyName, + Assets.images.flapper.backSupport.keyName, + Assets.images.flapper.frontSupport.keyName, + Assets.images.flapper.flap.keyName, + Assets.images.plunger.plunger.keyName, + Assets.images.plunger.rocket.keyName, + ]; + final flameTester = FlameTester( + () => EmptyPinballTestGame(assets: assets), + ); + + group('Launcher', () { + flameTester.test( + 'loads correctly', + (game) async { + final launcher = Launcher(); + await game.ensureAdd(launcher); + + expect(game.contains(launcher), isTrue); + }, + ); + + group('loads', () { + flameTester.test( + 'a LaunchRamp', + (game) async { + final launcher = Launcher(); + await game.ensureAdd(launcher); + + final descendantsQuery = + launcher.descendants().whereType(); + expect(descendantsQuery.length, equals(1)); + }, + ); + + flameTester.test( + 'a Flapper', + (game) async { + final launcher = Launcher(); + await game.ensureAdd(launcher); + + final descendantsQuery = launcher.descendants().whereType(); + expect(descendantsQuery.length, equals(1)); + }, + ); + + flameTester.test( + 'a Plunger', + (game) async { + final launcher = Launcher(); + await game.ensureAdd(launcher); + + final descendantsQuery = launcher.descendants().whereType(); + expect(descendantsQuery.length, equals(1)); + }, + ); + + flameTester.test( + 'a RocketSpriteComponent', + (game) async { + final launcher = Launcher(); + await game.ensureAdd(launcher); + + final descendantsQuery = + launcher.descendants().whereType(); + expect(descendantsQuery.length, equals(1)); + }, + ); + }); + }); +} diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index b85dba5c..dd87fec0 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -124,6 +124,9 @@ void main() { Assets.images.sparky.bumper.b.dimmed.keyName, Assets.images.sparky.bumper.c.lit.keyName, Assets.images.sparky.bumper.c.dimmed.keyName, + Assets.images.flapper.flap.keyName, + Assets.images.flapper.backSupport.keyName, + Assets.images.flapper.frontSupport.keyName, ]; late GameBloc gameBloc;